Каково стандартное определение равенства объектов для "=="? - PullRequest
9 голосов
/ 29 августа 2011

Там кажется несоответствием между общим пониманием == и тем, что оно на самом деле делает.Чтобы дать некоторое представление об этой проблеме:

typeof new Number(1); // returns object
typeof new String(1); // returns object
typeof 1;             // returns number

По-видимому, оба типа Number и String имеют тип object.Там нет ничего удивительного.Однако вещи становятся интересными для ==, который должен возвращать true, когда операнды равны независимо от их типа.

Согласно a отчасти авторское описание:

Операторы пытаются преобразовать объект в примитивное значение, строковое или числовое значение, используя методы объектов valueOf и toString.Если эта попытка преобразовать объект не удалась, генерируется ошибка времени выполнения.

Короче говоря, == должен сравнивать объекты по их примитивному значению.Удивительно:

var numa = new Number(1);
var numb = new Number(1);
var stri = new String(1);

numa.toString() == stri.toString(); // returns true, as expected
numa.valueOf() == stri.valueOf();   // returns true, as expected

numa == stri; // returns false (?!)
numa == numb; // returns false (?!!!)

numa == numa; // returns true, as expected

var numx = 1;

numa == numx; // returns true (?)
numb == numx; // returns true (?)
stri == numx; // returns true (?)

Появляется, когда оба операнда являются объектами, оператор == не использует ни toString(), ни valueOf(), а что-то еще.

Что такое стандартопределение равенства объектов для ==?

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Я полагаю, что то, что вы видите там, и что осталось от "несколько авторитетного описания", - это то, что == пытается преобразовать объект в примитив, если и только если его сравнение является примитивом. Если оба операнда являются объектами, они сравниваются как объекты, и проверка на равенство выполняется только в том случае, если они являются одним и тем же объектом (т. Е. Одним и тем же экземпляром - разные объекты с одинаковыми атрибутами различаются, как вы видите в вашем numa == numb случае ).

3 голосов
/ 29 августа 2011

Короче говоря, когда операнды являются объектами, тогда == сравнивает ссылки.

Из официальная спецификация , стр. 80:

11.9.3 Алгоритм сравнения абстрактного равенства

  • Если тип (x) совпадает с типом (y), то

    a - e опущено,потому что не применяется к объектам

    f.Верните true, если x и y относятся к одному и тому же объекту.В противном случае верните false.

...