又想起了一个黑 js 的故事,困扰好久了。。当初就没有解答

2018-07-30 22:57:43 +08:00
 jason19659

首先我们输入 [] == true //false
也就是[] == false // true
这个很好理解。。。
然后我们继续 if([]) {1} else {2}
从上面可知[]是 false 那么应该打印 2
然后控制台打印了 1.。。。

到底 TMD 是为什么为什么为什么为什么为什么啊啊啊啊啊啊啊!!!!

5531 次点击
所在节点    JavaScript
17 条回复
jugelizi
2018-07-30 23:01:26 +08:00
[]!=[] // true
Zzdex
2018-07-30 23:01:34 +08:00
[] == ![] //true

:doge
remon
2018-07-30 23:10:53 +08:00
一个是比较,[] == false 最后变成了 0 == 0,当然是 true 了,而 if 里面是转成 boolean,[]转成 boolean 就是 true,没毛病
darkkylin
2018-07-30 23:14:36 +08:00
1、隐式类型转换
2、falsy 值:false,null,'',0,NaN,undefined
3、!![] //true,所以 if ( true ){1}
jason19659
2018-07-30 23:18:21 +08:00
@remon #3 布尔比较最后为什么会变成 0 == 0 ? 理论上不是应该在 false == false 才是最后
msputup
2018-07-30 23:18:46 +08:00
JS 比较的时候,会强制转换为 Number。楼主可以试下 Number([])
而判断的时候。会强制转换为 Boolean。

楼主可以试下这个题。

{}+[]===0 //true
[]+{}===0 //false
console.log({}+[]===0) //false
jason19659
2018-07-30 23:22:44 +08:00
@msputup #6 也就是 == 和 if 的逻辑不是统一的??两个人写的还是有什么原因?。。。
msputup
2018-07-30 23:23:29 +08:00
@jason19659 不清楚,自己了解就好了
shintendo
2018-07-30 23:32:03 +08:00
[] 是对象,只要记得所有对象都是 truthy 的就行了,包括 new Boolean(false)也是 truthy 的。
你的例子所有的问题只是在于==符号的诡异行为,这也是为什么它是 bad parts,当这个符号不存在就好了。
remon
2018-07-30 23:43:24 +08:00
@msputup 这两个确实是不一样的,if 是直接转成 boolean 毫无问题,== 的判断比较不符合直觉,具体规则你可以看一下资料
beny2mor
2018-07-30 23:43:54 +08:00
因为你没有使用===
[] ===false
chemzqm
2018-07-30 23:45:40 +08:00
eslint 把 == 禁掉吧,这个除了用在 == null 判定 null 或者 undefined 情况,其它时候是很容易 bug 的。
rabbbit
2018-07-30 23:59:55 +08:00
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
rabbbit
2018-07-31 00:06:42 +08:00
更正
1 因为 Type(true)为 Boolean, 返回 [] == ToNumber(true)
2 因为 Type([])为 Object, 返回 ToPrimitive([]) == ToNumber(true)
mingyun
2018-07-31 00:23:25 +08:00
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

简单说叫做特性...用恒等就完事了
codevvvv9
2018-08-17 13:46:15 +08:00
if([]) {1} else {2}
1、 []这是一个对象,都属于 truthy 值。
2、只有 null、undefined、0、''、NaN、false 五个 falsey 值。
所以很明显打印 1,不要相信== ,一直用===就好啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/475503

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX