recursal/MDN huggingface dataset:
Декремент (--)
==============

Оператор декремента (`--`) уменьшает (вычитает единицу) свой операнд и возвращает значение.

Интерактивный пример
--------------------

Синтаксис
---------
```

Operator: x-- or --x
```

Описание
--------

Если используется постфикс, с оператором после операнда (например, x--), оператор декремента уменьшает и возвращает значение перед уменьшением.

Если используется префикс, с оператором перед операндом (например, --x), оператор декремента уменьшает и возвращает значение после уменьшения.

Примеры
-------

### Постфиксный декремент


```js
let x = 3;
y = x--;

// y = 3
// x = 2
```

### Префиксный декремент


```js
let a = 2;
b = --a;

// a = 1
// b = 1
```

Характеристики
--------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-postfix-decrement-operator |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* Addition operator
* Subtraction operator (en-US)
* Division operator (en-US)
* Multiplication operator (en-US)
* Remainder operator (en-US)
* Exponentiation operator (en-US)
* Increment operator (en-US)
* Unary negation operator (en-US)
* Unary plus operator (en-US)
function\* expression
=====================

Ключевое слово **`function*`** может использоваться для объявления функции-генератора внутри выражения.

Синтаксис
---------
```

function* [имя]([параметр1[, параметр2[, ..., параметрN]]]) {
   инструкции
}
```

### Параметры

`имя`

Имя функции. Может быть опущено, в этом случае функция будет *анонимной*. Имя локально для тела функции.

`параметрN`

Имя аргумента, передаваемого в функцию. Функция может иметь до 255 аргументов.

`инструкции`

Инструкции, составляющие тело функции.

Описание
--------

Выражение `function*` очень похоже на объявление `function*`, и имеет почти такой же синтаксис. Основная разница между выражением `function*` и объявлением `function*` – в *имени функции,* которое может быть опущено в выражениях `function*` для создания *анонимных* функций. Смотрите главу о функциях для получения более подробной информации.

Примеры
-------

В следующем примере определяется безымянная функция-генератор и присваивается переменной `x`. Функция возвращает квадрат своего аргумента:


```js
var x = function\* (y) {
  yield y \* y;
};
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-generator-function-definitions |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `function* statement`
* Объект `GeneratorFunction`
* Протоколы перебора: Итератор
* `yield`
* `yield*`
* Объект `Function`
* `function statement`
* `function expression`
* `Функции`
Сложение (+)
============

Оператор сложения (+) создаёт сумму числовых операндов или конкатенацию строк.

Интерактивный пример
--------------------

Синтаксис
---------


```js
x + y;
```

Примеры
-------

### Сложение чисел


```js
// Number + Number -> addition
1 + 2; // 3

// Boolean + Number -> addition
true + 1; // 2

// Boolean + Boolean -> addition
false + false; // 0
```

### Сложение строк


```js
// String + String -> concatenation
"foo" + "bar"; // "foobar"

// Number + String -> concatenation
5 + "foo"; // "5foo"

// String + Boolean -> concatenation
"foo" + false; // "foofalse"
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-addition-operator-plus |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* Subtraction operator (en-US)
* Division operator (en-US)
* Multiplication operator (en-US)
* Remainder operator (en-US)
* Exponentiation operator (en-US)
* Increment operator (en-US)
* Decrement operator
* Unary negation operator (en-US)
* Unary plus operator (en-US)
in operator
===========

**Оператор `in`** возвращает `true`, если свойство содержится в указанном объекте или в его цепочке прототипов.

Синтаксис
---------
```

prop in object
```

### Параметры

`prop`

Строка или symbol, представляющий название свойства или индекс массива (non-symbols будут конвертированы в строки).


`object`

Объект, в котором нужно проверить содержание свойства с заданным именем.

Описание
--------

В примере ниже показаны некоторые способы использования оператора `in`.


```js
// Массивы
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees; // true
3 in trees; // true
6 in trees; // false
"bay" in trees; // false (вы должны указать индекс элемента в массиве, а не значение в этом индексе)
"length" in trees; // true (length является свойством Array)

// Уже существующие объекты
"PI" in Math; // true

// Пользовательские объекты
var mycar = { make: "Honda", model: "Accord", year: 1998 };
"make" in mycar; // true
"model" in mycar; // true
```


