微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

其实这个问题是Can (a== 1 && a ==2 && a==3) ever evaluate to true?的延伸。

我们可能知道,loose equality operator (==) 的秘密会尝试将两个值转换为通用类型。因此,将调用一些函数

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 (===) 的问题。 .valueOf.toStringSymbol.toPrimitive方法不会被 JavaScript 引擎调用

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

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 运行并可以返回任何值。在这里,它将返回一个递增的整数。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。