首先我们输入 [] == true //false
也就是[] == false // true
这个很好理解。。。
然后我们继续
if([]) {1} else {2}
从上面可知[]是 false 那么应该打印 2
然后控制台打印了 1.。。。
到底 TMD 是为什么为什么为什么为什么为什么啊啊啊啊啊啊啊!!!!
1
jugelizi 2018-07-30 23:01:26 +08:00
[]!=[] // true
|
2
Zzdex 2018-07-30 23:01:34 +08:00
[] == ![] //true
:doge |
3
remon 2018-07-30 23:10:53 +08:00 via Android 5
一个是比较,[] == false 最后变成了 0 == 0,当然是 true 了,而 if 里面是转成 boolean,[]转成 boolean 就是 true,没毛病
|
4
darkkylin 2018-07-30 23:14:36 +08:00 1
1、隐式类型转换
2、falsy 值:false,null,'',0,NaN,undefined 3、!![] //true,所以 if ( true ){1} |
5
jason19659 OP @remon #3 布尔比较最后为什么会变成 0 == 0 ? 理论上不是应该在 false == false 才是最后
|
6
msputup 2018-07-30 23:18:46 +08:00 1
JS 比较的时候,会强制转换为 Number。楼主可以试下 Number([])
而判断的时候。会强制转换为 Boolean。 楼主可以试下这个题。 {}+[]===0 //true []+{}===0 //false console.log({}+[]===0) //false |
7
jason19659 OP @msputup #6 也就是 == 和 if 的逻辑不是统一的??两个人写的还是有什么原因?。。。
|
8
msputup 2018-07-30 23:23:29 +08:00
@jason19659 不清楚,自己了解就好了
|
9
shintendo 2018-07-30 23:32:03 +08:00 1
[] 是对象,只要记得所有对象都是 truthy 的就行了,包括 new Boolean(false)也是 truthy 的。
你的例子所有的问题只是在于==符号的诡异行为,这也是为什么它是 bad parts,当这个符号不存在就好了。 |
10
remon 2018-07-30 23:43:24 +08:00 via Android
@msputup 这两个确实是不一样的,if 是直接转成 boolean 毫无问题,== 的判断比较不符合直觉,具体规则你可以看一下资料
|
11
beny2mor 2018-07-30 23:43:54 +08:00
因为你没有使用===
[] ===false |
12
chemzqm 2018-07-30 23:45:40 +08:00
eslint 把 == 禁掉吧,这个除了用在 == null 判定 null 或者 undefined 情况,其它时候是很容易 bug 的。
|
13
rabbbit 2018-07-30 23:59:55 +08:00 1
if 操作调用 ToBoolean(GetValue(exprRef)) ,所有 Object 都返回 true
https://es5.github.io/#x12.5 [] == true 1 因为 Type(true)为 Boolean, 返回 [] == ToNumber(y) 2 因为 Type([])为 Object, 返回 ToPrimitive(x) == ToNumber(y) ToPrimitive 通过调用[[DefaultValue]] ,返回对象的默认值(就是分别调用 toString valueOf) https://es5.github.io/#x11.9.3 |
14
rabbbit 2018-07-31 00:06:42 +08:00
更正
1 因为 Type(true)为 Boolean, 返回 [] == ToNumber(true) 2 因为 Type([])为 Object, 返回 ToPrimitive([]) == ToNumber(true) |
15
mingyun 2018-07-31 00:23:25 +08:00
|
16
zhzer 2018-07-31 09:22:15 +08:00
new Array() == false // true
new Object() == false // false [0] == false // true [1] == false // false ![] == !![] // true ![] == [] // true ![] == !!![] // false 简单说叫做特性...用恒等就完事了 |
17
codevvvv9 2018-08-17 13:46:15 +08:00
if([]) {1} else {2}
1、 []这是一个对象,都属于 truthy 值。 2、只有 null、undefined、0、''、NaN、false 五个 falsey 值。 所以很明显打印 1,不要相信== ,一直用===就好啦 |