课程视频-JS空数据比较html
先上题,得出心中答案,打开浏览器点开F12,复制下面代码,看看结果。前端
console.log( [] == ![] ) console.log( {} == !{} )
剖析一下,主要分为:segmentfault
运算符优先级自己是一种规则,该规则在计算表达式时控制运算符执行的顺序。具备较高优先级的运算符先于较低优先级的运算符执行。
先看MDN运算符优先级图表截取:数组
优先 | 运算类型 | 关联性 | 运算符 |
---|---|---|---|
20 | 圆括号 | n/a | (...) |
19 | new(带参数列表) | 从左到右 | new...(...) |
函数调用 | 从左到右 | ..(..) | |
16 | 逻辑非 | 从右到左 | !... |
一元加法 | 从右到左 | +... | |
一元减法 | 从右到左 | -... | |
10 | 等号 | 从左到右 | ...==... |
6 | 逻辑与 | 从左到右 | ...&&... |
5 | 逻辑或 | 从左到右 | ...II... |
MDN完整地址浏览器
在截取的表格中能够清晰的看到,逻辑非 ! 的优先级明显高于 == 等号的有优先级,所以第一个问题,在 [] == ![] 中最优先运算的是 ![] ,而后才是 == 比较。ide
console.log(![]) // false ,这个结果相对好理解 // 注意: !带有隐式转换
6种值转化为布尔值时为 false 。函数
当前结论 ![] == false,固然,在使用 == 时永远不要大意!参见附1;接下来,难题在于, [] 如何转化进行比较。请先记住一个比较的基本规则:spa
数组与数值进行比较,会先转成数值,再进行比较;与字符串进行比较,会先转成字符串,再进行比较;与布尔值进行比较,两个运算子都会先转成数值,而后再进行比较。
附1:3d
相等运算符(==)隐藏的类型转换,会带来一些违反直觉的结果,下面整理一些:code
0 == '' // true 0 == '0' // true 2 == true // false 2 == false // false // 参见图1第7条 false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 // true // \t \r \n都是转义字符,空格就是单纯的空格,输入时能够输入空格 // \t 的意思是 横向跳到下一制表符位置 // \r 的意思是 回车 // \n 的意思是回车换行
遵循上边的规则(左侧x为数组时),须要将 [] 与 false 一并转化为数字类型后再进行比较。OK,那么这个规则是谁说的算的呢?
截取一张知乎大佬贴的Es5 规范元知识图,下述比较参见 7 条。附2(中文版)
附2:
参照第7条:
ToNumber(false) // 0
为啥呢?上图
[] 依照图2,进入第9条,使用 ToPrimitive([]) ,上图
好吧,要根据类型默认使用 DefaultValue 方法,上图
[] 属于字符串hint,那么执行 toString() ,
console.log([].toString()) // "";
终于,表达式看起来不费劲了,
"" == false ;
每次对比Es5规范很是不方便,因此
结尾总结了一下能够快速判断==转化判断依据的原则,没必要每次都参照图2啦 - 附3
完美
0 == 0 // true
附3
x == y特殊总结:
原始高清视频下载
QQ答疑交流群:
600633658
咱们的连接: