javascript — forEach для массива неопределенного, созданного конструктором Array

forEach для массива undefined, созданного конструктором Array

Глядя на упрощенную реализацию .forEach() может помочь.

 Array.prototype.my_for_each = function(callback, thisArg) { for (var i = 0; i {amp}lt; this.length; i  ) { if (i in this) { callback.call(thisArg, this[i], i, this); } } }; 

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

Если in показывает, что индекс существует, обратный вызов вызывается.


Итак, учитывая этот массив:

 var arr = ["foo", "bar", "baz"]; 

Это выведет все 3 элемента:

 arr.my_for_each(function(item) { console.log(item); }); // "foo" "bar" "baz" 

Но если мы используем delete для удаления члена, это оставляет дыру в массиве, которая теперь будет пропущена.

 delete arr[1]; arr.my_for_each(function(item) { console.log(item); }); // "foo" "baz" 

Когда вы создали массив с помощью Array(5) , он создал его без элементов, но с длиной .length установленной на 5 . Так что это пример разреженного массива (очень редкий в данном случае). Поскольку ни один из индексов не будет найден in , обратный вызов никогда не вызывается.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector