Там кажется несоответствием между общим пониманием ==
и тем, что оно на самом деле делает.Чтобы дать некоторое представление об этой проблеме:
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()
, а что-то еще.
Что такое стандартопределение равенства объектов для ==
?