Вы должны указать объект справа от оператора `in`. Например, вы можете указать строку, созданную через конструктор объекта `String`, но вы не можете указать строковый литерал.


```js
var color1 = new String("green");
"length" in color1; // returns true

var color2 = "coral";
// сгенерирует ошибку (color2 is not a String object)
"length" in color2;
```

### Использование оператора `in` с неопределёнными или с уже удалёнными свойствами

Если вы удалили свойство при помощи оператора `delete`, то оператор `in` возвратит `false` для этого свойства.


```js
var mycar = { make: "Honda", model: "Accord", year: 1998 };
delete mycar.make;
"make" in mycar; // false

var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
3 in trees; // false
```


Если вы зададите свойству значение `undefined`, но не удалите его, то для этого свойства оператор `in` вернёт значение `true`.


```js
var mycar = { make: "Honda", model: "Accord", year: 1998 };
mycar.make = undefined;
"make" in mycar; // true
```



```js
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined;
3 in trees; // returns true
```

### Наследуемые свойства

Оператор `in` возвратит `true` для свойств, которые унаследованы по цепочке прототипов. (Если вы хотите проверить только не наследованные свойства, используйте `Object.prototype.hasOwnProperty()`.)


```js
"toString" in {}; // true
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-relational-operators |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `delete`
* `Object.prototype.hasOwnProperty()`
* `Reflect.has()` (en-US)
* Enumerability and ownership of properties (en-US)
void operator
=============

**Оператор `void`** вычисляет переданное *выражение* и возвращает `undefined`.

Синтаксис
---------
```

void expression
```

Описание
--------

Этот оператор позволяет вставлять выражения, которые производят дополнительные действия, в места, где ожидается `undefined`.

Оператор `void` часто используется для получения примитивного значения `undefined`, используя `"void(0)"` (что эквивалентно `"void 0"`). В подобных случаях можно просто использовать глобальную переменную `undefined` (предполагая, что её значение по умолчанию не было изменено).

Самовызывающаяся функция (IIFE)
-------------------------------

С оператором void можно использовать самовызывающиеся функции.


```js
void (function iife() {
  var bar = function () {};
  var baz = function () {};
  var foo = function () {
    bar();
    baz();
  };
  var biz = function () {};

  foo();
  biz();
})();
```

JavaScript URIs
---------------

Когда браузер переходит по `javascript: URI`, он вычисляет код в `URI` и заменяет содержание страницы возвращённым значением, если оно не равно `undefined`. Можно воспользоваться оператором `void` для возврата `undefined`. Например:


```html
<a href="javascript:void(0);">Click here to do nothing</a>

<a href="javascript:void(document.body.style.backgroundColor='green');">
  Click here for green background
</a>
```


Однако заметим, что не рекомендуется использовать псевдо-протокол `javascript:`. Лучше прибегнуть к другим альтернативам, таким, как обработчики событий.

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-void-operator |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `undefined`
Generator
=========

**`Генератор`** - это объект, возвращаемый функцией-генератором и соответствующий как "Итерируемому" протоколу, так и протоколу "Итератор".

Конструктор
-----------

Этот объект не может быть инстанциирован напрямую. Вместо этого, экземпляр `Generator` может быть возвращён из функции-генератора:


```js
function\* generator() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = generator(); // "Generator { }"

console.log(gen.next().value); // 1
console.log(generator().next().value); // 1
console.log(generator().next().value); // 1
```

Методы экземпляра
-----------------

`Generator.prototype.next()`

Возвращает значение, полученное выражением `yield`.

`Generator.prototype.return()`

Возвращает заданное значение и заканчивает генератор.

`Generator.prototype.throw()`

Выдаёт ошибку генератора.

Пример
------

### Бесконечный Итератор


```js
function\* idMaker() {
  var index = 0;
  while (true) yield index++;
}

var gen = idMaker(); // "Generator { }"

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-generator-objects |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

### Legacy generators

