JavaScript表达式注意点

1.数组初始化表达式

1
2
3
var mat = [[1,2,3], [4,5,6], [7,8,9]];
var spaceArray = [1,,,,5]; //中间三个元素是undefined

2.对象初始化表达式:

1
var obj = { x:2.3, y:-1.2};

3.属性访问表达式:

expression . identifier:只适用于要访问的是合法的标识符(identifier),并且需要知道要访问的属性的名字

expression [ expression ]:计算方括号内表达式的值并将它转换为字符串,也即访问数组时可以使用:arr[“3”]

如果命名的属性不存在,整个属性访问表达式的值就是undefined

4.表达式计算顺序:

一条语句中出现多个表达式,JavaScript总是严格按照从左到右的顺序来计算表达式。当先计算的表达式在后计算的表达式中时,会影响后计算的表达式的值,例如:

1
2
var a = 1;
var b = (a++) + a; // b = 1 + 2 = 3,在计算 + a时,a的值是2

5.算术表达式

在乘、除、减、求余操作时若出现无法转化为数字的操作数时,操作数转化为NaN,整个表达式也为NaN

JavaScript所有数字都是浮点型,也即5/2=2.5

6.“+”运算符

“+”运算符倾向于连接字符串,只有两个操作数均为数字时才执行加法运算,具体行为表现为:

step1:如果一个操作数时对象,先化对象为原始值

step2:将可能的对象化为原始值后,如果有一个操作时是字符串,另一个也跟着转为字符串

step3:若两操作数均为数字(或者NaN)则执行加法,否则进行字符串连接

7.位运算

位运算要求操作数为32位整数,因此位运算符首先将操作数转为数字,并转为32位整型,这会忽略原格式中的小数部分和任何超过32位的部分。

位运算要求右操作数为0-31之间,再将其操作数转换为无符号32位整数后,他们将舍弃第5位之后的二进制位,以便生成一个正确的数字。

位运算将NaN、Infinity、-Infinity转为0。

8.关系表达式

“===”(严格相等运算符)比较步骤(比较两个值,比较过程没有任何类型转换):

step1:如果两个值类型不同,则它们不等

step2:如果两个值都是null或都是undefined,则它们不等

step3:如果一个值是NaN或两个都是NaN,则它们不等(NaN与自身也不等)

step4:如果两个值都是数值且数值相等,则它们相等(-0也与0严格相等)

step5:如果两个值位字符串,且所含的对应位上的16位数完全相等,则它们相等。(含义相同的字符串可能因为使用了不同的编码导致不能相等,JavaScript并不对Unicode进行标准化的转换)String.localeCompare()提供了另一种比较字符串的方法

step6:如果两个引用指向同一对象、数组、函数,则它们相等,否则就算属性和属性值完全一样也不等

“==”(相等运算符)比较步骤(比较两个值,比较过程对不同类型尝试类型转换):

step1:如果两个操作数类型相同,则和严格相等的比较规则一样

step2:如果一个是null,一个是undefined,则它们相等

step3:如果一个是数字一个是字符串,则将字符串先转化为数字再比较;如果一个是布尔值,则转化为0或1;如果一个值是对象,则转为原始值再根据操作数的情况进行进一步转换

其他不同类型之间均不相等

9.比较运算符

如果说“+”运算符更倾向于字符串的话,比较运算符更倾向于数字:当一边为数字一边为字符串时,字符创转化为数字再比较(只有两边都是字符串时才比较字符串大小)

“<=”(小于等于)和“>=”(大于等于)运算符在判断相等的时候,并不依赖于“==”(相等运算符)和“===”(严格相等运算符),小于等于仅仅是不大于,大于等于仅仅是不小于。

比较运算符的例外:当存在一个操作时是NaN时,小于、大于、小于等于、大于等于四个比较运算符均返回false

10.in运算符

in运算符希望它的左操作数是个字符串或可以转化为字符串,右操作数是对象。如果右侧对象拥有一个名为左操作数的属性名,那么返回true,否则false

11.instanceof运算符

instanceof运算符希望左操作数是个对象,右操作数是标识对象的类。如果左侧的对象是右侧类的实例,则返回true,否则false

12.typeof运算符

typeof放在操作数的前面,操作数可以使任意类型,返回值位标识操作数类型的一个字符串

值得注意的点:

1.null对应”object”

2.尽管JavaScript中的函数是对象的一种,但typeof运算符还是讲函数特殊对待,ECMAScript 5规范讲所有函数和可执行对象对应位”function”

13.delete运算符

delete删除数组的元素智慧留下一个“洞”,而数组长度不变

delete希望它的操作数是一个左值,如果他不是左值,那么delete将不进行任何操作并返回true