Массив Javascript json печатает пустой, но внутри него есть объект

#javascript

Вопрос:

Я пытаюсь понять, почему Javascript печатает пустой массив, когда внутри него должно быть хотя бы одно значение. Пожалуйста, проверьте этот код:

 detail = [];
detail.cat1=[];
detail.cat2=[];
detail.cat3=[];
detail.cat4=[];

var newEntry = {"cod":"01","dt":"2021-10-02 09:07:21.205-07:00"};

detail.cat2.push(newEntry);
console.log(detail);
console.log(detail.length);
console.log(detail.cat2);
 

Результаты таковы:

 > Array []
> 0
> Array [Object { cod: "01", dt: "2021-10-02 09:07:21.205-07:00" }]
 

Как он мог напечатать [], если у меня внутри один объект? И как длина может быть равна нулю? Я использовал любой онлайн-редактор Javascript, и результат тот же.

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

1. detail это должен быть объект, а не массив.

2. Массивы могут иметь именованные свойства, поскольку они также являются объектами, но по умолчанию они не отображаются в консоли.

3. Объект, который вы храните в массиве, хранится в свойстве массива (в данном случае cat2; именно поэтому массив по-прежнему имеет длину 0). Использование свойства массива, как правило, является халтурным; вместо этого вы действительно должны использовать объект.

4. Это может зависеть от среды, в которой вы работаете. Консоль разработчика Chrome и node.js распечатайте все.

5. Спасибо за ответы. Теперь я знаю, что должен использовать объект и изменить деталь на деталь = {}; работает. Мне было просто любопытно, почему массив не работал даже с выполненной позицией.

Ответ №1:

Поскольку массив на самом деле является объектом, мы можем добавлять методы/свойства непосредственно в отдельный массив.

Затем, если вы хотите, например, увидеть ключи в объекте, Object.keys не увидит его, но отразит.ownKeys ().

Отраженная версия defineProperty вернет успех или сбой, в то время как Object возвращает переданный объект.

Помните, что функция Reflect.preventExtensions () (как там сказано) не позволит вам или другим лицам расширять их.

Что касается вопроса о длине, «.длина» дает длину значений, а не свойств, поэтому она по-прежнему дает 0

Ответ №2:

Массив-это индексированная коллекция значений, означающая, что вы можете поместить элемент в определенный индекс и получить элемент из определенного индекса.

В приведенном ниже примере вы можете видеть, что если в массиве уже есть элементы, то вы можете получить его length length свойство using.

Помните: длина массива равна (highest integer index at which the element is present in array 1)

 const arr = [1, 2, 3, 4];

console.log(arr);   // prints whole array
console.log(arr.length);  // prints length of an array
console.log(arr[2]);  // Element at index 2 

Если вы зададите элемент с определенным индексом, допустим arr[8] = "something" , тогда он length будет 9

 const arr = [];
arr[8] = "something";

console.log(arr.length)   // 9 

Это правда, что массивы являются объектами, поэтому вы можете задавать/получать значения в/из массива. Но если вы зададите свойство, которое не является нумерованным индексом, то оно не увеличит свою длину, но установит свойство для этого объекта массива как:

 const arr = [];

arr["introduction"] = "I'm an array";
arr.property = "This is a property"

console.log(arr.length);
console.log(arr.introduction);
console.log(arr.property); 

Ответ №3:

При отображении массива используется массив по умолчанию.прототип.Обычно вызывается метод toString. Это фактически вызывает Array.prototype.join без аргументов, поэтому создает строку элементов массива, разделенную запятыми.

Метод объединения возвращает только свойства с целочисленным положительным именем (индекс массива, указывающий элемент массива), остальные свойства игнорируются объединением.

Аналогично, только элементы массива влияют на свойство length, обычно свойства (т. е. те, у которых нет индекса массива для их имени) не влияют на длину.