
js 真是门强 ke 大 pa 的语言。
const a = { i: 1, toString: function () { return a.i++; } } if(a == 1 && a == 2 && a == 3) { console.log('Hello World!'); } toString 可以修改为 valueOf,如果两个都写,只会调用 valueOf。
var a = 1; var a = 2; var a = 3; if(a ==1 && a== 2 && a==3) { console.log("Why hello there!") } 这个感觉就莫名其妙的了。。。
a = [1,2,3]; a.join = a.shift; console.log(a == 1 && a == 2 && a == 3); 这个其实原理和第一个一样,比较前先进行转换。
let a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)}; console.log(a == 1 && a == 2 && a == 3); emmm... symbol 还没学。
这个问题真的是太可怕了,问出来估计真的没多少人能答得出来。
传送门: https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true#
1 mengyaoss77 2018-01-23 10:32:31 +08:00 为什么要和自己过不去。。。 |
2 FarAhead 2018-01-23 10:35:43 +08:00 ```Javascript var a = 9; if (a==1 && a== 2 && a==3) { document.write("<h1>Yes, it is possible!</h1>") } //-------------------------------------------- function if (){return true;} ``` 这个搞笑 |
5 mdluo 2018-01-23 10:48:35 +08:00 宽松相等 ECMAScript 就是这么定义的,没什么好奇怪的 ECMAScript 标准原文: http://www.ecma-international.org/ecma-262/5.1/#sec-11.9 之前回答过的一个问题: https://www.zhihu.com/question/46943112/answer/122096589 |
6 mcfog 2018-01-23 10:55:44 +08:00 还有 (a === 1 && a === 2 && a === 3) 也不是不行呢 |
7 attackonFourier 2018-01-23 11:06:16 +08:00 var i=0; var a = { valueOf:()=>[1,2,3][i++] } a==1 && a==2 && a==3 //true |
8 ranleng 2018-01-23 11:09:41 +08:00 我那天 Google 推送给我的链接 讲的就是 (a == 1 && a == 2 && a == 3) === true const a = { num :0, valueOf: function(){ return this.num += 1 } } console.log(a == 1 && a == 2 && a == 3) |
9 woodensail 2018-01-23 11:14:16 +08:00 Object.defineProperty(window,'a',{get(){window._a=window._a||0;return ++window._a}}); |
10 lihongjie0209 2018-01-23 11:18:17 +08:00 jser 玩的开心就好 |
11 ZhLTE 2018-01-23 11:19:49 +08:00 第二个能打印出来吗 为啥。。 |
13 silov 2018-01-23 12:48:41 +08:00 最好的语言 PHP,让 $a = TRUE; 就行了。。。 |
16 jsdfzongkai 2018-01-23 13:14:15 +08:00 @LeungJZ 其实很简单,这三个 a 不是一个 a,你可以试试英语 a 跟俄语 a |
18 notreami 2018-01-23 13:24:37 +08:00 Java 笑而无语。 |
19 w3sy 2018-01-23 13:52:58 +08:00 很正常的东西,非要找别扭 JS 拦不住你 |
22 FarAhead 2018-01-23 16:36:28 +08:00 |
23 yuanji 2018-01-23 16:38:17 +08:00 |
24 zodiac1111 2018-01-23 16:50:00 +08:00 (a==a) ===false var a=NaN |
27 chenstack 2018-01-23 20:21:20 +08:00 var a = 1; var a = 2; var a = 3; if( a == 1 && a == 2 && a == 3 ) { console.log("Why hello there!") } 这里三个是不同的变量,第一个和第三个 a 前后的空白字符不是空格,Unicode FFA0 |
28 wuethan 2018-01-23 23:36:57 +08:00 都好闲 |
29 lmqdlr 2018-01-24 00:26:36 +08:00 via Android 那个,还记得大明湖畔的 True, False = False, True 吗 |
30 Jefftam 2018-01-24 02:17:07 +08:00 @LeungJZ 哈哈,科普一下这个字符 Unicode Character 'ZERO WIDTH NON-JOINER' (U+200C) |
31 lzvezr 2018-01-24 07:04:32 +08:00 via iPhone 因为重写了方法,而且用到了类型转换所以很正常 如果重写了 get 方法(a === 1 && a === 2 && a === 3)也可以的 看到楼上提到 Unicode 字符才是坑的,比如 ''.length === 2 |
32 exonuclease 2018-01-24 09:42:49 +08:00 via Android 定义 getter 或者用 proxy 什么的反正一堆办法 |
33 120267583 2018-01-24 13:48:41 +08:00 a = [1,2,3]; a.join = a.shift; console.log(a == 1 && a == 2 && a == 3); 数组 a 被比较的时候会先调用 toString,toString 里面会调用 join |