【问题标题】:Is there any value for what x === x returns false without NaN?x === x 在没有 NaN 的情况下返回 false 是否有任何价值?
【发布时间】:2013-11-26 03:43:42
【问题描述】:

x === x 在没有 NaN 的情况下返回 false 是否有任何价值?

例如:

> x = 1
1
> x === x
true
> x = {}
{}
> x === x
true
> x = new Date()
Wed Nov 13 2013 15:44:22 GMT+0200 (EET)
> x === x
true
> x = NaN
NaN
> x === x
false

我看到x === x 返回false 的唯一值是isNaN(x) === true

对于x === x 返回false,是否还有另一个x 值?欢迎提供官方参考!

【问题讨论】:

  • x 是什么?也许在您的示例中使用xy 或其他内容。
  • @putvande 一个变量?
  • 答案是否定的,但我现在找不到参考。
  • @Tibos 是的,这很有用。
  • @イオニカビザウ 您的个人资料消息小部件真的很有趣!代码在任何地方都可用吗?

标签: javascript


【解决方案1】:

两个相等的非NaN之间的严格比较总是正确的(SLaks's answer 正确引用the spec)。但是,表达式 x 可能会在评估相等性期间更改其。使用访问器属性描述符(即属性获取器)时,属性访问可能会发生这种情况:

foo = {};
Object.defineProperty(foo, "bar", {
    get: function() {
        return Math.random();
    }
})

foo.bar === foo.bar; // false

如果您对全局对象 window(或 Node 中的 global)执行此操作,那么您会看到全局范围变量的 x === x 比较失败:

Object.defineProperty(window, "bar", {
    get: function() {
        return Math.random();
    }
})

bar === bar; // false

【讨论】:

  • @ComFreek 好吧,该死,我没有考虑过。我会把它添加到可能的答案中!
  • 这不是相同值的情况;这是同一表达式计算不同值的情况。
  • @ComFreak - 我的眼睛!护目镜什么都不做!
  • @YannVernier,是的,但值得一提。
  • @apsillers 这太好了!在 NodeJS 和浏览器中也适用于 this 对象。
【解决方案2】:

规范列出了 exact rules 以表示严格相等。
没有其他这样的情况,除非你算上+0-0

SameValue algorithm(用于验证对只读定义属性的更改)没有此类例外。

【讨论】:

  • 仍然,+0 === +0-0 === -0,所以即使是那些也出局了。
  • 根据规范,+0 和 -0 确实比较相等。但是,规范也没有列出所有数字的情况,这就是为什么默认返回错误的原因:无穷大不被认为是相等的,即使它们共享符号。
  • @Yann, 1/0 === 1/0 在 Firefox 上对我来说是 true
  • +0 === -0 返回true。为什么它们很重要?
  • 澄清一下:严格相等不区分-0+0,而SameValue确实区分。
猜你喜欢
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多