* The legacy Iterator protocol (en-US)
### ES2015 generators

* Functions
* `function`
* `function expression`
* `Function`
* `function*`
* `function* expression`
* `GeneratorFunction`
* The Iterator protocol
globalThis
==========

Глобальное свойство **`globalThis`** содержит значение глобального `this`, который является глобальным объектом.

Интерактивный пример
--------------------

Синтаксис
---------
```

globalThis
```

Описание
--------

Исторически, для доступа к глобальному объекту использовался разный синтаксис в разных средах JavaScript. В вебе вы могли использовать `window` (en-US), `self` или `frames`, но в Worker можно использовать только `self`. В Node.js ничего из этого не работает, поэтому вы должны использовать `global`.

Ключевое слово `this` можно использовать внутри функций в нестрогом режиме. Но в строгом режиме внутри функций и в Модулях `this` равняется `undefined`. Вы можете использовать `Function('return this')()`, но среды, которые отключают `eval()` (en-US), такие как CSP в браузерах, препятствуют использованию `Function` таким способом.

Свойство `globalThis` даёт возможность стандартного доступа к глобальному значению `this` (и как следствие, к глобальному объекту) вне зависимости от окружения. В отличии от похожих свойств, таких как `window` и `self`, оно гарантирует работу как в среде, где есть `window`, так и в среде, где его нет. Таким образом вы можете получить доступ к глобальному объекту даже не зная в какой среде будет запущен код. Чтобы помочь запомнить название, просто запомните, что глобальное значение `this` равно `globalThis`.

### HTML и WindowProxy

Во многих движках `globalThis` будет ссылкой на фактический глобальный объект, но в веб-браузерах из-за соображений безопасности iframe и cross-window он ссылается на `Proxy` вокруг фактического глобального объекта (который вы не можете получить прямым доступом). Это различие редко актуально в обычном использовании, но его важно знать.

### Название

Некоторые другие популярные имена, такие как `self` и `global` были исключены из рассмотрения из-за того, что они могут нарушать совместимость с существующим кодом. Смотрите документ по планированию именования для большей информации.

Примеры
-------

До `globalThis` единственным кросс-платформенным путём получения глобального объекта в любой среде было `Function('return this')()`. Однако, это нарушает CSP в некоторых случаях. Например, es6-shim делает такую проверку:


```js
var getGlobal = function () {
  if (typeof self !== "undefined") {
    return self;
  }
  if (typeof window !== "undefined") {
    return window;
  }
  if (typeof global !== "undefined") {
    return global;
  }
  throw new Error("unable to locate global object");
};

var globals = getGlobal();

if (typeof globals.setTimeout !== "function") {
  // в данном окружении не существует setTimeout!
}
```


С `globalThis` дополнительный поиск глобального объекта в разных средах больше не нужен:


```js
if (typeof globalThis.setTimeout !== "function") {
  // в данном окружении не существует setTimeout!
}
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-globalthis |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
RangeError
==========

Объект **`RangeError`** представляет ошибку, возникающую, когда значение не входит в множество или диапазон допустимых значений.

Описание
--------

`RangeError` возникает при попытке передать в качестве аргумента функции значение, которое не входит в диапазон допустимых значений.

Это может происходить в разных случаях:

* при передаче значения, которое не является одной из допустимых строк, в `String.prototype.normalize()`,
* при попытке создать массив недопустимой длины с помощью конструктора `Array`,
* при передаче недопустимых значений в такие методы, как `Number.prototype.toExponential()`, `Number.prototype.toFixed()` или `Number.prototype.toPrecision()`.

`RangeError` является сериализуемым объектом (en-US), поэтому он может быть клонирован с помощью `structuredClone()` (en-US) или передан между воркерами с использованием `postMessage()`.

`RangeError` является подклассом `Error`.

Конструктор
-----------

`RangeError()` (en-US)

Создаёт новый объект `RangeError`.

Свойства экземпляра
-------------------

*Также наследует свойства экземпляра своего родителя `Error`*.

Эти свойства определены в `RangeError.prototype` и есть у всех экземпляров `RangeError`.

`RangeError.prototype.constructor`

Функция-конструктор, создающая экземпляр объекта. Для экземпляров `RangeError` начальным значением является конструктор `RangeError` (en-US).

`RangeError.prototype.name`

Представляет название типа ошибки. Начальным значением `RangeError.prototype.name` является `"RangeError"`.

Методы экземпляра
-----------------

*Наследует методы экземпляра своего родителя `Error`*.

Примеры
-------

### Использование `RangeError` для цифровых значений


```js
function check(n) {
  if (!(n >= -500 && n <= 500)) {
    throw new RangeError("Аргумент должен быть в диапазоне между -500 и 500.");
  }
}

