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

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

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 () , а что-то еще.

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

9
задан Saul 29 August 2011 в 11:12
поделиться