#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, обычно свойства (т. е. те, у которых нет индекса массива для их имени) не влияют на длину.