84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
[]==![] 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)}
懂了这个应该就很好理解了。