From a065e04d529da1d847b5062a12c46d916408bf32 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 21:46:22 -0500 Subject: update based on https://github.com/mdn/yari/issues/2028 --- .../operators/array_comprehensions/index.html | 241 --------------------- .../operators/expression_closures/index.html | 118 ---------- .../operators/generator_comprehensions/index.html | 229 -------------------- 3 files changed, 588 deletions(-) delete mode 100644 files/ru/web/javascript/reference/operators/array_comprehensions/index.html delete mode 100644 files/ru/web/javascript/reference/operators/expression_closures/index.html delete mode 100644 files/ru/web/javascript/reference/operators/generator_comprehensions/index.html (limited to 'files/ru/web/javascript/reference/operators') diff --git a/files/ru/web/javascript/reference/operators/array_comprehensions/index.html b/files/ru/web/javascript/reference/operators/array_comprehensions/index.html deleted file mode 100644 index c2bed1585e..0000000000 --- a/files/ru/web/javascript/reference/operators/array_comprehensions/index.html +++ /dev/null @@ -1,241 +0,0 @@ ---- -title: Упрощенный синтаксис создания массивов -slug: Web/JavaScript/Reference/Operators/Array_comprehensions -translation_of: Archive/Web/JavaScript/Array_comprehensions ---- -
Non-standard. Do not use!
-Сокращенный синтаксис создания массивов не стандартен. В будущем используйте {{jsxref("Array.prototype.map")}}, {{jsxref("Array.prototype.filter")}}, {{jsxref("Functions/Arrow_functions", "Стрелочные функции", "", 1)}} и {{jsxref("Operators/Spread_operator", "spread syntax", "", 1)}}.
- -
{{jsSidebar("Operators")}}
- -

Синтаксис array comprehension - это JavaScript-выражение, которое позволяет быстро создавать новый массив из существующего. Аналогичные сокращения существуют во многих других языках программирования.

- -

Ниже показаны различия со старым синтаксисом Array Comprehension в SpiderMonkey, основанном на черновиках для ECMAScript 4.

- -

Синтаксис

- -
[for (x of итерируемый_объект) x]
-[for (x of итерируемый_объект) if (условие) x]
-[for (x of итерируемый_объект) for (y of итерируемый_объект) x + y]
-
- -

Описание

- -

Внутри сокращения допустимо использование двух видов компонентов:

- - - -

Итерация for-of всегда является первым компонентом. Допустимо использование нескольких for-of итераций или условных операторов if.

- -

Сокращённый синтаксис создания массивов был предложен к стандартизации в ECMAScript 2016, он предоставлял удобный сокращения для создания новых массивов из других массивов. Сокращения могут быть использованы вместо вызовов {{jsxref("Array.prototype.map", "map()")}} и {{jsxref("Array.prototype.filter", "filter()")}} или их комбинаций.

- -

Следующий пример показывает, как из массива чисел создаётся новый массив чисел с с удвоенным значением.

- -
var numbers = [1, 2, 3, 4];
-var doubled = [for (i of numbers) i * 2];
-console.log(doubled); // logs 2,4,6,8
- -

Это эквивалентно следующей операции с {{jsxref("Array.prototype.map", "map()")}}:

- -
var doubled = numbers.map(i => i * 2);
- -

Сокращённый синтаксис может быть использован также для выбора элементов по определённому условию. Вывод четных чисел:

- -
var numbers = [1, 2, 3, 21, 22, 30];
-var evens = [for (i of numbers) if (i % 2 === 0) i];
-console.log(evens); // logs 2,22,30
- -

{{jsxref("Array.prototype.filter", "filter()")}} может использоваться для той же цели:

- -
var evens = numbers.filter(i => i % 2 === 0);
- -

Стили операторов {{jsxref("Array.prototype.map", "map()")}} и {{jsxref("Array.prototype.filter", "filter()")}} можно одновременно использовать в одном сокращённом выражении. Далее фильтруются только четные числа, а затем создаётся массив с их удвоенным значением:

- -
var numbers = [1, 2, 3, 21, 22, 30];
-var doubledEvens = [for (i of numbers) if (i % 2 === 0) i * 2];
-console.log(doubledEvens); // logs 4,44,60
- -

Квадратные скобки обозначают неявный блок. Новый переменные (такие как  "i" в примере выше) трактуются, как если бы они объявлялись с использованием {{jsxref("Statements/let","let")}}. Это значит, что эти переменные недоступны извне.

- -

Входными данными необязательно может быть массив; также можно использовать итераторы и генераторы.

- -

Даже строки могут подаваться на вход; можно делать то же, что с filter и map (но с массивоподобными объектами):

