是否有可能 a === 1 && a === 2 & a === 3 在 Javascript 中返回 true?

Ngu*_*ong 0 javascript compare ecmascript-6

实际上,这个问题是Can (a== 1 && a ==2 && a==3) ever评估为真的扩展?.

我们可能知道,松散相等运算符 (==)的秘密将尝试将两个值转换为公共类型。因此,将调用一些函数。

ToPrimitive(A)通过调用 A 上的不同序列A.toStringA.valueOf 方法,尝试将其对象参数转换为原始值。

所以下面的代码将按预期工作。

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}
Run Code Online (Sandbox Code Playgroud)

但是, 的情况下的问题strict equality (===)。方法如.valueOf.toStringSymbol.toPrimitive不会被JavaScript引擎调用。

我该如何解决?任何帮助,将不胜感激。

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a === 1 && a === 2 && a === 3) {
  console.log('Never catch!');
}
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 7

其他页面上的一些方法严格相等,只需避免使用toString或 的方法valueOf

let num = 1;
Object.defineProperty(window, 'a', { get() { return num++ } });
// or use `with` and an object with a getter instead of putting it on the window

if(a === 1 && a === 2 && a === 3) {
  console.log('Never catch!');
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为a它不是一个普通的变量——它是窗口上的一个 getter,所以当标识符a被引用时,getter 运行并可以返回任何值。在这里,它将返回一个递增的整数。

如果您希望允许,链接问题中的其他方法将严格相等: