一. JavaScript运算符优先级
序号 | 运算符 | 描述 |
---|---|---|
01 | . [] () | 对象成员存取、数组下标、函数调用等 |
02 | ++ – ~ ! delete new typeof void | 一元运算符等 |
03 | * / % | 乘法、除法、取模 |
04 | + - + | 加法、减法、字符串连接 |
05 | << >> >>> | 移位 |
06 | < <= > >= instanceof | 序列检测,instanceof |
07 | == != === !== | 等值检测 |
08 | & | 按位与 |
09 | ^ | 按位异或 |
10 | | | 按位或 |
11 | && | 逻辑与 |
12 | || | 逻辑或 |
13 | ?: | 条件(右结合性) |
14 | = op= | 赋值、运算赋值 |
15 | , | 多重求值 |
二. js逻辑表达式
四条规则:
规则1 :支持布尔短路
规则2: 将运算元理解为布尔值,以进行布尔运算
规则3: 不改变运算元的数据类型
规则4: 不强制运算结果的数据类型
两条特性:(看第一个参数)
1:a1 && a2 –>a1?a2:a1;
2:a1 || a2 –>a1?a1:a2;
三. js等于与全等于
1.等值检测中“相等”的运算规则(==)
类型 | 运算规则 |
---|---|
两个值类型比较 | 转换成相同数据类型的值进行“数据等值”的比较 |
值类型与引用类型比较 | 将引用类型数据转换为与值类型数据相同类型的数据,再进行“数据等值”比较 |
两个引用类型比较 | 比较引用(的地址) |
2.等值检测中“相同”的运算规则(===)
类型 | 运算规则 |
---|---|
两个值类型比较 | 数据类型不同,则必然“不相同” 数据类型相同,进行“等值比较” |
值类型与引用类型比较 | 必然“不相同” |
两个引用类型比较 | 比较引用(的地址) |
备注
在三种类型(数值,布尔值和字符串)中,数值和布尔值的“数据等值”检测开销比较小,但对字符串检测时就存在较大的开销。因为必须对字符串中的每一个字符进行比较,才能判断两个字符串是否相等。
四. 序列检测
可进行序列检测的数据类型:
可比较序列的类型 | 序列值 |
---|---|
boolean | 0-1 |
string | (*注1) |
number | NEGATIVE_INFINITY ~ POSITIVE_INFINIGY(*注2) |
*注1:在js中,不存在char(字符)这种数据类型,但字符串的每一个字符,都被作为单一字符(#0~#255)参与序列检测
*注2:负无穷~正无穷,NaN不参与序列检测
tip:
!isFinite()===isNaN() //true
isFinite(undefined)===isNaN(null) //false
isFinite(null)===isNaN(undefined) //true
undefined – NaN
null !– NaN
序列检测规则
类型 | 运算规则 |
---|---|
两个值类型进行比较 | 直接比较数据再序列中的大小 |
值类型与引用类型比较 | 将引用类型的数值转换为与值类型数据相同类型的数据,再进行”序列大小”的比较 |
两个引用类型比较 | 无意义总是返回false(*注3) |
*注3:对引用类型进行序列检测也是有可能的,取决于valueof()运算效果
示例1:布尔值转换为0/1,只相等不相同
true==1 //true
true===1 //false
示例2:空字符串转换为0值
''==0 //true
' '==0 //true
''===0 //false
示例3:两个对象(引用类型比较总是返回false)
var o1=o2={};
var o3={};
o1===o2 //true
o1==o3 //false
示例4:两个运算元都为字符串,将比较每个字符的序列值
示例5:当字符串与其他类型值比较时,将字符串转换为数值比较
#参考书籍:
《JavaScript语言精髓与编程实践》第二版 周爱民2012.3