2. 标识符:指变量、函数、属性的名字,或者函数的参数。
- 第一个字符必须是一个字母、一个下划线( _ )或者一个美元符号($);
- 其他字符可以使字母、下划线、美元符号或者数字。
- 按照惯例,ECMAScript标识符采用驼峰大小写格式。
3. 严格模式:*use strict*,可以在脚本中启用严格模式,写在代码顶部。
4. ECMAScript中的语句采用一个分号作为结尾。虽然并不必需,但是可以用来避免错误(不完整输入etc),某些情况下可以增加代码的性能(解析器不需要推测哪里需要分号)。
5. 变量:ECMAScript中的变量是松散型的,即可以用来保存任何类型的数据——每个变量仅仅是一个用于保存值的占位符而已。
- var 变量名;
- 省略var操作符可以定义全局变量,但是并不推荐。因为在局部作用域中定义的全局变量难以维护,而且如果有意的忽略了var操作符,也会由于变量不会马上就有定义(definition)而导致不必要的混乱。给未经声明的变量赋值在严格模式下会导致抛出ReferenceError错误。
6. 数据类型:ECMAScript中有5种简单数据类型(基本数据类型):Undefined, Null, Boolean, Number, String以及一种复杂数据类型Object。
- typeof操作符用于检测给定变量的数据类型
- typeof null会返回object,因为特殊值null被认为是一个空的对象引用
7. undefined类型只有一个值,即特殊的undefined。这个值是由ECMA-262第三版引入的,用于区分空对象指针和未经初始化的变量。但是,包含undefined值的变量与尚未定义的变量并不一样。
- var message;表示“定义了一个变量,名为message,但是未初始化”,使用alert(message)会显示message变量的值,为“undefined”;
- 如果没有“var message”,则表示所谓的message变量并没有被定义,即message变量本质上并不存在,使用alert(message);会产生错误。
- 但是对于未初始化的变量执行typeof操作符会返回undefined值,对于未声明(未定义)的变量执行typeof操作符同样会返回undefined值。
- 所以,即便未初始化的变量会被自动赋予undefined值,但是显式地初始化变量仍然值得推荐,因为typeof操作符对这个变量进行操作的时候,我们就可以立即知道被检测的变量还没有被声明,而不是没有被初始化(例子:应该使用var message = “example”)。
- 注意“初始化”和“被声明”两者的区别。
8. null类型也只有一个值,即特殊的null。从逻辑角度来看,null值表示一个空对象指针,所以typeof null会返回“object”。
- 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而非其他值,以方便检查null值就可以知道该变量是否保存了一个对象的引用(if (car != null))
9. ECMAScript中所有类型的值都有与boolean值等价的值,即
var message = “Hello”; var messageAsBoolean = Boolean(message); message字符串被转换成了一个Boolean值,被保存于messageAsBoolean中。
10. 浮点数值的最高精度是17位小数,但是在进行算数计算时其精确度远远不如整数,所以不要做if (a + b == 0.3)类似的操作。永远不要测试某个特定的浮点数值。
11. NaN(Not a Number)用来表示一个本来要返回数值的操作数未返回数值的情况。在ECMAScript中,任何数值除以0都会返回NaN,因此不会影响其他代码的执行。
- 任何涉及NaN的操作都会返回NaN
- NaN和任何值都不相等,包括NaN本身。
- isNaN()函数,可以接受一个参数,该参数可以使任何类型,而该函数可以用来帮助确定这个参数是否“不是数值”。
12. 有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。第一个用于任何数据类型,后两者专门用于把字符串转换为数值。
13. parseInt()函数在处理字符串时,会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个字符不是数字字符或者负号,parseInt()返回NaN;如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符;小数点并非一个有效的数字字符。常会给parseInt函数提供第二个参数作为转换时使用的基数(即多少进制):var num = parseInt(“AF”, 16); 。为了避免解析错误,建议无论什么情况下都明确指定基数,所以始终将10作为第二个参数是必要的,当常用十进制数值时。
14. String()函数:
- 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
- 如果值是null,则返回“null”;
- 如果值是undefined,则返回“undefined”
15. 在ECMAScript中,Object类型是所有它的实例的基础,即Object类型所具有的任何属性和方法也同样存在于更具体的对象中。Object的每个实例都具有下列属性和方法:
- Constructor:保存着用于创建当前对象的函数。
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而非实例的原型中)是否存在。其中propertyName必须以字符串形式指定(o.hasOwnProperty("name”));
- isPrototypeOf(object):用于检查传入的对象是否是另一个对象的原型;
- propertyIsEnumberable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举,属性名必须以字符串形式指定;
- toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应;
- toString():返回对象的字符串表示;
- valueOf():返回对象的字符串、数值或者布尔值表示。
16. 一元递增和递减操作符规则:
- 在应用于一个包含有效数字字符的字符串时,现将其转换为数值,再执行加减1的操作— 字符串变量变成数值变量;
- 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN— 字符串变量变成数值变量;
- 在应用于布尔值false时,现将其转换为0再执行加减1的操作— 布尔值变量变成数值变量;
- 在应用于布尔值true时,现将其转换为1再执行加减1的操作— 布尔值变量变成数值变量;
- 在应用于浮点数值时,执行加减1的操作;
- 在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值,然后对该值应用前述规则。如果结果是NaN,则在调用toString()方法后再应用前述规则— 对象变量变成数值变量。
17. 一元加和减操作符:
- 对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个数值执行转换;
- 对非数值应用一元减操作符时,遵循一元加操作符规则,最后将得到的数值转换为负数。
18. 按位非(NOT)
- 按位非操作由一个波浪线(~)表示,执行结果是返回数值的反码:25(00000000000...1101)则~25(11111111...0010),最终结果与num1 = 25; -num1 - 1的结果相同,但是按位非在数值表示的最底层执行操作,所以速度更快。
19. 按位与(AND)
- 按位与操作符由一个和号字符(&)表示,他有两个操作数。本质上就是讲两个数值的每一个位对齐,然后做出AND操作(两个1返回1,否则返回0)
20. 按位或(OR)
21. 按位异或(XOR)
- 由一个插入符号(^)表示,有两个操作数,如果是同1(两个1)或者同0(两个0),返回0,否则返回1
22. 左移
- 由两个小于号(<<)表示,这个操作符会将指定数值的所有位向左移动指定位数:var oldValue = 2; var newValue = oldValue << 5 则会将10变为1000000.
- 左移不会影响操作数的符号位,所以-2向左移动5位,会返回-64
23. 有符号的右移
- 有符号的右移动操作符由两个大于号(>>)表示,将数值向右移动,但是保留符号位。
24. 无符号右移
- 无符号右移由三个大于号(>>>)表示,这个操作符会将数值的所有32位都像右移动。对正数来说,与有符号右移相同。但是对于负数而言,由于无符号右移以0来填充空位,而非以符号位的值来填充空位,且无符号右移操作符会把负数的二进制码当做正数的二进制码,会导致无符号右移后的结果非常大
25. 逻辑非操作符可以用来将一个值转换为与之对应的布尔值,而同时用两个逻辑非操作符,时间上就会模拟Boolean()转型函数的行为,第一个逻辑非操作会基于无论什么操作数返回一个布尔值,而第二个逻辑非操作则对这个布尔值求反,即可得到这个值真正对应的布尔值。
26. 逻辑或的赋值: var myObject = preferredObject || backupObject;
- 表示只有在preferredObject不包含有效值的情况下,给myObject赋予后备值