JSON.stringify () и объекты JavaScript - PullRequest
6 голосов
/ 16 мая 2011

Я думаю, что, может быть, я пропустил что-то в 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"}

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

Ответы [ 5 ]

20 голосов
/ 16 мая 2011
a = new Object()

и

a = []

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

a = {}

и

a = new Object()

.

3 голосов
/ 16 мая 2011

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

1 голос
/ 16 мая 2011

Установка свойства 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"}"
1 голос
/ 16 мая 2011

Да, вы используете [] для определения вашего объекта, который на самом деле является массивом, но в зависимости от языка, с которого вы пришли, может возникнуть путаница, поскольку это не ассоциативный массив.карты key-> data и создаются в фигурных скобках {}

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

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

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

1 голос
/ 16 мая 2011

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

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

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