课程视频-JS空数据对比序言先出题,心中有答案,打开浏览器点击F12,复制代码下面,看看结果。console.log([]==![])console.log({}==!{})分析,主要分为:!逻辑运算符的优先级,如何转换{}和[]复杂数据类型;==JS数据类型强制比较;thepriorityoflogicaloperators运算符优先级本身就是一个规则,它在计算中表示控制运算符执行的顺序。优先级较高的运算符在优先级较低的运算符之前执行。先看MDN算子优先级图截取:优先级运算类型associativeoperator20个括号n/a(...)19个new(withparameterlist)从左到右new...(...)functioncallfromLeftto右..(..)16逻辑非从右到左!...一元加法从右到左+...一元减法从右到左-...10等号从左到右...==...6逻辑与从左到右...&&...5逻辑或从左到右...二...从截取的表中可以清楚的看到MDN的完整地址,逻辑非!==的优先级明显高于等号的优先级,所以第一题,在[]==![]中,优先操作的是![],然后是==比较。如何转换复杂数据类型console.log(![])//false,这个结果比较好理解//注意:!withimplicitconversionundefined(undefined,找不到值时出现)null(表示空值)false(布尔值的false,string"false"布尔值为true)0(number0,string"0"布尔值为true)NaN(结果无法计算时出现,表示“非数值”;但typeofNaN==="数字")""(双引号)或''(单引号)(空字符串,有时也为真是中间的一个空格)6个值转换为布尔值时为false。目前的结论![]==false,当然,使用==时千万不能马虎!见附件1;接下来,挑战是如何转换[]进行比较。请记住一个基本的比较规则:数组与值比较时,先转化为值,再进行比较;如果与字符串比较,则先转为字符串,再进行比较;每个运算符都会先转换为一个值,然后再进行比较。附1:等号(==)的隐藏类型转换会带来一些违反直觉的结果。这里有一些:0==''//true0=='0'//true2==true//false2==false//false//请参见图1中的第7项false=='false'//falsefalse=='0'//truefalse==undefined//falsefalse==null//falsenull==undefined//true'\t\r\n'==0//true//\t\r\n转义字符,空格是简单的空格,输入时可以输入空格//\t表示水平跳转下一个tab位置//\r表示回车//\n表示回车换行按照上面的规则(当xon左边是数组),后面需要将[]和false转成数字类型比较。好的,那么谁来决定这个规则呢?截取知乎贴出的一张Es5规范元知识图谱,下面对比见7。附件2(中文版)附件2:参考第7条:ToNumber(false)//为什么是0?上图2[]根据图2,进入第9条,使用ToPrimitive([]),上图就可以了,根据类型默认使用DefaultValue方法,上图[]属于字符串提示,然后执行toString(),控制台。log([].toString())//"";最后,表达式看起来毫不费力,""==false;每次都要对比Es5规范,非常不方便,所以我们可以通过最后总结的快速判断==转换判断依据的原理,不用每次都参考图2-附件3完美0==0//true附件3x==y同类型原理总结:数比值(+0,-0等于);字符串比长度和字符序列(charCode);布尔值中的false==false;//真的;复杂数据类型比较参考地址;x==y不同基本数据类型比较原则总结:NaNinxorymustreturnfalse;Booleaninxory所有数字在比较前必须转换;当x或y出现Number时,所有数字都必须转换后才能比较;x==y包含复杂数据类型原理:x或y出现复杂数据类型,可以通过valueOf()或toString()转换为基本数据类型,然后与上述规则进行比较;x==y特别总结:Null和Undefined除了彼此或自身都会返回false;南==南;群:600633658本站链接:知乎掘金今日头条新浪微博前端网四部简书B站
