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

Я думаю, может быть, я пропустил что-то в 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? Что мне не хватает? Где-то что-то пропустил в спецификации. Спасибо.


person BuddyJoe    schedule 16.05.2011    source источник
comment
Я думал, что new Object() — это фишка Microsoft JScript? Нет, совсем нет. Это стандартный JavaScript (хотя он многословный, просто используйте вместо него {}, который отлично работает как в JScript, так и в других реализациях ECMAScript).   -  person T.J. Crowder    schedule 16.05.2011


Ответы (5)


a = new Object()

а также

a = []

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

a = {}

а также

a = new Object()

являются.

person Anurag    schedule 16.05.2011
comment
Ok. Спасибо. Кажется, я получаю награду за глупый вопрос дня. - person BuddyJoe; 16.05.2011

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

person Dan Davies Brackett    schedule 16.05.2011

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

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

JSON.stringify(a); // returns value ["test"]
person user113716    schedule 16.05.2011

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

Объекты по умолчанию — это все карты key->data, экземпляры которых создаются с помощью фигурных скобок {}

Если бы ты сделал

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

Он должен работать.

person Quintin Robinson    schedule 16.05.2011
comment
... может сбивать с толку, потому что это не ассоциативный массив На самом деле, это еще больше сбивает с толку, потому что это является ассоциативным массивом, а нечисловые ключи (имена свойств ) полностью допустимы в JavaScript, поскольку массивы на самом деле не являются массивами. Но они будут удалены, если вы преобразуете массив в JSON, потому что нотация массива JSON не допускает нечисловых ключей (по уважительной причине очень немногие языки поддерживают их). - person T.J. Crowder; 16.05.2011

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

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

So...

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

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