题目:`[] == ![]`
解析:
!
优先级高于==
先计算![]
部分。[]
为非falsy值,转化为true
,因此![]
为false
。题目转换为[] == false
。- 比较运算符的左右操作数类型不一致,
[]
先通过toString()
转化为原始值""
,题目转化为"" == false
。 - 比较操作符左右两边为基本类型的值,操作符右边有布尔类型的值,将布尔类型的值转换为数值,因此
false
转化为0
。题目转换为"" == 0
- 比较操作符两边是数值和字符串的比较,调用
Number()
将字符串转化为数值。Number("") 转化为0
即0 == 0
,结果为true。
扩展:
var a = 0;
!a++ == ++a
// false 此时 a = 2
目录
- 运算符优先级
!
运算符- 比较操作符
运算符优先级
- 运算符
!
优先级高于==
因此先计算![]
- 常用运算符优先级:
- 后置递增、后置递减
a++
a--
- 逻辑非
!
前置递增、前置递减++a
--a
从右向左 - 大于、小于、大于等于 、小于等于
>
<
>=
<=
- 等于、全等于
==
===
!==
- 逻辑与
&&
- 逻辑或
||
- 条件运算符
- 赋值
=
- 后置递增、后置递减
参考:
!
运算符
- falsy 值
null
NaN
- 0
- 空字符串
''
""
undefined
- 其他值都是 true
比较操作符
-
==
比较操作符 ,比较前,将两个操作数转换为相同的数据类型。 -
===
严格比较,操作数类型和值都必须相等
特点:
null
==undefined
// true 不严格相等+0
===-0
// true 严格相等null
undefined
严格和自身相等NaN
==NaN
//false NaN 都不等 NaN
==
相等运算符
-
左右操作数都是基本类型的值时,转换为相同类型的值作比较。
1 == "1" //true 1 == true // true 0 == false // true "" == 0 // true ,Number("") = 0
-
左右操作数都是复杂数据类型(对象、数组)时,他们在
栈
内存中的引用地址(堆内存)相同时才相等。[] == [] // false [1,2] == [1,2] //false var arr = [1,2]; var a = arr; var b = arr; a == b //true a === b //true // 同理 对象一样 {} == {} //false var obj = {a:1}; var a = obj; var b = obj; a === b true
-
左右操作数类型不一致,基本数据类型和复杂数据类型(对象)作比较,对象会被转化为原始值。
-
数字和字符串比较
字符串会转换为相应的数值 (Number())
1 == "1"; //true "1"会转化为 数值 1 "1" == 1; //true // Number实现字符串转换 "1.1.1" == 1.1 //false parseInt("1.1.1") // 1 parseFloat("1.1.1") // 1.1 Number("1.1.1") // NaN Number("1.1") // 1.1 parseInt("1.1") // 1 parseFloat("1.1") // 1.1 Number("") // 0 相当于 Number() parseInt("") // NaN 相当于parseInt() parseFloat("") // NaN 相当于parseFloat()
-
如果其中一个操作数为布尔值,则true 转换为1 ,false转换为0
1 == true // true "1" == true // true
-
对象与数字或字符串作比较时,操作符通过
valueOf()
和toString()
将对象转换为原始值(字符串、数值),转换失败会产生运行时错误。var obj = {a:1}; obj.toString() // "[object Object]" obj.valueOf() // obj obj.valueOf() === obj // true var arr = []; arr.toString() // "" arr.valueOf() // arr arr.valueOf() === arr // true [] == 0 // true [] == false // true [1] == 1 // true [1] == "1" // true [1,2].toString() // "1,2" [1,2].join() // "1,2" [1,2].join(',') // "1,2" [1,2].join('') // "12"
-
===
全等运算符
操作数值和数据类型相等时返回true 否则返回false
1 === "1" //false
1 === 1 //true
参考: