实际上,这个问题是Can(a==1&&a==2&&a==3(是否求值为true的扩展。
正如我们所知,松散等式运算符(==(的秘密将尝试将两个值转换为一个公共类型。因此,将调用一些函数。
ToPrimitive(A)
尝试将其对象参数转换为基元值,通过调用A.toString
和A.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
、.toString
或Symbol.toPrimitive
等方法。
我该如何解决?如有任何帮助,我们将不胜感激。
const a = {
i: 1,
toString: function () {
return a.i++;
}
}
if(a === 1 && a === 2 && a === 3) {
console.log('Never catch!');
}
其他页面上的一些方法使用严格的等式,只是避免使用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!');
}
这是因为a
不是一个普通变量——它是窗口上的getter,所以当引用标识符a
时,getter会运行并返回任何值。在这里,它将返回一个递增的整数。
如果你想允许的话,链接问题中的其他方法将在严格平等的情况下工作:
- 在变量名中使用不可见字符
- 使用具有种族条件的工人
- 使用伪
if
作为函数 - 使用大整数不精确性