一、词法结构

1、标识符

Javascript标识符必须以字母、下划线、$符号开头,后续字符可以是字母、数字、下滑线或$符号。C++标识符除了不能包含$符号外,规则与javascript一致。两者均区分大小写。

2、末尾分号

C++以分号作为语句末尾的标志。javascript语句末尾不是必须以分号作为结尾。javascript通常会以换行符作为语句的结束。但也有列外,有些场合下,如果当前行与下一行可以组成一个语句时,换行符不作为语句结束标志。除此之外,还有其他一些情况,javascript也不会把换行符认定为语句结束标志。因此,建议还是在语句末尾加上分号作为语句结束标志。

二、类型、值和变量

1、Javascript中主要数值类型是Number类型,它底层用64为浮点数表述数值,此外,javascript还包含一个BigInt类型,这种类型主要用于表示64位整数。在C++中数值区分整数类型与浮点数类型,整数类型又细分为short,int,long,longlong类型。浮点数又分为float及double类型

2、在Javascript中字符串类型表示的是一个16位值的不可修改序列。每个16位值都代表了一个unicode字符。它采用的是UTF-16编码方式。C++中字符串为char或wchar类型字符的一个数组,字符串以‘\0’结尾。字符串字面值是一个不可修改数组。C++标准库中包含string类用来表示字符串。它用来表示一个变长可修改字符串。

3、javascript中没有字符类型。C++字符类型为char类型或wchar类型,字符字面值用单引号及一个字符表示。

3、Javascript字符串字面值用双引号或单引号进行分界。C++中字符串字面值只能用双引号进行分界。

4、Javascript中包含null及undefined类型。在C++中不包含这两种类型。

5、Javascript中在声明变量时不需要指定变量的类型,在使用过程中也可以为变量赋任意类型的值。c++中,声明和定义变量时必须要指定变量类型。每个变量只能存储与它类型一致的数据。

6、Javascript不包含指针类型。但是个人认为当给一个变量赋值一个对象时,这个变量保存的是这个对象的地址(指针)。在判断两个对象类型的变量是否相等的时候,实际上比的是这两个变量存储的指针值是否相等。c++中有指针类型变量,一个指针类型的变量可以指向一个对象。

7、javascript中用let及const声明的变量具有块作用域,用var声明的变量具有函数作用域。在c++中全局变量具有全局作用域,局部变量具有块作用域。

8、javascript中数组实际上是一个对象。在C++中数组是一个基本类型,它表示的是在内存中连续存储的一个序列。数组类型的变量实际存储的是数组第一个元素的地址。

9、javascript中有一个全局对象,这个对象当解释器启动时就被自动创建了。这个对象包含了一些可以在程序任何地方使用的属性及方法。C++中没有这种自动生成的全局对象。但是可以手动定义。

三、表达式与操作符

1、javascript相等与不相等操作符分为两类,一个是严格相等(===)或严格不相等(!==)运算符,另一个是不严格相等(==)或不严格不相等运算符(!=)。不严格相等或不相等运算符在求值过程中可能会进行类型转换。C++中仅包含一种相等与不相等运算符。默认相等与不相等运算符类似于javascript严格相等与不相等运算符,但是C++支持运算符重载,可以自定义相等与不相等运算符的判断逻辑。

2、javascipt中逻辑与(&&)及逻辑或(||)操作符并不一定返回布尔类型值。它会返回子表达式的值。C++中逻辑(&&)与逻辑或(||)操作符总是返回布尔值。

3、javascript中typeof操作符返回一个表示运算数类型的字符串。C++中typeof运算符返回运算数的数据类型,typeof运算符可用于声明变量。

4、javascript中delete操作符用于删除对象的属性,或数组中的元素。c++中的delete操作符用于析构和释放由new操作符创建的数据。

5、c++中几乎所有运算符都可以重载。用户可以指定运算符对于特定类型对象的运算方式。javascript中不支持运算符重载。

四、函数

1、javascript中函数实际上是一个对象,它有自己的属性。c++中函数是一个命名了的代码块。

2、javascript中函数声明有两种形式,一个是以语句的形式进行声明,另外一种是作为表达式的形式进行声明。这两种方式的效果并不相同,语句形式的声明,实际上是创建了一个函数对象,并把这个对象赋给了一个变量,这个变量的名字就是声明语句中函数的标识符。表达式形式的声明也是创建了一个函数对象,这个对象是表达式的返回值。这种形式的声明并不要求一定给函数起名字。如果给函数命名了,那么这个标识符只能在函数体内部使用。C++中函数声明实际是告诉编译器函数的参数数量、类型及返回值类型。函数定义才是真正给出函数的本体。

3、javascript中允许函数嵌套声明,C++中不允许这种形式的声明与定义。

4、javascript由于允许嵌套声明,使得函数闭包需要重点理解。一个函数被定义时它就有一个指向作用域链的引用,当函数被调用时,他会创建一个关于它自己局部变量的作用域对象,并把这个对象加入到作用域链中。对于嵌套函数来说,当外层函数被调用时,它会被重新进行定义,此时新定义的内层函数引用的作用域链与外层函数相同。也就是说,每次外层函数被调用时,内层函数的作用域链都是不同的。当外层函数返回值为内层函数时,内层函数的作用域链包含外层函数的作用域对象。它仍然可以读写外层函数的局部变量。

