2017-02-20 100 views
2

Недавно я узнал о ES6 итераторе отправился на помощь массивов JS. Я искал об этом, но все еще смущался своей философией дизайна, , потому что другие методы все еще были в порядке.Что нужно итератору в массивах JavaScript?

С другой стороны, мне сказали не использовать его!

var arr = ['w', 'y', 'k', 'o', 'p']; 
var eArr = arr[Symbol.iterator](); 

// your browser must support for..of loop 
// and let-scoped variables in for loops 

for (let letter of eArr) { 
    console.log(letter); 
} 

Было ли это только из-за for..of поддержки?

Конечно, эта функция не была добавлена ​​к объектам JS.

+2

Итераторы используются для 'for/of' и для генераторов. Вся концепция наличия большого количества типов (массив, набор, карта, синтаксис распространения, синтаксис отдыха, любой генератор), которые все можно повторить точно так же, действительно очень полезен. Он создает общий механизм, который может использовать много вещей, без необходимости создания нового механизма для каждого типа. – jfriend00

+0

Например, конструктор объекта 'Set' принимает любой итеративный аргумент. Технически это означает, что любой объект, который поддерживает контракт '[Symbol.iterator]', может быть передан там без кода, который объект 'Set' должен знать ничего, кроме как выполнить общую итерацию. Очень полезно. – jfriend00

+0

Спасибо, Но почему сообщество, стоящее за этой тенденцией (по крайней мере, вопросы и ответ на вопрос о Stackoverflow), предлагает не использовать его? –

ответ

3

Причины введения символов, таких как [Symbol.iterator], включают в себя то, что он позволяет определять его также для пользовательских объектов, и поэтому делает их доступными для for ... of, синтаксиса распространения и других конструкций, которые могут использоваться с итерами.

И поскольку эта возможность была доступна, логично было также реализовать ее таким образом для стандартных объектов, которые должны были выставлять итеративное поведение, например массивы. Это делает его еще более последовательным: как стандартные, так и пользовательские объекты теперь будут подвергать итерабельной возможности, если и только тогда, когда они определяют [Symbol.iterator].

Теперь методы (например, Array.from) и конструкторы (например, Set) становятся доступными, которые требуют только итератор, чтобы передать им, что может быть массивом, но не имеют быть. Это открывает возможности потерять связь, где разные библиотеки могут даже общаться на основе этого iterable protocol.