try {
  check(2000);
} catch (error) {
  if (error instanceof RangeError) {
    // Обработка ошибки
  }
}
```

### Использование `RangeError` для нецифровых значений


```js
function check(value) {
  if (!["яблоко", "банан", "морковь"].includes(value)) {
    throw new RangeError(
      'Аргумент должен иметь значение "яблоко", "банан" или "морковь".',
    );
  }
}

try {
  check("капуста");
} catch (error) {
  if (error instanceof RangeError) {
    // Обработка ошибки
  }
}
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-native-error-types-used-in-this-standard-rangeerror |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `Error`
* `Array`
* `Number.prototype.toExponential()`
* `Number.prototype.toFixed()`
* `Number.prototype.toPrecision()`
* `String.prototype.normalize()`
ReferenceError
==============

Объект **`ReferenceError`** представляет ошибку, возникающую при обращении к переменной, которая не существует (или не была инициализирована) в текущей области видимости.

`ReferenceError` является сериализуемым объектом (en-US), поэтому он может быть клонирован с помощью `structuredClone()` (en-US) или передан между воркерами с использованием `postMessage()`.

`RangeReferenceErrorError` является подклассом `Error`.

Конструктор
-----------

`ReferenceError()` (en-US)

Создаёт новый объект `ReferenceError`.

Свойства экземпляра
-------------------

*Также наследует свойства экземпляра своего родителя `Error`*.

Эти свойства определены в `ReferenceError.prototype` и есть у всех экземпляров `ReferenceError`.

`ReferenceError.prototype.constructor`

Функция-конструктор, создающая экземпляр объекта. Для экземпляров `ReferenceError` начальным значением является конструктор `ReferenceError` (en-US).

`ReferenceError.prototype.name`

Представляет название типа ошибки. Начальным значением `ReferenceError.prototype.name` является `"ReferenceError"`.

Методы экземпляра
-----------------

*Наследует методы экземпляра своего родителя `Error`*.

Примеры
-------

### Перехват `ReferenceError`


```js
try {
  let a = undefinedVariable;
} catch (e) {
  console.log(e instanceof ReferenceError); // true
  console.log(e.message); // "undefinedVariable is not defined"
  console.log(e.name); // "ReferenceError"
  console.log(e.stack); // Стек ошибок
}
```

### Создание `ReferenceError`


```js
try {
  throw new ReferenceError("Привет");
} catch (e) {
  console.log(e instanceof ReferenceError); // true
  console.log(e.message); // "Привет"
  console.log(e.name); // "ReferenceError"
  console.log(e.stack); // Стек ошибок
}
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-native-error-types-used-in-this-standard-referenceerror |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `Error`
decodeURIComponent()
====================

Метод **`decodeURIComponent()`** декодирует управляющие последовательности символов в компоненте Uniform Resource Identifier (URI), созданные с помощью метода `encodeURIComponent` или другой подобной процедуры.

Интерактивный пример
--------------------

Синтаксис
---------
```