5、javascript中,每个函数调用都包含一个调用上下文,也就是this值。this关键字可以在函数体内部使用,用来获取调用上下文。当函数作为对象的方法进行调用时,他的调用上下文就是这个对象本身。如果函数直接被调用,在非严格模式下,调用上下文为全局对象,在严格模式下,调用上下文为undefined。函数还可以通过自己的call(),apply()方法进行调用,此时调用上下文为第一个实参变量。c++中,只有在成员函数中才可以使用this指针间接获取调用成员函数的对象。

6、javascript中,函数调用时并不要求形参与实参数量是否一致。即便数量不一致,仍然可以正常调用函数。如果实参比形参数量少,剩余形参会被赋予undefined。如果实参比形参数量多,则多余的实参会被忽略。

7、javascript中,函数如果为prototype属性指定了一个对象,则这个函数对象可以作为构造函数进行使用。通过new 关键字可以创建对象。构造函数负责对新创建的对象进行初始化。C++中,与类同名的成员函数是构造函数,在对象创建后被调用,对新创建的对象进行初始化。

五、数组

1、javascript中数组实际上也是一个对象。它有自己的属性。可以通过Array()构造函数进行创建,也可以直接通过数组字面值进行创建。C++中数据是一个基本类型。不存在字面值形式。

2、javascript中数组是变长的,数组索引和对应的值实际上是数组对象的属性名及属性值。非负整数可以作为数组的索引。此外,数组还可以有其他名称的属性。javascript数组不用担心越界问题。C++中数组是定长的,数组定义后,长度是不能改变的。用大于数组长度的索引值访问数组会造成越界异常。数组索引只能是小于数组长度的非负整数。数组本身没有任何属性。

3、javascript中可以定义稀疏数组。C++中不支持稀疏数组。

4、javascript中由于数组实际上是对象,因此它具有一些实例方法及静态方法。这些方法可以对数组元素进行遍历,生成新的数组或者对原数组进行修改、排序。C++中数组没有属性,但是标准库中定义了一些泛型函数,可以对数组进行操作。

5、javascript中字符串实际上是一个类数组对象,可以用数组的泛化方法对其进行操作。C++中字符串实际上就是一个字符类型的数组。

6、javascript中如果某个对象具有length属性,且该属性满足一定要求,那么他就是一个类数组对象。数组对象的泛化方法也可以对这些类数组对象进行操作。C++中,可以用模板函数实现类似效果。只要被操作对象可以返回满足要求的迭代器即可。

7、javascript中数组存储的数据的类型可以不同。c++中数组存储的数据的类型必须相同。

六、类和对象

1、javascript中类指的是由原型创建的对象的集合。C++中类指的是一个自定义类型。通过类可以定义对象。

2、javascript中构造函数是类的公共标识,但是判断两个对象是否属于同一个类,是看它们是不是具有相同的原型。C++中类的标识符是类的公共标识。如果一个对象是通过某个类进行定义的,那么这个对象就是这个类的对象。

3、javascript中方法也是一个属性,只不过它的值是一个函数对象而已。c++中成员函数和普通函数相差无几,不同的是他有一个隐含的this参数。

4、javascript中可以通过构造函数定义对象。构造函数不属于类的一部分。构造函数具有自己的属性,其中最重要的属性就是prototype属性,它指定新创建的对象的原型也是prototype属性所引用的对象。原型对象有一个construct属性,他指向这个构造函数。c++中,构造函数属于类的成员函数,他没有属性。

5、javascript中对象从它的原型对象继承属性。c++中子类对象内部实际上包含一个基类对象。其中包含了基类对象的成员变量。可以直接通过子类对象调用基类的非私有成员函数。

6、javascript可以在运行时添加删除对象的属性。如果添加删除了原型的属性,那么由原型创建的对象的属性也会相应修改。C++在运行时不允许修改类的定义。

7、javascript中类的静态方法需要定义为构造函数的方法。c++中静态成员函数也是一个成员函数,只不过它不属于具体对象,而是属于类本身,不包含隐式传递的this指针参数。静态成员函数声明时需要加static关键字。

8、javascript中没有访问权限关键字,无法指定属性为私有的,或者是受保护的。c++中可以在类定义时指定某些成员函数或成员变量是私有的或者是受保护的。

9、javascript中几乎所有对象的直接或间接原型都是Object.prototype。C++中类没有默认的公共的基类。

10、javascript中可以使用instanceof操作符,判断一个对象是否属于某个类。c++中很难确定一个对象是否属于某个类。对于具有虚函数的类的对象可以通过dynamic_cast,或者typeid运算符进行判定。

11、javascript中可以通过in运算符判断对象中是否包含某个属性。C++中没有对应的运算符实现同样效果。

12、javascript中可以通过for/in语句对对象的属性名称进行遍历。C++中没有对应的操作。

13、javascript中给一个不属于对象的属性赋值,会为这个对象自动增这个属性。C++中,如果这样做会造成编译报错或运行时异常。