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
为什么要和自己过不去。。。
|
2
w7938940 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 1
宽松相等 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
w7938940 2018-01-23 16:36:28 +08:00
|
23
jyjmrlk 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 |