Понимание объекта 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". Вы преобразовываете как объект, так и примитив в строки, поэтому они равны.