Есть ли какое-либо значение для x === x возвращает false без NaN?

Есть ли значение, для которого x === x возвращает false без NaN?

Например:

> 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 === x возвращает false? Официальная ссылка будет приветствоваться!

Ответы

Ответ 1

Строгое сравнение двух равных значений не NaN всегда будет истинным (ответ SLaks правильно цитирует спецификация). Тем не менее, выражение x позволяет изменить его значение при оценке равенства. Это может произойти при доступе к свойствам при использовании дескрипторов свойств доступа (т.е. Свойств getters):

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

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

Если вы сделаете это для глобального объекта window (или global в Node), вы можете увидеть сбой сравнения x === x для глобальной переменной:

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

bar === bar; // false

Ответ 2

В спецификации перечислены точные правила для строгого равенства.
Других подобных случаев нет, если вы не считаете +0 и -0.

Алгоритм SameValue (используемый для проверки изменений в свойствах, доступных только для чтения) не имеет таких исключений.