收集了一些比较怪的类型转换,我不懂原因,大家讨论讨论这是为什么?[]==![]//true'1'==true//true'2'==true//false'3'==true//falsenull>=0//true{}+1//1{vara=10}+1//1{}+{}//"[objectObject][objectObject]"+[]//0{}+[]//0[1,2]+[3,4]//"1,23,4"+[2]//2[2]+1//"21"[2]+(-1)//"2-1"null特殊情况+null//0null==0//falsenull>0//falsenull
2 回答
慕仙森
TA贡献1827条经验 获得超7个赞
使用==进行比较,如果比较的类型不同,可以分为四种情况1.字符串与数字之间的相等比较,此时字符串会被强制转换为数字2.其他类型和布尔值类型之间的相等比较,布尔值会被强制转换为数字,true转为1,false转为03.null和undefined之间的相等比较,null==undefined返回true4.对象和非对象之间的相等比较,对象需要进行ToPrimitive抽象操作(如toString(),valueOf())根据上面的四条规律,来理解下面几题:[]==![]相当于[]==false相当于''==false相等于''==0相当于0==0因此结果为true'1'==true相当于'1'==1相当于1==1因此结果为true'2'==true相当于'2'==1相当于2==1因此结果为false'3'==true相当于'3'==1相当于3==1因此结果为false根据规范a<=b会被当做bnull>=0可以理解为!(null<0)。因为null<0为false,所以null>=0结果为true使用+操作符时,如果其中一个操作符是对象,那么会先调用valueOf()方法,如果该方法返回基本类型值,就不再调用toString()方法。否则就调用toString()方法(有个例外,Date的实例对象总是先调用toString,再调用valueOf)。数组的valueOf()得不到基本类型值,所以数组会调用toString()方法。{}+1的前面的{}是个空的代码块,如果加上换车键或许更好理解了。{}回车+1。+1结果返回1了。{vara=10}+1道理跟上面一下,前面的{}是个代码块,只是后面没加回车键。+1结果返回1.{}+{}是两个空对象相加,分为转为字符串({}).toString(),再相加。结果为"objectObject"+[]相当于Number([]),结果为0{}+[]这里{}依旧是空代码块,因此返回+[]的结果,也就是0[1,2]+[3,4][1,2]转为字符串'1,2'[3,4]转为字符串'3,4',因此结果为"1,23,4"+[2]相当于+'2'相当于Number('2')因此,结果为2[2]+1相当于'2'+1因此,结果为'21'[2]+(-1)相当于'2'+(-1)因此结果为'2-1'
守着星空守着你
TA贡献1799条经验 获得超8个赞
[]==![]=>[]==false(数组取反)=>''==false([]转原始值)=>0===0(调用Number转换)'1'==ture=>1===1(调用Number)'2'==true=>2===1(调用Number)'3'==true=>3===1(调用Number)null>=0=>0>=0(调用Number){}+1=>+1=>1(前一个{}被认为是一个空代码块){vara=10}+1=>+1(类似上面等价于"+1"){}+{}=>[objectObject]+[objectObject](左右两边被认为为对象分别调用toString()并相加)[]=>+0(调用Number){}+[]=>+[]("{}"被认为是空代码块)=>+0(调用Number)[1,2]+[3,4]=>'1,2'+'3,4'(调用toString)[2]=>+2(调用Number)[2]+1=>'2'+1(先求原始值调用toString)=>'21'(存在string优先转化为string)[2]+(-1)=>'2'+-1(先求原始值调用toString)=>'2-1'(存在string优先转化为string)
添加回答
举报
0/150
提交
取消