Мои задачи по Javascript
Случайная задача
Список всех задач

Задача 29

Полагаю, сложный вопрос.
var obj =
{
  '-1': 1,
  0: 1,
  1: 5,
  '1': 1,
  2: 1,
  3: undefined,
  length: 10
};

var fe = Array.prototype.forEach;

var sum = 0;

fe.call(obj, function(x){ sum += x; } )

console.log(sum);
Что выведет консоль?
1
2
3
4
5
6
7
8
9
← Задача 28Задача 30 →
Пояснение Объекты в JavaScript в качестве имени свойства могут иметь только тип String или тип Symbol.
В литерале объекта (т.е. в записи между фигурными скобкам) можно не писать кавычки в имени свойства слева от двоеточия.

Строка 1: 5, поставила свойству obj['1'] значение 5, но потом строка '1': 1, изменила это значение на 1.
Кстати, в браузерах с поддержкой ECMAScript 2015 такая дублирующая запись зачем-то перестала считаться синтаксической ошибкой в строгом режиме!

Массивы в JavaScript - самые обыкновенные объекты. Методы массивов работают с массивами, как с объектами.

Мы не знаем код встроенного метода Array.prototype.forEach. Я предполагаю, что там совершенно обычный цикл for со счётчиком, начинающимся с 0 и ограниченным значением свойства 'length' объекта.
Скорее всего, метод даже не проверяет наличие свойства, а просто обращается к свойству obj['i'] и если оно возвращает undefined, то не вызывает callback-фукнцию, а переходит к следующей итерации цикла.
Таким образом, в forEach пропускаются "пустые" элементы массива, а фактически это отсутствующие свойства объекта, при обращении к которым по правилам JS возвращается undefined. Также пропускаются существующие свойства, значением которых является undefined.




Написать сообщение - отзыв, пожелание и т.п.