При итерации по значениям, почему typeof (оценивает) возврат “строка”, когда значение является числом? JavaScript

Я использую 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, и любая справка высоко ценится, спасибо.

5
задан Mark 29 May 2010 в 04:03
поделиться

1 ответ

Причина, по которой вы видите "строку", возвращаемую в первом цикле, заключается в том, что 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
  }
}

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

6
ответ дан 14 December 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: