Понимание объекта JavaScript (значение)

Я понимаю, что следующий код обертывает число в объект:

var x = Object(5);

Поэтому я ожидаю и понимаю следующее:

alert(x == 5); //true
alert(x === 5); //false

Однако я также понимаю, что объект представляет собой список пары ключевых/значений. Поэтому я ожидал, что следующее будет отличаться:

alert(JSON.stringify(5)); //5
alert(JSON.stringify(x)); //5

Как выглядит структура х? И почему это не похоже на формат пары ключ/значение?

Ответ 1

Конструктор объектов создает обертку объекта для данного значения типа, соответствующего значению.

Итак, вы получаете Number object с примитивным значением 5 при передаче числа до Object

var x = Object(5);

это точно так же, как и делать

var x = new Number(5);

при вызове valueOf() на обоих, вы возвращаете примитивное значение 5 снова, поэтому его строковое значение дает то же самое, что и строгая число 5, объект преобразуется в это примитивное значение перед строкой

В спецификации JSON.stringify указано

Объекты Boolean, Number и String преобразуются в соответствующие примитивные значения во время строкования в соответствии с традиционной семантикой преобразования.

Ответ 2

var x = Object(5);

Это поле 5 как объект, поэтому Stringify просто отменяет значение.

Если вы назначаете ключ/значение объекту, Stringify будет отображаться как таковой:

var x = {};
x.foo = "bar";

Это javascript Duck Typing - в основном, если он похож на утку и звучит как утка, это, должно быть, утка, но замените утку типом данных, например int или collection... https://en. m.wikipedia.org/wiki/Duck_typing

Ответ 3

В консоли javascript я ввел следующее:

> var x = Object(5);
> x
[Number: 5]
> JSON.stringify(5)
'5'
> JSON.stringify(x)
'5'

Когда вы используете Object(5), вы создаете объект с парами ключ/значение. Однако JSON.stringify() превращает этот объект в это строковое представление - "5". Вызов JSON.stringify() в литеральном значении, таком как примитивное число 5, также возвращает его строковое представление - "5". Вы преобразовываете как объект, так и примитив в строки, поэтому они равны.