Замена .length
имущества запрещена Chrome. Запустить:
var x = [];
x.length = +Infinity; // Uncaught RangeError: Invalid array length
Так, к счастью, нет риска здесь. For
Завершение цикла Бесконечность. Вероятно, это закончится несколько раньше из-за некоторого конца памяти.
Но все же можно изменить length
просто так. Что произойдет, если мы сделаем это больше?
var x = [9];
console.log(x); // [9]
x.length = 10;
console.log(x); // still [9], although length is 10 this time
// example from Red Mercury
x.forEach(function (item, index) {
console.log('Item', index, item);
});
// will print: Item 0 9
// But...
do {
console.log(x.shift());
} while(x.length > 0); // .shift() and .pop() update .length property
// will print 9 once, and nine times undefined
// probably the same with .pop(), just in reversed order
И меньше?
var x = [9, 10, 14];
console.log(x); // [9, 10, 14]
x.length = 1;
console.log(x); // [9]
// example from Red Mercury
x.forEach(function (item, index) {
console.log('Item', index, item);
});
// will print: Item 0 9
// But...
do {
console.log(x.shift());
} while(x.length > 0);
// will print only 9
Таким образом, хотя большая длина может быть проверена с .forEach()
меньше не может. Не рекомендуется изменять значение длины (потому что .forEach()
и .shift()
начинают «desynchronize»), но в вашем собственном коде это не должно произойти с вами. Я не думаю, что этот язык должен быть полностью пуленепробиваемым, и это невозможно. Реальность проверит его в конце с нарушением скрипта в браузере, и это может сильно ограничить программистов.Если бы у JavaScript был бы правильный массив, а не только массив, подобный объектам, это было бы предотвращено, но это то, что оно есть.
Из того, что я понимаю из вашего вопроса, вы обеспокоены тем, что кто-то перезапишет свойство 'array.length'. Это верно? Если это так, просто используйте любой 'forEach', например @RedMercury, или' for in', чтобы перебрать ваш массив и подсчитать длину. – shriek
По крайней мере, Chrome отклоняет установку 'array.length' до бесконечности:' Uncaught RangeError: недопустимая длина массива'. – Seb
Это очень теоретическая проблема: я знаю, что на практике array.length имеет очень сильное отношение к числу элементов в массиве. –