1 vincenttone 2017-12-14 10:50:10 +08:00 [] == false |
![]() | 2 Smilecc 2017-12-14 10:51:31 +08:00 [] === ![] |
![]() | 3 mentalidade 2017-12-14 10:51:39 +08:00 难道比较的是两个数组的地址? |
4 vincenttone 2017-12-14 10:51:44 +08:00 [] == false ![] == false !false == true 应该是弱类型导致的? |
5 mooncakejs 2017-12-14 10:52:51 +08:00 准备战争:来 show 出你常用的语言,我们来找奇葩点。 |
![]() | 6 nannanziyu 2017-12-14 10:56:04 +08:00 @mooncakejs 额,汉语? |
7 vincenttone 2017-12-14 10:56:14 +08:00 ![] === false [] == false [] === false // false 应该是弱类型导致的吧 |
![]() | 8 ZxBing0066 2017-12-14 10:58:41 +08:00 ...并不觉得有什么槽点 毕竟现实谁也不会写这种代码 |
9 mooncakejs 2017-12-14 11:00:26 +08:00 @nannanziyu 我只负责引战,不负责战斗。 |
![]() | 10 littlepanzh 2017-12-14 12:03:17 +08:00 如果知道什么是 primitive value 就不会觉得奇葩了 大多数觉得奇葩的事情其实都是了解的不够导致的~ |
![]() | 11 Pastsong 2017-12-14 12:15:05 +08:00 via Android 这是 ECMA262 标准的实现 |
![]() | 12 zywsss 2017-12-14 12:19:20 +08:00 ![]() 左侧的[]是一个对象,js 中对象都是为 true 右侧的![],其中的!会将右侧的[]转为 boolean 并取反,js 中数组只有 toString 方法进行类型转换,[]就转为了空字符串''为 false,一取反为 true |
![]() | 13 599316527 2017-12-14 12:28:23 +08:00 ![]() |
![]() | 14 lovedebug 2017-12-14 12:38:38 +08:00 1. [] == false 2. "" == 0 3. 0 == 0 |
![]() | 15 leemove 2017-12-14 12:42:10 +08:00 所以我们用=== |
16 bramblex 2017-12-14 12:44:03 +08:00 typescript 大法好 |
![]() | 17 SourceMan 2017-12-14 12:47:33 +08:00 没毛病啊,这是语言特性,不能用强类型语言的逻辑来审视 JS 这种弱类型语言 == 是不推荐使用的比较方式,ESLint 要强制 === 当然,可以用 TS 写,更加 666 |
![]() | 18 isbase 2017-12-14 13:00:47 +08:00 Boolean([].valueOf().toString()) == ![] |
![]() | 19 airingursb 2017-12-14 13:03:53 +08:00 ![]() |
![]() | 20 k9982874 2017-12-14 13:08:51 +08:00 [] 因数组长度为 0 返回 false ![] "[]"是有效对象转成 boolean 值 true,再非运算,所以返回 false false == false 结果是 true 觉得神奇还是因为熟练度不够,继续练级吧。 |
![]() | 21 wxsm 2017-12-14 13:14:41 +08:00 你觉得这个结果很“神奇”,只是因为你对它的了解还不够而已。 |
![]() | 22 yasumoto 2017-12-14 13:25:51 +08:00 [] !== [] 也是等于 true |
![]() | 23 finian 2017-12-14 13:31:38 +08:00 @zywsss @k9982874 别瞎猜,看看人家 Spec 是怎么定义的: > http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 ``` [] == ![] => [] == false // ![] => [] == 0 // [] == ToNumber(false) => '' == 0 // ToPrimitive([]) == 0 => 0 == 0 // ToNumber('') == 0 => true ``` |
24 v2lf 2017-12-14 13:34:09 +08:00 是时候拿出来我珍藏的网页啦, 虽然规范最好,但是有人不喜欢看,所以 , 看下这个。 [see me]( https://Javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-Javascript/) |
25 uolcano 2017-12-14 13:34:14 +08:00 via Android 一个建议,有时间多看看 ECMAScript 标准文档吧 |
![]() | 26 AV1 2017-12-14 13:50:37 +08:00 ![]() 可以参考: https://Javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-Javascript/ 很复杂,是嘛?为何不直接用===和!==呢? 对 JS 不求甚解,却热衷奇技淫巧,就像某些 C 语言初学者争吵 i+++++i 的结果一样毫无意义。 |
![]() | 28 Tompes 2017-12-14 14:25:13 +08:00 是时候掏出 JS 真值表了。 [滑稽 |
![]() | 29 zywsss 2017-12-14 15:18:26 +08:00 @finian 他这个应该是对的 [] == ![] !优先级比==高,所以先执行![],将[]转为 bool 并取反,[]空数组也是对象,对象为 true,取反结果为 false [] == false 左侧是对象,右侧是 bool,类型不一样,转为数字进行比较 [] == 0 左侧空数组要转为数字,数组转为 primitive 只有 toString,结果就是空字符'' '' == 0 左右类型还是不一样,转为数字比较 0 == 0 结果 true |
![]() | 30 jason19659 OP |
![]() | 31 LeungJZ 2017-12-14 16:12:12 +08:00 if ([]) console.log('a') else console.log('b') 输出 a 你会怀疑人生了。 |
32 ivechan 2017-12-14 16:13:30 +08:00 “ The World's Most Misunderstood Programming Language ” 这篇文章也不是现在才有的了, 但是这不影响 Javascript 是个成功的语言, 是值得学习的。 值不值得你爱,就因人而异了。 |
![]() | 33 jason19659 OP @ivechan #34 不管你爱不爱。。但你都得用。。 |
![]() | 34 janxin 2017-12-14 16:28:04 +08:00 不会背真值表你怎么用 JS ? |
![]() | 35 zywsss 2017-12-14 16:42:53 +08:00 @jason19659 []数组是对象,左右两边是两个独立的对象 |
![]() | 36 Terry05 2017-12-14 16:57:33 +08:00 写 js 要习惯于使用 === 不然会有很多自己意想不到的坑! |
![]() | 37 begoingtodo 2017-12-14 17:04:41 +08:00 |
![]() | 38 timothyqiu 2017-12-14 17:20:37 +08:00 |
39 bucky 2017-12-14 21:48:04 +08:00 一个语言的设计缺陷常常被用来当面试题,真不明白这些人怎么想的 |
41 sunber 2017-12-15 09:48:26 +08:00 如果碰到这类面试题,走为上策 |
42 Kobayashi 2017-12-16 18:50:55 +08:00 via Android 正在读 Javascript 高级程序设计: p44 逻辑非,第一条,对象的逻辑非为 false ; p51 相等和不等,第一条,存在布尔值时的相等比较,比较二者数值;第七条,两个对象比较,比较是不是同一个对象。 此题完。 |