牛骨文教育服务平台(让学习变的简单)
博文笔记

JavaScript运算符优先级,逻辑表达式,等于全等于,序列检测小结

创建时间:2016-02-21 投稿人: 浏览次数:756

一. 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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。