@soulmatesneverdie

Цифровые свойства объекта?

Читаю о переборе элементов массива. В главе указывается на то, что для массивов не рекомендуется использовать цикл for...in по такой причине: "Цикл for..in выведет все свойства объекта, а не только цифровые.

В браузере, при работе с объектами страницы, встречаются коллекции элементов, которые по виду как массивы, но имеют дополнительные нецифровые свойства. При переборе таких «похожих на массив» коллекций через for..in эти свойства будут выведены, а они как раз не нужны.
".

У меня,как у новичка, возник вопрос. А что же такое цифровые свойства объекта? Приведите, пожалуйста примеры. Спасибо
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В данном случае под "цифровыми" свойствами массива подразумеваются элементы, доступные по числовым индексам. Цикл for ... in проходит не по индексам, а по всем перечислимым свойствам объекта.
var t = [];
t[0] = 'a';
t[100] = 'b';
t.some = 'x';
for (k in t) {
  console.log(k, t[k]);
}

0 a
100 b
some x
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
for(k in { x: 1, y: 2 }) { ... }
k примет значения "x" и "y" в теле.
Поскольку массив является объектом с ключами, которые являются числами, в цикле for(k in [1, 2]) { ... } k пройдёт значения "0" и "1".
Однако, объект-массив содержит ещё некоторые поля, например, "length", который, однако, не проходит итератор. Если я правильно помню, в ES3 это было жестко вшито в семантику языка как исключение, а в ES5 это обыгрывается тем, у полей появились атрибуты, причём поле "length" имеет дескриптор enumerable.

В процитированном фрагменте говорится буквально следующее: слева от in не обязательно будет экземпляр Array, даже если у этого объекта есть поля "0", "1" и т.п., при этом могут быть и другие поля, которые имеют заранее неизвестные дескрипторы. И стоит быть готовым к тому, что k в цикле for(k in obj) {...} может принять строковое значение, которое нельзя привести к числу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы