JavaScript для ... в сравнении с - PullRequest
       43

JavaScript для ... в сравнении с

449 голосов
/ 28 октября 2008

Как вы думаете, есть большая разница в циклах for ... in и for? Какое «для» вы предпочитаете использовать и почему?

Допустим, у нас есть массив ассоциативных массивов:

var myArray = [{'key': 'value'}, {'key': 'value1'}];

Итак, мы можем повторить:

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

И

for (var i in myArray)

Я не вижу большой разницы. Есть ли проблемы с производительностью?

Ответы [ 23 ]

0 голосов
/ 02 января 2018

Хотя они оба очень похожи, есть небольшая разница:

var array = ["a", "b", "c"];
array["abc"] = 123;
console.log("Standard for loop:");
for (var index = 0; index < array.length; index++)
{
  console.log(" array[" + index + "] = " + array[index]); //Standard for loop
}

в этом случае вывод:

СТАНДАРТ ДЛЯ ПЕТЛИ:

ARRAY [0] = A

ARRAY [1] = B

ARRAY [2] = C

console.log("For-in loop:");
for (var key in array)
{
  console.log(" array[" + key + "] = " + array[key]); //For-in loop output
}

в то время как в этом случае вывод:

ВХОДНАЯ ПЕТЛЯ:

ARRAY [1] = B

ARRAY [2] = C

ARRAY [10] = D

ARRAY [ABC] = 123

0 голосов
/ 21 ноября 2016

Между ними есть важное различие. For-in перебирает свойства объекта, поэтому, когда case является массивом, он будет перебирать не только свои элементы, но и функцию «удалить», которая у него есть.

for (var i = 0; i < myArray.length; i++) { 
    console.log(i) 
}

//Output
0
1

for (var i in myArray) { 
    console.log(i) 
} 

// Output
0 
1 
remove

Вы можете использовать for-in с if(myArray.hasOwnProperty(i)). Тем не менее, при переборе массивов я всегда предпочитаю избегать этого и просто использовать оператор for (;;).

0 голосов
/ 09 октября 2012

Будь осторожен !!! Я использую Chrome 22.0 в Mac OS, и у меня возникают проблемы с каждым синтаксисом.

Я не знаю, является ли это проблемой браузера, проблемой JavaScript или какой-то ошибкой в ​​коде, но это ОЧЕНЬ странно. Снаружи объекта работает отлично.

var MyTest = {
    a:string = "a",
    b:string = "b"
};

myfunction = function(dicts) {
    for (var dict in dicts) {
        alert(dict);
        alert(typeof dict); // print 'string' (incorrect)
    }

    for (var i = 0; i < dicts.length; i++) {
        alert(dicts[i]);
        alert(typeof dicts[i]); // print 'object' (correct, it must be {abc: "xyz"})
    }
};

MyObj = function() {
    this.aaa = function() {
        myfunction([MyTest]);
    };
};
new MyObj().aaa(); // This does not work

myfunction([MyTest]); // This works
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...