Цикл по пустому массиву javascript возвращает функции объекта массива - PullRequest
2 голосов
/ 01 мая 2011

Я заметил, что в моем javascript, если я создаю пустой массив, перебираю его как ассоциативный массив и распечатываю содержимое, он возвращает то, что выглядит как функции из самого класса Array Object. Вот мой код:

var test = new Array();
for(var i in test){
    document.write(i + " " + test[i] + "<br>");
}
alert(test.length); // this returns 0

Приведенный выше код печатает следующее (я опускаю некоторые выходные данные, так как они довольно длинные)

$family function (){return u; }
$constructor function Array() { [native code] }
pop function pop() { [native code] }
push function push() { [native code] }
reverse function reverse() { [native code] }
shift function shift() { [native code] }
sort function sort() { [native code] }
splice function splice() { [native code] }
unshift function unshift() { [native code] }
concat function concat() { [native code] }
join function join() { [native code] }
slice function slice() { [native code] }
indexOf function indexOf() { [native code] }
etc...

Я заметил, что если я перебираю массив с помощью цикла for, то есть:

for(var i = 0; i < test.length; i++)

браузер ничего не распечатывает (что и должно происходить)

Может кто-нибудь объяснить, почему я получаю набор функций из пустого массива, когда я перебираю его другим способом? В случае, если это имеет значение, я использую mootools v1.3. Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 01 мая 2011

Избавьтесь от всего, что распространяется Array.prototype. Расширение прототипа типов по умолчанию, таких как Array или Object, плохо и приводит к таким проблемам.

Простой способ обойти проблемы при сохранении расширений прототипа - добавить проверку if(!test.hasOwnProperty(i)) continue;. (obj.hasOwnProperty(key) равно true, если свойство находится на самом объекте, а не только где-то в его цепочке прототипов)

Кроме того, вы не должны использовать циклы for..in при итерации массивов - в этом случае используйте for(var i = 0; i < array.length; i++).

0 голосов
/ 21 декабря 2014

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

function createArrayOfEmptyObjects(size) {
    return Array.apply(0, new Array(size).map(function(){return {};});
}

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

...