课程视频-JS空数据比较前言先上题,得出心中答案,打开浏览器点开F12,复制下面代码,看看结果。console.log( [] == ![] )console.log( {} == !{} )剖析一下,主要分为:!逻辑运算符的优先级,{}与[]复杂数据类型如何转换;== JS的数据类型的强制转换比较;逻辑运算符的优先级运算符优先级本身是一种规则,该规则在计算表达式时控制运算符执行的顺序。具有较高优先级的运算符先于较低优先级的运算符执行。先看MDN运算符优先级图表截取:优先运算类型关联性运算符20圆括号n/a(…)19new(带参数列表)从左到右new…(…) 函数调用从左到右..(..)16逻辑非从右到左!… 一元加法从右到左+… 一元减法从右到左-…10等号从左到右…==…6逻辑与从左到右…&&…5逻辑或从左到右…II…MDN完整地址在截取的表格中可以清晰的看到,逻辑非 ! 的优先级明显高于 == 等号的有优先级,因此第一个问题,在 [] == ![] 中最优先运算的是 ![] ,然后才是 == 比较。复杂的数据类型如何转换console.log(![]) // false ,这个结果相对好理解// 注意: !带有隐式转换undefined(未定义,找不到值时出现)null(代表空值)false(布尔值的false,字符串"false"布尔值为true)0(数字0,字符串"0"布尔值为true)NaN(无法计算结果时出现,表示"非数值";但是typeof NaN===“number”)""(双引号)或’’(单引号) (空字符串,中间有空格时也是true)6种值转化为布尔值时为 false 。当前结论 ![] == false,当然,在使用 == 时永远不要大意!参见附1;接下来,难题在于, [] 如何转化进行比较。请先记住一个比较的基本规则:数组与数值进行比较,会先转成数值,再进行比较;与字符串进行比较,会先转成字符串,再进行比较;与布尔值进行比较,两个运算子都会先转成数值,然后再进行比较。附1:相等运算符(==)隐藏的类型转换,会带来一些违反直觉的结果,下面整理一些:0 == ’’ // true0 == ‘0’ // true 2 == true // false2 == false // false// 参见图1第7条 false == ‘false’ // falsefalse == ‘0’ // true false == undefined // falsefalse == null // falsenull == 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附3x == y同类型原则总结:Number比数值(+0,-0相等);String比长短与字符序列(charCode);Boolean中false == false; // true;复杂数据类型比较引用地址;x == y不同基础数据类型比较原则总结:x或y出现NaN一定返回false;x或y出现Boolean一定全部转化数字后在比较;x或y出现Number一定全部转化数字后比较;x == y 包含复杂数据类型原则:x或y出现复杂数据类型通过valueOf()或toString()转化为基本数据类型, 然后参照上述规则比较;x == y特殊总结:Null 与 Undefined除彼此或自身外,一律返回false;NaN == NaN; // false关于我们原始高清视频下载视频讲解-提取码:sjgyQQ答疑交流群: 600633658我们的链接:知乎 掘金 今日头条 新浪微博 前端网 思否 简书 B站