- -
var str = 'abcdef';
-var consonantsOnlyStr = [for (c of str) if (!(/[aeiouAEIOU]/).test(c)) c].join(''); // 'bcdf'
-var interpolatedZeros = [for (c of str) c + '0' ].join(''); // 'a0b0c0d0e0f0'
- -

Для предупреждения конвертации в число (в данном конкретном примере) использвалась функция {{jsxref("Array.prototype.join", "join()")}}.

- -

Примеры

- -

Простые сокращения

- -
[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" ]
- -

Сокращения с условным оператором "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]
-
- -

Сокращения в сравнении с map и filter

- -

Простой способ понять синтаксис Array Comprehension - это сравнить его с методами Array {{jsxref("Array.map", "map")}} и {{jsxref("Array.filter", "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 ]
-
- -

Сокращения с двумя массивами

- -

Использование двух итераторов 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"]]
-
- -

Спецификации

- -

Изначально было в черновике ECMAScript 2015, но исключено в ревизии 27 (Август 2014). Смотрите старые ревизии ES2015 для уточнения семантики.

- -

Совместимость с браузерами

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{ CompatGeckoDesktop("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
ВозможностьAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{ CompatGeckoMobile("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Специфика работы SpiderMonkey

- - - -

Отличия от старой версии JS1.7/JS1.8

- -
Сокращения из JS1.7/JS1.8 были исключены из движка Gecko, начиная с версии 46 ({{bug(1220564)}}).
- -

Старый синтаксис (не используйте его больше!):

- -
[X for (Y in Z)]
-[X for each (Y in Z)]
-[X for (Y of Z)]
- -

Различия:

- - - -

Смотрите Bug 1220564, comment 42 для внесения предложений по коду.

- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/operators/expression_closures/index.html b/files/ru/web/javascript/reference/operators/expression_closures/index.html deleted file mode 100644 index 9c8f613699..0000000000 --- a/files/ru/web/javascript/reference/operators/expression_closures/index.html +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: Expression closures -slug: Web/JavaScript/Reference/Operators/Expression_closures -tags: - - Нестандартная - - Функции -translation_of: Archive/Web/JavaScript/Expression_closures ---- -
Не является стандартом. Не используйте данный синтаксис!
-Синтаксис замкнутого выражения является устаревшей возможностью SpiderMonkey и будет удален. Используйте вместо него стрелочные функции.
- -
{{jsSidebar("Operators")}}
- -

Замкнутые выражения – это синтаксис для удобной записи коротких и простых функций.

- -

Синтаксис

- -
function [name]([param1[, param2[, ..., paramN]]])
-   expression
-
- -

Параметры

- -
-
name
-
Имя функции. Может быть пропущено, в таком случае функция будет являться анонимной. Имя функции доступно только в теле функции.
-
paramN
-
Имя аргумента, передаваемого функции. Всего может быть передано вплоть до 255 аргументов.
-
expression
-
Выражение, содержащее тело функции.
-
- -

Описание

- -

Этот функционал – ничто иное как короткая нотация для записи простых функций. Он призван добавить в язык нечто похожее на Лямбда-исчисления.

- -

JavaScript 1.7 и старше:

- -
function(x) { return x * x; }
- -

JavaScript 1.8:

- -
function(x) x * x
- -

Такой синтаксис позволяет отбросить фигурные скобки и оператор return. Данный подход, кроме краткости записи, иных преимуществ не имеет.

- -

Примеры использования

- -

Короткая запись для привязки слушателей событий:

- -
 document.addEventListener("click", function() false, true);
-
- -

Использование такой записи для работы с функциями массивов из JavaScript 1.6:

- -
elems.some(function(elem) elem.type == "text");
-
- -

Таблица совместимости

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

 

- -

Смотрите также

- - diff --git a/files/ru/web/javascript/reference/operators/generator_comprehensions/index.html b/files/ru/web/javascript/reference/operators/generator_comprehensions/index.html deleted file mode 100644 index fb04526d8a..0000000000 --- a/files/ru/web/javascript/reference/operators/generator_comprehensions/index.html +++ /dev/null @@ -1,229 +0,0 @@ ---- -title: Упрощенный синтаксис создания функций-генераторов -slug: Web/JavaScript/Reference/Operators/Generator_comprehensions -tags: - - Итераторы -translation_of: Archive/Web/JavaScript/Generator_comprehensions ---- -
Не в стандарте. Не используйте!
-Включения генераторов - нестандартная возможность, и вряд ли когда-либо появится в ECMAScript. В будущем попробуйте использовать {{jsxref("Statements/function*", "generator", "", 1)}}.
- -
{{jsSidebar("Operators")}}
- -
Синтаксис включений генераторов - это выражение, которое позволяет быстро создать новую функцию-генератор из существующего итератора. Включения присутствуют во множестве языков программирования.
- -
 
- -
Ниже показаны отличия от старого синтаксиса генераторных выражений в SpiderMonkey, основанных на предложениях к стандарту ECMAScript 4.
- -
 
- -

Синтаксис

- -
(for (x of iterable) x)
-(for (x of iterable) if (condition) x)
-(for (x of iterable) for (y of iterable) x + y)
-
- -

Описание

- -

Внутри включений генераторов допустимы два типа компонентов:

- - - -

Конструкция for-of всегда идёт первой. Таких конструкций может быть несколько.

- -

Существенный недостаток {{jsxref("Operators/Array_comprehensions","включений массивов","","true")}} - это то, что они создают полносью новый массив в памяти. Даже когда исходный массив небольшой, накладные расходы получаются весьма заметными, а уж когда входные данные - это большой массив или дорогой (или бесконечный) генератор, создание нового массива может быть трудной задачей.

- -

Генераторы позволяют выполнять ленивые вычисления последовательностей, то есть рассчитывать данные только тогда, когда они нужны. Синтаксисы включений генераторов и включений массивов практически аналогичны — первые используют () вместо [] — но вместо массива они создают генератор, который может выполняться лениво. Включения генераторов можно считать просто более кратким способом создания генераторов.

- -

Предположим, у нас есть итератор it, который итерирует по длинной последовательности чисел. Мы хотим создать новый итератор, который будет итерировать по тем же числам, умноженным на два. Включение массивов создало бы в памяти новый массив с умноженными числами:

- -
var doubles = [for (i in it) i * 2];
-
- -

А включение генераторов создало бы новый итератор, который высчитывал бы  следующее умноженное значение, когда оно нужно:

- -
var it2 = (for (i in it) i * 2);
-console.log(it2.next()); // Первое значение из it, умноженное на два
-console.log(it2.next()); // Второе значение из it, умноженное на два
-
- -

Когда включение генераторов передаётся как аргумент функции, можно обойтись без скобок вокруг включения:

- -
var result = doSomething(for (i in it) i * 2);
-
- -

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

- -

Примеры

- -

Простое включение генераторов

- -
(for (i of [ 1, 2, 3 ]) i*i );
-// Функция-генератор, которая отдаёт 1, 4, 9 и так далее
-
-[...(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'
-
- -

Включение генераторов с условием

- -
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, как и функция ниже:
-
-(for (year of years) if (year > 2000 && year < 2010) year);
-// функция-генератор, которая отдаёт 2006
-
- -

Включение генератора в сравнении с функцией-генератором

- -

Будет проще понять синтаксис включений генераторов, если сравнить его с функцией-генератором.

- -

Пример 1: Простой генератор.

- -
var numbers = [ 1, 2, 3 ];
-
-// Функция-генератор
-(function*() {
-  for (let i of numbers) {
-    yield i * i;
-  }
-})()
-
-// Включение генератора
-(for (i of numbers) i*i );
-
-// Результат: в обоих случаях получается генератор, который отдаёт [ 1, 4, 9 ]
-
- -

Пример 2: Использование if в генераторе.

- -
var numbers = [ 1, 2, 3 ];
-
-// Функция-генератор
-(function*() {
-  for (let i of numbers) {
-    if (i < 3) {
-      yield i * 1;
-    }
-  }
-})()
-
-// Включение генератора
-(for (i of numbers) if (i < 3) i);
-
-// Результат: в обоих случаях получается генератор, который отдаёт [ 1, 2 ]
- -

Спецификации

- -

Включения генераторов изначально входили в черновик ECMAScript 6, но их убрали в ревизии 27 (August 2014). Please see older revisions of ES6 for specification semantics.

- -

Поддержка браузерами

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Начальная поддержка{{CompatNo}}{{ CompatGeckoDesktop("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Начальная поддержка{{CompatNo}}{{CompatNo}}{{ CompatGeckoMobile("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Особенности реализации в SpiderMonkey

- - - -

Отличия от старых JS1.7/JS1.8 включений

- -
JS1.7/JS1.8 включения убраны из Gecko 46 ({{bug(1220564)}}).
- -

Старый синтаксис включений (не используйте!):

- -
(X for (Y in Z))
-(X for each (Y in Z))
-(X for (Y of Z))
-
- -

Отличия:

- - - -

См. также

- - -- cgit v1.2.3-54-g00ecf