JavaScript笔记:表达式和运算符
JavaScript表达式注意点
1.数组初始化表达式:
|
|
2.对象初始化表达式:
|
|
3.属性访问表达式:
expression . identifier:只适用于要访问的是合法的标识符(identifier),并且需要知道要访问的属性的名字
expression [ expression ]:计算方括号内表达式的值并将它转换为字符串,也即访问数组时可以使用:arr[“3”]
如果命名的属性不存在,整个属性访问表达式的值就是undefined
4.表达式计算顺序:
一条语句中出现多个表达式,JavaScript总是严格按照从左到右的顺序来计算表达式。当先计算的表达式在后计算的表达式中时,会影响后计算的表达式的值,例如:
|
|
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