Там кажется несоответствие между общим пониманием ==
и тем, что он на самом деле делает. Чтобы дать некоторую предысторию проблемы:
typeof new Number(1); // returns object
typeof new String(1); // returns object
typeof 1; // returns number
По-видимому, и Number
, и String
относятся к типу объекта
. В этом нет ничего удивительного. Однако все становится интересно для ==
, который должен возвращать 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 ()
, а что-то еще.
Каково стандартное определение равенства объектов для ==
?