84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
[]==![] true []==false true对象的布尔值不是true吗?为何这里==flase还是true?数组是对象类型,对象不等于对象,即使两个都是空的,这样去理解第一个正确吗?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
之前写得比较简单,再补充点,如果有错误请指正。
说说我的理解吧
首先要明白==和===的区别==是判断值是否相等,===判断值及类型是否完全相等。前者会自动转换类型,后者不会。所以在判断[]==![]会转换两者的类型。
==
===
[]==![]
typeof [] //Object typeof ![] //Boolean
两者类型不同,比较的时候会尝试将Boolean转换为Number,而Object转换成Number或String,取决于另外一个对比量的类型。这里因为比较的对象是Boolean,所以也会转化为Number。
console.log(![]) //false 因为任何对象Boolean值都为true,所以![]就为false
Boolean与Number的转换,true为1,false为0,所以![]在比较的时候转换为Number值为0。
![]
而[]是很明显的空对象了。对于对象,当将其转换成Number时,会先调用对象的valueOf()方法及toString(),返回对象的原始值,再进行转换。最终[]会返回""空字符串,""会转化Number值为0。最后0==0所以两者以比较就为true了
[]
""
这题好有技术含量,我试了试才发现高级类型和基础类型比较是咋回事,数组先调用了valueOf,返回值是基本类型就开始和另一边比较,如果不是就继续调用toString,举个例子:[1] == true 为 true;[''] == true 为 false;这两个调用完valueOf后都是基本类型了,1和true相比为true,‘’和true相比为false,so:[] == true 先调用valueOf为[],还是高级类型,继续toString返回‘’,‘’和true比较为false;![] == true 先执行左侧!运算结果必须是false(感叹号+对象),所以结果为false;![] == [] 左侧执行完是false,右侧高级类型要转基本类型才能比较,这就相当于 false == [], 结果为true;
数组是特殊对象 对象在和其它类型做比较时会先调用对象的valueOf或toString方法 []会转为一个空字符串 [1] 会转换为字符串1 所以数组和其他类型比较其实是字符串的比较。当然 有些对象并不是这样的。有些对象在和特殊值比较或运算的时候会先调用valueOf方法 若valueOf方法没法直接做比较或者运算 再调用toString方法.一个例子是Date对象在进行数值运算的时候 比如减法 就会先调用valueOf方法得到一个timeStamp 进行减法运算。
对了 任何对象的布尔值转换都是true 所以 ![]===false 其实两个比较是完全一样的
是不是叹号把空数组转化成了false,所以二个题其实是一样的,空数组跟false比较的时候空数组转化成了布尔false
if([]){[]==true?console.log(1):console.log(2)}懂了这个应该就很好理解了。
if([]){[]==true?console.log(1):console.log(2)}
之前写得比较简单,再补充点,如果有错误请指正。
说说我的理解吧
首先要明白
==
和===
的区别==
是判断值是否相等,===
判断值及类型是否完全相等。前者会自动转换类型,后者不会。所以在判断
[]==![]
会转换两者的类型。两者类型不同,比较的时候会尝试将Boolean转换为Number,而Object转换成Number或String,取决于另外一个对比量的类型。这里因为比较的对象是Boolean,所以也会转化为Number。
Boolean与Number的转换,true为1,false为0,所以
![]
在比较的时候转换为Number值为0。而
[]
是很明显的空对象了。对于对象,当将其转换成Number时,会先调用对象的valueOf()方法及toString(),返回对象的原始值,再进行转换。最终
[]
会返回""
空字符串,""
会转化Number值为0。最后0==0所以两者以比较就为true了
这题好有技术含量,我试了试才发现高级类型和基础类型比较是咋回事,数组先调用了valueOf,返回值是基本类型就开始和另一边比较,如果不是就继续调用toString,举个例子:
[1] == true 为 true;
[''] == true 为 false;
这两个调用完valueOf后都是基本类型了,1和true相比为true,‘’和true相比为false,so:
[] == true 先调用valueOf为[],还是高级类型,继续toString返回‘’,‘’和true比较为false;
![] == true 先执行左侧!运算结果必须是false(感叹号+对象),所以结果为false;
![] == [] 左侧执行完是false,右侧高级类型要转基本类型才能比较,这就相当于 false == [], 结果为true;
数组是特殊对象 对象在和其它类型做比较时会先调用对象的valueOf或toString方法 []会转为一个空字符串 [1] 会转换为字符串1 所以数组和其他类型比较其实是字符串的比较。当然 有些对象并不是这样的。有些对象在和特殊值比较或运算的时候会先调用valueOf方法 若valueOf方法没法直接做比较或者运算 再调用toString方法.一个例子是Date对象在进行数值运算的时候 比如减法 就会先调用valueOf方法得到一个timeStamp 进行减法运算。
对了 任何对象的布尔值转换都是true 所以 ![]===false 其实两个比较是完全一样的
是不是叹号把空数组转化成了false,所以二个题其实是一样的,空数组跟false比较的时候空数组转化成了布尔false
if([]){[]==true?console.log(1):console.log(2)}
懂了这个应该就很好理解了。