JSON.stringify() и объекты JavaScript

#javascript #ajax #json #stringify

#javascript #ajax #json #stringify

Вопрос:

Я думаю, может быть, я что-то пропустил в JavaScript, что я только сейчас начинаю понимать.

Я попробовал этот код в консоли Chrome:

 a = [];
a.name = "test";
JSON.stringify(a); 
// which returns value []
a = new Object();
a.name = "test";
JSON.stringify(a); 
// which returns value {"name":"test"}
  

В чем разница?
Я думал, что new Object () — это Microsoft JScript? Чего я не понимаю?
Должно быть, где-то что-то пропустил в спецификации. Спасибо.

Комментарии:

1. «Я думал, что new Object() — это Microsoft JScript?» Нет, вовсе нет. Это стандартный JavaScript (хотя он подробный, просто используйте {} вместо него — который отлично работает как в JScript, так и в других реализациях ECMAScript).

Ответ №1:

 a = new Object()
  

и

 a = []
  

не эквивалентны. Но,

 a = {}
  

и

 a = new Object()
  

являются.

Комментарии:

1. ОК. Спасибо. Чувствую, что теперь я получаю награду за свой глупый вопрос дня.

Ответ №2:

new Object() эквивалентно {} (за исключением случаев, когда это не из-за странных проблем с переопределением — но пока игнорируйте это.) [] эквивалентно new Array() , к которому вы затем добавляете .name свойство. JSON упорядочивает массивы особым образом, который не фиксирует произвольное присвоение свойств самому массиву.

Ответ №3:

Для данных в формате JSON массивы должны иметь числовые индексы, а объекты — пары ключ / значение.

 a = [];
a[ 0 ] = "test";

JSON.stringify(a); // returns value ["test"]
  

Ответ №4:

Да, вы используете [] для определения вашего объекта, который на самом деле является массивом, но в зависимости от языка, с которого вы пришли, может возникнуть путаница, потому что это не ассоциативный массив.

Все объекты по умолчанию представляют собой сопоставления ключ-> данные и создаются с помощью фигурных скобок {}

Если вы сделали

 a = {};
a.name = "test";
JSON.stringify(a); 
  

Это должно сработать.

Комментарии:

1. «… может сбивать с толку, потому что это не ассоциативный массив» На самом деле, это еще более запутанно, потому что это ассоциативный массив, а нечисловые ключи (имена свойств) вполне допустимы в JavaScript, поскольку массивы на самом деле не являются массивами . Но они будут удалены, если вы преобразуете массив в JSON, потому что нотация массива JSON не допускает нечисловых ключей (по уважительной причине, их поддерживают очень немногие языки).

Ответ №5:

Установка name свойства массива ничего не делает с его сериализованной (JSON-stringified) формой. Это не помещает запись в массив. Для этого вам нужно a.push('test') .

Объекты являются стандартными частями Javascript (см., например, документы MDC). Обычный способ создания объекта — с помощью {} , но new Object() это тоже работает.

Итак…

 var a = [];
a.push('test');
JSON.stringify(a); //"["test"]"

a = {};
a.name = 'test';
JSON.stringify(a); //"{"name":"test"}"