JavaScript : Вопрос 1 : 17

Возьмём следующий код:

var arr = [3, 4, 5]; 
for (var i in arr){ 
  console.log(i); 
} 

Что выведется в консоль? Какие могут с ним возникнуть проблемы?

 

Уважаемые учащиеся ниже Вы сможете увидеть ответ, перед тем, как ответить, пожалуйста, постарайтесь написать для себя ответ на черновике, и только потом сравните наш ответ с Вашим: 

 

Верно ли наше решение?

Ответ:

For..in итерируется по всем полям объекта [b]и его прототипов[/b] (т.е. проходит по всей цепочке прототипов).

В приведённом в вопросе коде проблем как таковых нет, но они могут появиться при использовании библиотек/полифиллов, которые переопределяют или создают новые свойства для прототипов стандартных конструкторов (таких как Array или Object).

Пример:

var arr = [3, 4, 5]; 
Array.prototype.each = function() {/*some fancy polyfill*/}; 
  
for (var i in arr) { 
    console.log(i); 
} 


Выведет

0 
1 
2 
each 


Чтобы избежать таких проблем, можно воспользоваться методом Object.prototype.hasOwnProperty.

Модифицированный пример, который работает корректно:

var arr = [3, 4, 5]; 
Array.prototype.each = function() {/*some fancy polyfill*/}; 
  
for (var i in arr) { 
    if (arr.hasOwnProperty(i)){ 
        console.log(i); 
    } 
} 


Примечание:
Многие инструменты для статического анализа JavaScript кода считают for .. in без фильтрации с hasOwnProperty не безопасным.
1 балл


© Copyright © 2017 - 2019 Все права защищены. Бесплатное онлайн образование.