【问题标题】:Is it possible a === 1 && a === 2 & a === 3 return true in Javascript? [duplicate]是否有可能 a === 1 && a === 2 & a === 3 在 Javascript 中返回 true? [复制]
【发布时间】:2021-07-11 23:42:41
【问题描述】:

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

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

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

if(a === 1 && a === 2 && a === 3) {
  console.log('Never catch!');
}

【问题讨论】:

  • 请阅读您所链接问题的所有答案。许多人也会使用===
  • @Bergi 我做到了。但他们都没有指出它适用于strict equality (===)。此外,我做了谷歌,搜索所以没有这样的现有主题。因此,IMO,值得拥有这样的特定主题:)

标签: javascript ecmascript-6 compare


【解决方案1】:

其他页面上的一些方法使用严格相等,只是避免使用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 运行并且可以返回任何值。在这里,它将返回一个递增的整数。

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

【讨论】:

  • 你能解释一下它是如何工作的吗?谢谢。
  • 请注意,您不能返回一个对象并期望它使用任何数字 ===,因为它会检查引擎盖下的类型。
猜你喜欢
  • 1970-01-01
  • 2011-12-04
  • 2017-01-30
  • 2023-04-04
  • 2020-02-15
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多