Я использую Google Chrome для этого теста: Вопреки интуиции первые предупреждения цикла "представляют в виде строки" 3 раза, в то время как второй цикл предупреждает времена "номер" 3.
numarray = [1, 2, 3];
//for-each loop
for(num in numarray)
alert(typeof(num));
//standard loop
for(i=0; i<numarray.length; i++)
alert(typeof(numarray[i]));
Я ожидал, что оба цикла предупредят времена "номер" 3. Как первый цикл реализован в JavaScript? Другими словами, если для - каждый - синтаксический сахар, что его эквивалент использует стандартный цикл?
Кроме того, есть ли некоторый способ выполнить итерации по пространству имен объекта с помощью стандартного цикла? Я надеюсь касаться каждых из методов некоторого объекта и атрибутов с помощью цикла второго вида. Я плохо знаком с JavaScript, и любая справка высоко ценится, спасибо.
Причина, по которой вы видите "строку", возвращаемую в первом цикле, заключается в том, что num
относится к индексу массива , а не к значению numarray
в этот индекс. Попробуйте изменить свой первый цикл на alert num
вместо typeof num
, и вы увидите, что он выплевывает 0, 1 и 2, которые являются индикаторами, а не значениями вашего множество.
Когда вы используете цикл for in
, вы перебираете свойства объекта, что не совсем эквивалентно циклу for
во втором примере. В действительности массивы в JavaScript - это просто объекты с последовательными номерами в качестве имен свойств. Они обрабатываются как строки в том, что касается typeof
.
Изменить:
Как указывает Мэтью, вам не гарантируется получение элементов в массиве в каком-либо определенном порядке при использовании цикла for in
, и отчасти по этой причине это не так. рекомендуется таким образом перебирать массивы.
filip-fku спрашивает, когда было бы полезно использовать для в
, учитывая такое поведение. Один из примеров - это когда сами имена свойств имеют значение, что на самом деле не относится к указателям массива. Например:
var myName = {
first: 'Jimmy',
last: 'Cuadra'
};
for (var prop in myName) {
console.log(prop + ': ' + myName[prop]);
}
// prints:
// first: Jimmy
// last: Cuadra
Также стоит отметить, что for in
циклы также будут перебирать свойства цепочки прототипов объекта. По этой причине обычно именно так вы хотите создать цикл for in
:
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// do something
}
}
Это проверяет, было ли свойство определено самим объектом, а не объектом, от которого оно наследуется. через цепочку прототипов.