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



实际上,这个问题是Can(a==1&&a==2&&a==3(是否求值为true的扩展。

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

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

因此,以下代码将按预期工作。

const a = {
i: 1,
toString: function () {
return a.i++;
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}

然而,在strict equality (===)。JavaScript引擎不会调用.valueOf.toStringSymbol.toPrimitive等方法。

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

const a = {
i: 1,
toString: function () {
return a.i++;
}
}
if(a === 1 && a === 2 && a === 3) {
console.log('Never catch!');
}

其他页面上的一些方法使用严格的等式,只是避免使用toStringvalueOf的方法。

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!');
}

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

如果你想允许的话,链接问题中的其他方法将在严格平等的情况下工作:

  • 在变量名中使用不可见字符
  • 使用具有种族条件的工人
  • 使用伪if作为函数
  • 使用大整数不精确性

最新更新