РЕДАКТИРОВАТЬ: Судя по отзывам, исходная версия этого вопроса больше связана с дизайном, а не со стандартами. Делаем SO-дружественным.
Оригинал:
Должен ли JS-примитив считаться «эквивалентным» объектной версии этого примитива в соответствии со стандартами ECMA?
Пересмотренный вопрос
Существует ли универсальное соглашение о том, как сравнивать объекты с примитивной оболочкой в текущем JavaScript?
var n = new Number(1),
p = 1;
n === p; // false
typeof n; // "object"
typeof p; // "number"
+n === p; // true, but you need coercion.
ИЗМЕНИТЬ:
Как прокомментировал @Pointy, спецификация ECMA (262, S15.1.2.4) описывает метод Number.isNaN()
, который ведет себя следующим образом:
Number.isNaN(NaN); // true
Number.isNaN(new Number(NaN)); // false
Number.isNaN(+(new Number(NaN))); // true, but you need coercion.
Очевидно, такое поведение оправдано тем, что isNaN
вернет true
, ЕСЛИ аргумент приводит к NaN
. new Number(NaN)
не принуждает напрямую, основываясь на том, как работает родной isNaN
.
Кажется, что снижение производительности и сложность преобразования типов и т. д. при прямом использовании собственных оболочек объектов, а не примитивов, на данный момент перевешивают семантические преимущества.
==
и===
... - person Pointy   schedule 03.01.2013{one:1} == {one:1}
возвращает false. - person Shmiddty   schedule 03.01.2013==
, но не равны в смысле===
. Какое именно определение равенства вы ищете? - person pimvdb   schedule 03.01.2013==
. - person Pointy   schedule 03.01.2013console.log([1,2]==[1,2], {one:1}=={one:1});
регистрируетfalse false
- person Shmiddty   schedule 03.01.2013[1, 2]
равно[1, 2]
. В этом случае вам, вероятно, также следует решить для себя, следует ли считать1
иnew Number(1)
равными. Если вы хотите использовать реализацию, точно соответствующую спецификации, используйте==
или===
. - person pimvdb   schedule 03.01.2013{one:1} == {one:1} // false
задумано, потому что каждый объект размещается в другом месте в памяти (?) И считается двумя разными объектами и, следовательно, не эквивалентен. Если бы это былоa = b = {one: 1}
, тоa == b // true
. - person sjhcockrell   schedule 03.01.2013