#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"}"