Эта статья нуждается в редакционном обзоре. Как вы можете помочь.
Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.
Это экспериментальная технология, часть предложения Harmony (ECMAScript 7).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.
Синтаксис array comprehension - это JavaScript выражение, которое позволяет быстро создавать новый массив из существующего. Comprehensions существуют во многих языках программирования, и грядущий стандарт ECMAScript 7 также определяет array comprehensions для JavaScript.
See below for differences to the old array comprehension syntax in SpiderMonkey, based on proposals for ECMAScript 4.
Ниже показаны различия между старым синтаксисом array comprehension в SpiderMonkey, основанном на черновиках для ECMAScript 4.
Синтаксис
[for (x of итерируемый_объект) x] [for (x of итерируемый_объект) if (условие) x] [for (x of итерируемый_объект) for (y of итерируемый_объект) x + y]
Описание
Внутри array comprehensions допустимо использование двух видов компонентов:
Итерация for-of всегда является первым компонентом. Допустимо использование нескольких for-of итераций или условных операторов if.
Примеры
Простые array comprehensions
[for (i of [ 1, 2, 3 ]) i*i ]; // [ 1, 4, 9 ] var abc = [ "A", "B", "C" ]; [for (letters of abc) letters.toLowerCase()]; // [ "a", "b", "c" ]
Array comprehensions с условным оператором "if"
var years = [ 1954, 1974, 1990, 2006, 2010, 2014 ]; [for (year of years) if (year > 2000) year]; // [ 2006, 2010, 2014 ] [for (year of years) if (year > 2000) if(year < 2010) year]; // [ 2006], the same as below: [for (year of years) if (year > 2000 && year < 2010) year]; // [ 2006]
Array comprehensions в сравнении с map
и filter
Простой способ понять синтаксис array comprehension - это сравнить его с методами Array map
and filter
:
var numbers = [ 1, 2, 3 ]; numbers.map(function (i) { return i * i }); numbers.map(i => i*i); [for (i of numbers) i*i ]; // all are [ 1, 4, 9 ] numbers.filter(function (i) { return i < 3 }); numbers.filter(i => i < 3); [for (i of numbers) if (i < 3) i]; // all are [ 1, 2 ]
Array comprehensions с двумя массивами
Использование двух итераторов for-of для работы с двумя массивами:
var numbers = [ 1, 2, 3 ]; var letters = [ "a", "b", "c" ]; var cross = [for (i of numbers) for (j of letters) i+j]; // [ "1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c" ] var grid = [for (i of numbers) [for (j of letters) i+j]]; // [ // ["1a", "1b", "1c"], // ["2a", "2b", "2c"], // ["3a", "3b", "3c"] // ] [for (i of numbers) if (i > 1) for (j of letters) if(j > "a") i+j] // ["2b", "2c", "3b", "3c"], the same as below: [for (i of numbers) for (j of letters) if (i > 1) if(j > "a") i+j] // ["2b", "2c", "3b", "3c"] [for (i of numbers) if (i > 1) [for (j of letters) if(j > "a") i+j]] // [["2b", "2c"], ["3b", "3c"]], not the same as below: [for (i of numbers) [for (j of letters) if (i > 1) if(j > "a") i+j]] // [[], ["2b", "2c"], ["3b", "3c"]]
Спецификации
Was initially in the ECMAScript 6 draft, but got removed in revision 27 (August 2014). Please see older revisions of ES 6 for specification semantics. An updated version is expected to be in a new ES2016 / ES7 draft.
Совместимость с браузерами
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | Нет | 30 (30) | Нет | Нет | Нет |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | Нет | Нет | 30.0 (30) | Нет | Нет | Нет |
Специфика работы SpiderMonkey
let
as an identifier is not supported aslet
is currently only available to JS version 1.7 and XUL scripts tags.- Destructuring in comprehensions is not supported yet (ошибка 980828).
Differences to the older JS1.7/JS1.8 comprehensions
- ES7 comprehensions create one scope per "for" node instead of the comprehension as a whole.
- Old:
[()=>x for (x of [0, 1, 2])][1]() // 2
- New:
[for (x of [0, 1, 2]) ()=>x][1]() // 1, each iteration creates a fresh binding for x.
- Old:
- ES7 comprehensions start with "for" instead of the assignment expression.
- Old:
[i * 2 for (i of numbers)]
- New:
[for (i of numbers)
i * 2
]
- Old:
- ES7 comprehensions can have multiple
if
andfor
components. - ES7 comprehensions only work with
and not withfor...of
iterations.for...in