decodeURIComponent(encodedURI)
```

### Параметры

`encodedURI`

Строка, содержащая закодированный компонент Uniform Resource Identifier.

### Возвращаемое значение

Новая строка, представляющая собой декодированную версию компонента Uniform Resource Identifier (URI), переданного в качестве параметра.

### Исключения

При неправильном использовании выдаёт исключение `URIError` ("неверный формат последовательности URI").

Описание
--------

Заменяет каждую управляющую последовательность в закодированном компоненте URI соответствующим ей символом.

Примеры
-------

### Декодирование компонента кириллического URL


```js
decodeURIComponent("JavaScript\_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
// "JavaScript\_шеллы"
```

### Перехват ошибок


```js
try {
  var a = decodeURIComponent("%E0%A4%A");
} catch (e) {
  console.error(e);
}

// URIError: malformed URI sequence
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-decodeuricomponent-encodeduricomponent |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `decodeURI`
* `encodeURI`
* `encodeURIComponent`
InternalError
=============

**Не стандартно:** Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.

Объект **`InternalError`** представляет ошибку, возникающую внутри движка JavaScript.

В основном такие ошибки связаны с тем, что что-то слишком велико, например:

* "too many switch cases",
* "too many parentheses in regular expression",
* "array initializer too large",
* "too much recursion".

`InternalError` является подклассом `Error`.

Конструктор
-----------

`InternalError()` (en-US) 
Non-standard

Создаёт новый объект `InternalError`.

Свойства экземпляра
-------------------

*Также наследует свойства экземпляра своего родителя `Error`*.

Эти свойства определены в `InternalError.prototype` и есть у всех экземпляров `InternalError`.

`InternalError.prototype.constructor`

Функция-конструктор, создающая экземпляр объекта. Для экземпляров `InternalError` начальным значением является конструктор `InternalError` (en-US).

`InternalError.prototype.name`

Представляет название типа ошибки. Начальным значением `InternalError.prototype.name` является `"InternalError"`.

Методы экземпляра
-----------------

*Наследует методы экземпляра своего родителя `Error`*.

Примеры
-------

### Слишком глубокая рекурсия

Эта рекурсивная функция выполняется 10 раз в соответствии с условием выхода.


```js
function loop(x) {
  // условие выхода из функции
  if (x >= 10) return;

  // рекурсивный вызов
  loop(x + 1);
}

loop(0);
```


Установка для этого условия чрезвычайно высокого значения может не сработать:


```js
function loop(x) {
  if (x >= 1000000000000) return;

  loop(x + 1);
}

loop(0);

// InternalError: too much recursion
```


Для получения дополнительной информации смотрите InternalError: too much recursion.

Specifications
--------------

Не является частью какого-либо стандарта.

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* `Error`
* InternalError: too much recursion
SyntaxError
===========

Объект **`SyntaxError`** представляет ошибку, возникающую при попытке интерпретировать синтаксически неправильный код. Это происходит, когда движок JavaScript при синтаксическом анализе кода обнаруживает токены или порядок токенов, не соответствующие синтаксису языка.

`SyntaxError` является сериализуемым объектом (en-US), поэтому он может быть клонирован с помощью `structuredClone()` (en-US) или передан между воркерами с использованием `postMessage()`.

`SyntaxError` является подклассом `Error`.

Конструктор
-----------

`SyntaxError()` (en-US)

Создаёт новый объект `SyntaxError`.

Свойства экземпляра
-------------------

*Также наследует свойства своего родителя `Error`*.

Эти свойства определены в `SyntaxError.prototype` и есть у всех экземпляров `SyntaxError`.

`SyntaxError.prototype.constructor`

Функция-конструктор, создающая экземпляр объекта. Для экземпляров `SyntaxError` начальным значением является конструктор `SyntaxError` (en-US).

`SyntaxError.prototype.name`

Представляет название типа ошибки. Начальным значением `SyntaxError.prototype.name` является `"SyntaxError"`.

Методы экземпляра
-----------------

*Наследует методы своего родителя `Error`*.

Примеры
-------

### Перехват `SyntaxError`


```js
try {
  eval("hoo bar");
} catch (e) {
  console.log(e instanceof SyntaxError); // true
  console.log(e.message);
  console.log(e.name); // "SyntaxError"
  console.log(e.stack); // Стек ошибок
}
```

### Создание `SyntaxError`


```js
try {
  throw new SyntaxError("Привет");
} catch (e) {
  console.log(e instanceof SyntaxError); // true
  console.log(e.message); // "Привет"
  console.log(e.name); // "SyntaxError"
  console.log(e.stack); // Стек ошибок
}
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-native-error-types-used-in-this-standard-syntaxerror |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `Error`