SyntaxError: a declaration in the head of a for-of loop can't have an initializer - JavaScript

SyntaxError: a declaration in the head of a for-of loop can't have an initializer
=================================================================================

Сообщение
---------
```

SyntaxError: a declaration in the head of a for-of loop can't have an initializer (Firefox)

SyntaxError: for-of loop variable declaration may not have an initializer. (Chrome)
```

Тип ошибки
----------

`SyntaxError`Что случилось?
--------------

В заголовке цикла for...of инициализируется переменная. Иными словами, переменная объявляется и получает значение|`for (var i = 0 of iterable)`|. В подобных циклах это не допускается. Инициализировать переменные можно в циклах `for`.

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

### Неправильный цикл `for-of`

```js
let iterable = [10, 20, 30];

for (let value = 50 of iterable) {
  console.log(value);
}

// SyntaxError: a declaration in the head of a for-of loop can't
// have an initializer
```

### Правильный цикл `for-of`

Надо убрать инициализацию (`value = 50`) в заголовке цикла `for-of`. Если требуется использовать смещение 50, это можно сделать в теле цикла.

```js
let iterable = [10, 20, 30];

for (let value of iterable) {
  value += 50;
  console.log(value);
}
// 60
// 70
// 80
```

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

* `for...of`
* `for...in` – В строгом режиме инициализация тоже не разрешается (SyntaxError: for-in loop head declarations may not have initializers)
* `for` – Инициализация во время итерации разрешена.


SyntaxError: applying the 'delete' operator to an unqualified name is deprecated - JavaScript

SyntaxError: applying the 'delete' operator to an unqualified name is deprecated
================================================================================

Исключение "applying the 'delete' operator to an unqualified name is deprecated" возникает только в строгом режиме при попытке удалить переменную с помощью оператора `delete`.

Сообщение
---------
```

SyntaxError: Delete of an unqualified identifier in strict mode. (V8-based)
SyntaxError: applying the 'delete' operator to an unqualified name is deprecated (Firefox)
SyntaxError: Cannot delete unqualified property 'a' in strict mode. (Safari)
```

Тип ошибки
----------

`SyntaxError` только в строгом режиме.

Что не так?
-----------

Обычные переменные в JavaScript нельзя удалить с помощью оператора `delete`. В строгом режиме попытка удалить переменную вызовет ошибку и не будет разрешена.

Оператор `delete` может удалять только свойства объекта. Свойства объекта "квалифицированы", если они конфигурируемы.

В отличие от общепринятого мнения, оператор `delete` не имеет ничего общего с непосредственным освобождением памяти. Управление памятью осуществляется косвенным образом через удаление ссылок, читайте подробнее в разделе про управление памятью, а также на странице оператора `delete`.

Эта ошибка возникает только в строгом режиме. В нестрогом режиме операция просто возвращает `false`.

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

Попытка удалить простую переменную не работает в JavaScript и выдаёт ошибку в строгом режиме:

```js
"use strict";

var x;

// ...

delete x;

// SyntaxError: применение оператора 'delete' к неполному имени является устаревшим
```

Чтобы освободить содержимое переменной, задайте для неё значение ``null``:

```js
"use strict";

var x;

// ...

x = null;

// X может быть собран "мусор"
```

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

* Оператор `delete`
* Управление памятью
* TypeError: property "x" is non-configurable and can't be deleted


SyntaxError: redeclaration of formal parameter "x" - JavaScript

SyntaxError: redeclaration of formal parameter "x"
==================================================

Сообщение
---------
```

SyntaxError: redeclaration of formal parameter "x" (Firefox)
SyntaxError: Identifier "x" has already been declared (Chrome)
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

Одно и то же имя переменной сначала использовано в качестве параметра, а потом объявлено ещё раз в теле функции с помощью оператора присваивания `let`. В JavaScript не допустимо переопределение переменной в рамках области видимости функции или блока при помощи `let`.

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

В данном случае переменная "arg" переопределяет аргумент:

```js
function f(arg) {
  let arg = "foo";
}

// SyntaxError: redeclaration of formal parameter "arg"
```

Если вы хотите изменить значение переменной "arg" в теле функции, это можно сделать, но для этого не требуется объявлять эту же переменную ещё раз. Иначе говоря, ключевое слово `let` можно опустить. Если же вы хотите создать новую переменную, необходимо её переименовать, поскольку в противном случае она вступает в конфликт с уже существующим параметром функции.

```js
function f(arg) {
  arg = "foo";
}

function f(arg) {
  let bar = "foo";
}
```

Примечания о совместимости
--------------------------

* В версиях Firefox до Firefox 49, у данной ошибки был тип `TypeError` (Firefox bug 1275240).
Смотрите также
--------------

* `let`
* `const`
* `var`
* Объявления переменных в Руководстве по JavaScript


RangeError: argument is not a valid code point - JavaScript

RangeError: argument is not a valid code point
==============================================

Сообщение
---------
```

RangeError: Invalid code point {0} (Edge)
RangeError: {0} is not a valid code point (Firefox)
RangeError: Invalid code point {0} (Chrome)
```

Тип ошибки
----------

`RangeError`Что пошло не так?
-----------------

Метод `String.fromCodePoint()` выдаёт ошибку, если ему было передано значение `NaN`, отрицательное целое число (-1), нецелое число (5.4) или значение, которое превышает 0x10FFFF (1114111).

Кодовая точка (code point) – это значение в кодовом пространстве Unicode, то есть диапазон целых чисел от `0` до `0x10FFFF`.

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

### Нерабочие случаи

```js
String.fromCodePoint("\_"); // RangeError
String.fromCodePoint(Infinity); // RangeError
String.fromCodePoint(-1); // RangeError
String.fromCodePoint(3.14); // RangeError
String.fromCodePoint(3e-2); // RangeError
String.fromCodePoint(NaN); // RangeError
```

### Рабочие случаи

```js
String.fromCodePoint(42); // "\*"
String.fromCodePoint(65, 90); // "AZ"
String.fromCodePoint(0x404); // "\u0404"
String.fromCodePoint(0x2f804); // "\uD87E\uDC04"
String.fromCodePoint(194564); // "\uD87E\uDC04"
String.fromCodePoint(0x1d306, 0x61, 0x1d307); // "\uD834\uDF06a\uD834\uDF07"
```

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

* `String.fromCodePoint()`


TypeError: invalid 'instanceof' operand 'x'(Тип ошибки:  неверный 'экземпляром' операнд 'х') - JavaScript

TypeError: invalid 'instanceof' operand 'x'(Тип ошибки: неверный 'экземпляром' операнд 'х')
===========================================================================================

Сообщение
---------
```

TypeError: недопустимый операнд "instanceof" "x" (Firefox)
TypeError: "x" не является функцией (Firefox)
TypeError: правая часть "instanceof" не является объектом (Chrome)
TypeError: правая часть "instanceof" не вызывается (Chrome)
```

Тип ошибки
----------

`TypeError`Что не так?
-----------

The `instanceof` operator ожидает, что операнды правой стороны будут объектом конструктора, т. е. объектом, который имеет свойство прототипа и является вызываемым.

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

```js
"test" instanceof ""; // TypeError: invalid 'instanceof' operand ""
42 instanceof 0; // TypeError: invalid 'instanceof' operand 0

function Foo() {}
var f = Foo(); // Foo() is called and returns undefined
var x = new Foo();

x instanceof f; // TypeError: invalid 'instanceof' operand f
x instanceof x; // TypeError: x is not a function
```

Чтобы исправить эти ошибки, необходимо либо заменить оператор `instanceof` оператором `typeof`, либо убедиться, что вместо результата его вычисления используется имя функции.

```js
typeof "test" == "string"; // true
typeof 42 == "number"; // true

function Foo() {}
var f = Foo; // Do not call Foo.
var x = new Foo();

x instanceof f; // true
x instanceof Foo; // true
```

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

* `instanceof` operator
* `typeof` operator


SyntaxError: missing variable name - JavaScript

SyntaxError: missing variable name
==================================

Сообщение
---------
```

SyntaxError: missing variable name (Firefox)
SyntaxError: Unexpected token = (Chrome)
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

У переменной отсутствует имя. Скорее всего, дело в синтаксической ошибке в вашем коде. Может, где-то неправильно стоит запятая, или у вас возникли трудности с именованием. Прекрасно вас понимаем! Придумывать названия – очень непросто.

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

### Отсутствует имя переменной

```js
var = "foo";
```

Придумывать хорошие имена переменным очень тяжело, все мы с таким сталкивались.

```js
var ohGodWhy = "foo";
```

### Зарезервированные ключевые слова не могут использоваться как имена переменных

Есть несколько имён, которые являются зарезервированными ключевыми словами. Их нельзя использовать. Увы :(

```js
var debugger = "whoop";
// SyntaxError: missing variable name
```

### Объявление нескольких переменных

При объявлении нескольких переменных обращайте особое внимание на запятые. Нет ли лишних запятых? Не поставили ли вы случайно запятые вместо точек с запятыми?

```js
var x, y = "foo",
var x, = "foo"

var first = document.getElementById('раз'),
var second = document.getElementById('два'),

// SyntaxError: missing variable name
```

Исправленный вариант:

```js
var x,
  y = "foo";
var x = "foo";

var first = document.getElementById("раз");
var second = document.getElementById("два");
```

### Массивы

Литералам `Array` в JavaScript необходимы квадратные скобки вокруг значений. Такое не сработает:

```js
var arr = 1,2,3,4,5;
// SyntaxError: missing variable name
```

А вот так будет правильно:

```js
var arr = [1, 2, 3, 4, 5];
```

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

* Хорошие имена переменных (на англ.)
* `var`
* Объявления переменных в Руководстве по JavaScript


TypeError: can't delete non-configurable array element(Тип ошибки:не удаётся удалить настраиваемый элемент массива) - JavaScript

TypeError: can't delete non-configurable array element(Тип ошибки:не удаётся удалить настраиваемый элемент массива)
===================================================================================================================

Сообщения
---------
```

TypeError: не удаётся удалить не настраиваемый элемент массива (Firefox)
TypeError: не удаётся удалить свойство '2' из [массива объектов] (Chrome)
```

Тип ошибки
----------

`TypeError`Что пошло не так?
-----------------

Была сделана попытка сократить длину массива, но один из элементов массива не изменяется. При укорочении массив, элементы за новую длину массива будут удалены, не в этой ситуации.

Настраиваемый атрибут определяет, можно ли удалить свойство из объекта и можно ли изменить его атрибуты (отличные от доступных для записи).

Обычно свойства объекта, созданного инициализатором массива, настраиваются. Однако, например, при использовании `Object.defineProperty()`, свойство не настраивается по умолчанию.

Examples
--------

### Не настраиваемые свойства, созданные `Object.defineProperty`

The `Object.defineProperty()` создаёт не настраиваемые свойства по умолчанию, если они не указаны как настраиваемые.

```js
var arr = [];
Object.defineProperty(arr, 0, { value: 0 });
Object.defineProperty(arr, 1, { value: "1" });

arr.length = 1;
// TypeError: не удаётся удалить не настраиваемый элемент массива
```

Вам нужно будет установить элементы как конфигурируемые, если вы собираетесь сократить массив.

```js
var arr = [];
Object.defineProperty(arr, 0, { value: 0, configurable: true });
Object.defineProperty(arr, 1, { value: "1", configurable: true });

arr.length = 1;
```

### `Seal`-ed Arrays (Герметичные Массивы)

The `Object.seal()` функция помечает все существующие элементы как не настраиваемые.

```js
var arr = [1, 2, 3];
Object.seal(arr);

arr.length = 1;
// TypeError: can't delete non-configurable array element
```

Вам или нужно извлечь `Object.seal()` позвоните или сделайте копию. В случае копирования сокращение копии массива не изменяет длину исходного массива.

```js
var arr = [1, 2, 3];
Object.seal(arr);

// Скопируйте исходный массив, чтобы сократить копию
var copy = Array.from(arr);
copy.length = 1;
// arr.length == 3
```

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

* [[Configurable]]
* `Array.length`
* `Object.defineProperty()`
* `Object.seal()`


SyntaxError: missing formal parameter( отсутствует формальный параметр) - JavaScript

SyntaxError: missing formal parameter( отсутствует формальный параметр)
=======================================================================

Сообщение
---------
```

SyntaxError: идентификатор начинается сразу после числового литерала
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

"Формальный параметр" - это причудливый способ сказать "параметр функции". В объявлении функции отсутствуют допустимые параметры. В объявлении функции параметры должны быть identifiers, не любое значение, как числа, строки или объекты. Объявление функций и вызов функций - это два отдельных шага. Объявления требуют идентификатор в качестве параметров, и только при вызове (призыва) функции, вы предоставляете значения, которые функция должна использовать.

В JavaScript, идентификаторы могут содержать только буквенно-цифровые символы (или "$" или "\_") и не могут начинаться с цифры. Идентификатор отличается от строки тем, что строка является данными, а идентификатор - частью кода.

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

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

```js
function square(3) {
  return number \* number;
};
// SyntaxError: отсутствует формальный параметр

function greet("Howdy") {
  return greeting;
};
// SyntaxError: отсутствует формальный параметр

function log({ obj: "value"}) {
  console.log(arg)
};
// SyntaxError: отсутствует формальный параметр
```

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

```js
function square(number) {
  return number \* number;
}

function greet(greeting) {
  return greeting;
}

function log(arg) {
  console.log(arg);
}
```

Затем можно вызвать эти функции с аргументами, которые вам нравятся:

```js
square(2); // 4

greet("Howdy"); // "Howdy"

log({ obj: "value" }); // Object { obj: "value" }
```

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

* Другие ошибки, касающиеся формальных параметров:
    + SyntaxError: Malformed formal parameter (en-US)
    + SyntaxError: redeclaration of formal parameter "x"


TypeError: property "x" is non-configurable and can't be deleted(свойство "x" не настраивается и не может быть удалено) - JavaScript

TypeError: property "x" is non-configurable and can't be deleted(свойство "x" не настраивается и не может быть удалено)
=======================================================================================================================

Сообщение
---------
```

TypeError: вызов delete на 'x' не разрешён в строгом режиме (Edge)
TypeError: свойство "x" не настраивается и не может быть удалено. (браузер Firefox)
TypeError: не удаётся удалить свойство "x" из #<Object> (Chrome)
```

Тип ошибки
----------

`TypeError` in strict mode only.

Что пошло не так?
-----------------

Была сделана попытка удалить свойство, но это свойство не изменяется. Настраиваемый атрибут определяет, можно ли удалить свойство из объекта и можно ли изменить его атрибуты (отличные от доступных для записи).

Эта ошибка возникает только в коде строгого режима. В нестрогом коде операция возвращает false.

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

Не настраиваемые свойства не очень распространены, но их можно создать с помощью `Object.defineProperty()` или `Object.freeze()`.

```js
"use strict";
var obj = Object.freeze({ name: "Elsa", score: 157 });
delete obj.score; // TypeError

("use strict");
var obj = {};
Object.defineProperty(obj, "foo", { value: 2, configurable: false });
delete obj.foo; // TypeError

("use strict");
var frozenArray = Object.freeze([0, 1, 2]);
frozenArray.pop(); // TypeError
```

В JavaScript также встроено несколько настраиваемых свойств. Возможно, вы пытались удалить математическую константу.

```js
"use strict";
delete Math.PI; // TypeError
```

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

* delete operator
* `Object.defineProperty()`
* `Object.freeze()`


SyntaxError: identifier starts immediately after numeric literal - JavaScript

SyntaxError: identifier starts immediately after numeric literal
================================================================

Исключение "identifier starts immediately after numeric literal" возникает, если имя переменной, свойства или функции начинается с цифры. По правилам имя может начинаться только с буквы, подчеркивания (\_) или знака доллара ($).

Сообщение
---------
```

SyntaxError: Unexpected identifier after numeric literal (Edge)
SyntaxError: identifier starts immediately after numeric literal (Firefox)
SyntaxError: Unexpected number (Chrome)
```

Тип ошибки
----------

`SyntaxError`Что не так?
-----------

Имена переменных, а также свойств и функций, называемые идентификаторами, должны соответствовать определённым правилам.

Идентификатор в JavaScript должен начинаться с буквы, символа подчёркивания (\_) или знака доллара ($) и не может начинаться с цифры. Цифрами (0-9) могут быть только второй и следующие символы.

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

### Имена переменных, начинающиеся с числовых литералов

Имена переменных не могут начинаться с цифер в JavaScript. Следующий код приведёт к ошибкам:

```js
var 1life = 'foo';
// SyntaxError: identifier starts immediately after numeric literal

var foo = 1life;
// SyntaxError: identifier starts immediately after numeric literal

alert(1.foo);
// SyntaxError: identifier starts immediately after numeric literal
```

Вы можете переназвать вашу переменную, чтобы избежать ведущего числа.

```js
var life1 = "foo";
var foo = life1;
```

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

* Лексический синтаксис
* Грамматика и типы


SyntaxError: missing = in const declaration - JavaScript

SyntaxError: missing = in const declaration
===========================================

Сообщение
---------
```

SyntaxError: missing = in const declaration (Firefox)
SyntaxError: Missing initializer in const declaration (Chrome)
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

Константа это значение, которое не может быть изменено программой в процессе своего выполнения. Оно не может меняться посредством повторного назначения, и не может быть переопределено. В JavaScript константы объявляются с использованием ключевого слова `const`. Инициализация для константы является обязательной; то есть вы должны указать значение сразу же при её объявлении (что имеет смысл, учитывая, что оно не может быть изменено позже).

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

### Отсутствие инициализатора константы

В отличие от `var` или `let`, вы должны указать значение при объявлении `const`. В противном случае возникнет ошибка:

```js
const COLUMNS;
// SyntaxError: missing = in const declaration
```

### Исправление ошибки

Существует несколько вариантов исправления этой ошибки. Проверьте, что должно быть достигнуто с помощью данной константы.

#### Добавление значения константы

Укажите значение константы при её объявлении.

```js
const COLUMNS = 80;
```

#### `const`, `let` или `var`?

Не используйте `const`, если вы не хотели объявить константу. Возможно, вы подразумевали объявление переменную с блочной областью видимости с помощью `let` или глобальную переменную с помощью `var`. Оба варианта не требуют начального значения.

```js
let columns;
```

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

* `const`
* `let`
* `var`


ReferenceError: "x" is not defined - JavaScript

ReferenceError: "x" is not defined
==================================

Сообщение
---------
```

ReferenceError: "x" is not defined
```

Тип ошибки
----------

`ReferenceError`.

Что пошло не так?
-----------------

Есть несуществующая переменная, которая ссылается куда-то. Эта переменная должна быть объявлена, или вам необходимо убедиться, что она доступна в вашем текущем скрипте или области исходного кода ( scope (en-US)).

>
> \*\*Примечание:\*\*При использовании сторонних библиотек (такие как jQuery), убедитесь, что они загружаются до того, как вы используете переменные "$". Поместите тег `<script>` загружающий вашу библиотеку до того как вы будете использовать её.
>
>
>

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

### Переменная не объявлена

```js
foo.substring(1); // ReferenceError: foo is not defined
```

Переменная "Foo" не определена где-либо. Она должна быть в какой-то строке, так чтобы `String.prototype.substring()` метод начал работать.

```js
var foo = "bar";
foo.substring(1); // "ar"
```

### Неправильная зона доступности

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

```js
function numbers() {
  var num1 = 2,
    num2 = 3;
  return num1 + num2;
}

console.log(num1); // ReferenceError num1 is not defined.
```

Тем не менее, функция может получить доступ ко всем переменным и функциям, определённым в области видимости, в которой она определена. Другими словами, функция, определённая в глобальной области может получить доступ ко всем переменным, определённым в глобальном масштабе.

```js
var num1 = 2,
  num2 = 3;

function numbers() {
  return num1 + num2;
}

console.log(num1); // 2
```

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

* Scope (en-US) - область видимости
* Объявление переменных в руководстве по JavaScript
* Область видимости функций в руководстве по JavaScript


RangeError: repeat count must be less than infinity - JavaScript

RangeError: repeat count must be less than infinity
===================================================

Сообщение
---------
```

RangeError: repeat count must be less than infinity and not overflow maximum string size (Firefox)

RangeError: Invalid count value (Chrome)
```

Тип ошибки
----------

`RangeError`Что пошло не так?
-----------------

Был использован метод `String.prototype.repeat()`, с параметром `count`, указывающим количество повторений строки. Параметр может принимать значения между 0 и положительной `Infinity`, и не может быть отрицательным числом. Диапазон допустимых значений может быть описан следующим образом: [0, + ∞).

Полученная строка также не может превышать максимальный размер строки, который может отличаться в различных движках JavaScript. В Firefox (SpiderMonkey) максимальный размер строки составляет 228 -1 (`0xFFFFFFF`).

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

### Неверно

```js
"abc".repeat(Infinity); // RangeError
"a".repeat(2 \*\* 28); // RangeError
```

### Верно

```js
"abc".repeat(0); // ''
"abc".repeat(1); // 'abc'
"abc".repeat(2); // 'abcabc'
"abc".repeat(3.5); // 'abcabcabc' (count will be converted to integer)
```

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

* `String.prototype.repeat()`


InternalError: too much recursion - JavaScript

InternalError: too much recursion
=================================

Сообщение
---------
```

InternalError: too much recursion
```

Тип ошибки
----------

`InternalError`.

Что пошло не так?
-----------------

Функция, вызывающая сама себя, называется *рекурсивной функцией*. В некотором смысле рекурсия аналогична циклу. Оба выполняют один и тот же код несколько раз, и оба требуют условия (чтобы избежать бесконечного цикла или, вернее, бесконечной рекурсии в этом случае). Когда функция вызывается рекурсивно слишком много раз или бесконечно, JavaScript выдаёт эту ошибку.

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

Функция выполняется рекурсивно 10 раз, в соответствии с условием выхода:

```js
function loop(x) {
  if (x >= 10) {
    // "x >= 10" это условие выхода
    return;
  }
  // do stuff
  loop(x + 1); // рекурсивный вызов
}
loop(0);
```

В условии установлено слишком большое значение, не будет работать:

```js
function loop(x) {
  if (x >= 1000000000000) return;
  // do stuff
  loop(x + 1);
}
loop(0);

// InternalError: too much recursion
```

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

* Recursion (en-US)
* Рекурсия


TypeError: "x" has no properties - JavaScript

TypeError: "x" has no properties
================================

Сообщение
---------
```

TypeError: Unable to get property {x} of undefined or null reference (Edge)
TypeError: null has no properties (Firefox)
TypeError: undefined has no properties (Firefox)
```

Тип ошибки
----------

`TypeError`.

Что пошло не так?
-----------------

У `null` и `undefined` нет свойств, к которым можно было бы обратиться.

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

```js
null.foo;
// TypeError: null has no properties

undefined.bar;
// TypeError: undefined has no properties
```

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

* `null`
* `undefined`


SyntaxError: missing : after property id - JavaScript

SyntaxError: missing : after property id
========================================

Сообщение
---------
```

SyntaxError: missing : after property id
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

При создании объекта с помощью инициализатора объекта, двоеточие (`:`) разделяет ключи и значения свойств объекта.

```js
var obj = { propertyKey: "value" };
```

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

### Двоеточие vs. знака равенства

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

```js
var obj = { propertyKey = 'value' };
// SyntaxError: missing : after property id
```

Корректно будет использовать двоеточие или квадратные скобки для назначения нового свойства после того, как объект уже был создан.

```js
var obj = { propertyKey: "value" };

// or alternatively

var obj = {};
obj["propertyKey"] = "value";
```

### Пустые свойства

Вы не можете создать пустые свойства, подобные этому:

```js
var obj = { propertyKey; };
// SyntaxError: missing : after property id
```

Если вам необходимо задать свойство без значения, то вы можете использовать `null`.

```js
var obj = { propertyKey: null };
```

### Вычисляемые свойства

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

```js
var obj = { 'b'+'ar': 'foo' };
// SyntaxError: missing : after property id
```

Поместите выражение в скобки `[]`:

```js
var obj = { ["b" + "ar"]: "foo" };
```

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

* Инициализатор объекта


RangeError: invalid array length - JavaScript

RangeError: invalid array length
================================

Сообщение
---------
```

RangeError: invalid array length (Firefox)
RangeError: Invalid array length (Chrome)
RangeError: Invalid array buffer length (Chrome)
```

Тип ошибки
----------

`RangeError`Что пошло не так?
-----------------

Ошибка, связанная с размером массива может произойти в следующих случаях:

* При создании `Array` или `ArrayBuffer`, размер оказался либо отрицательным, либо равным или превышающим 232, или
* при установке свойства `Array.length` значение оказалось либо отрицательным, либо равным или превышающим 232.

Поскольку свойство `length` в `Array` или `ArrayBuffer` представлено в виде беззнакового 32-битного целого числа (integer), значение этого свойства находится в диапазоне от 0 до 232-1.

В конструкторе (`new Array()`) первым аргументом является длина массива, поэтому при создании можно задать нужное значение. Так же, можно задать размер массива, обратившись к свойству `length` напрямую.

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

```js
new Array(Math.pow(2, 40));
new Array(-1);
new ArrayBuffer(Math.pow(2, 32));
new ArrayBuffer(-1);

let a = [];
a.length = a.length - 1; // установка длинны -1

let b = new Array(Math.pow(2, 32) - 1);
b.length = b.length + 1; // установка длинны 2^32
```

```js
[Math.pow(2, 40)]; // [ 1099511627776 ]
[-1]; // [ -1 ]
new ArrayBuffer(Math.pow(2, 32) - 1);
new ArrayBuffer(0);

let a = [];
a.length = Math.max(0, a.length - 1);

let b = new Array(Math.pow(2, 32) - 1);
b.length = Math.min(0xffffffff, b.length + 1);

// 0xffffffff является шестнадцатеричным представлением
// 2^32 - 1, которое также можно записать в виде (-1 >>> 0)
```

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

* `Array`
* `Array.length`
* `ArrayBuffer`


TypeError: cannot use 'in' operator to search for 'x' in 'y'(не удаётся использовать 'in' оператор поиска для 'x' в 'y') - JavaScript

TypeError: cannot use 'in' operator to search for 'x' in 'y'(не удаётся использовать 'in' оператор поиска для 'x' в 'y')
========================================================================================================================

Сообщения
---------
```

TypeError: недопустимый операнд в "in" (edge)
TypeError: правая часть 'in' должна быть объектом, есть 'x' (Firefox)
TypeError: невозможно использовать оператор 'in' для поиска 'x' в 'y' (Firefox, Chrome)
```

Тип ошибки
----------

`TypeError`Что пошло не так?
-----------------

Оператор in можно использовать только для проверки наличия свойства в объекте. Вы не можете искать в строках, числах или других примитивных типах.

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

### Поиск в строках

В отличие от других языков программирования (например, Python), поиск в строках с помощью оператора in невозможен.

```js
"Hello" in "Hello World";
// TypeError: cannot use 'in' operator to search for 'Hello' in 'Hello World'
```

Вместо этого вам нужно будет использовать`String.prototype.indexOf()`или примеры

```js
"Hello World".indexOf("Hello") !== -1;
// true
```

### Операнд не может быть `null` или `undefined`

Убедитесь, что объект, который вы осматриваете, на самом деле не `null` или `undefined`.

```js
var foo = null;
"bar" in foo;
// TypeError: не удаётся использовать оператор 'in' для поиска 'bar' в 'foo' (Chrome)
// TypeError: правая часть 'in' должна быть объектом, полученным null (Firefox)
```

Оператор in всегда ожидает объект.

```js
var foo = { baz: "bar" };
"bar" in foo; // false

"PI" in Math; // true
"pi" in Math; // false
```

### Поиск в Массивах

Будьте осторожны при использовании оператора для поиска `Array` объекты. the `in` оператор проверяет номер индекса, а не его значение.

```js
var trees = ["redwood", "bay", "cedar", "oak", "maple"];
3 in trees; // true
"oak" in trees; // false
```

See also
--------

* `in` operator


SyntaxError: "x" is a reserved identifier - JavaScript

SyntaxError: "x" is a reserved identifier
=========================================

Сообщение
---------
```

SyntaxError: The use of a future reserved word for an identifier is invalid (Edge)
SyntaxError: "x" is a reserved identifier (Firefox)
SyntaxError: Unexpected reserved word (Chrome)
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

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

* `enum`

Следующие ключевые слова резервируются для кода, который выполняется только в строгом режиме (strict mode):

* `implements`
* `interface`
* `let`
* `package`
* `private`
* `protected`
* `public`
* `static`
Примеры
-------

### Строгий и нестрогий режимы резервирования ключевых строк

Идентификатор `enum` зарезервирован.

```js
var enum = { RED: 0, GREEN: 1, BLUE: 2 };
// SyntaxError: enum is a reserved identifier
```

Резервирование большего количества идентификаторов с использованием строгого режима.

```js
"use strict";
var package = ["potatoes", "rice", "fries"];
// SyntaxError: package is a reserved identifier
```

Вам необходимо переименовать следующие переменные.

```js
var colorEnum = { RED: 0, GREEN: 1, BLUE: 2 };
var list = ["potatoes", "rice", "fries"];
```

### Обновление старых браузеров

Например, если вы используете старый браузер, в котором ещё не реализована функция `let` или `class`, вам следует перейти на более новую версию браузера, которая поддерживает данные языковые функции.

```js
"use strict";
class DocArchiver {}

// SyntaxError: class is a reserved identifier
// (появится только в старых браузерах, например, Firefox 44 и старше)
```

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

* Правильные имена переменных


TypeError: invalid assignment to const "x"(недопустимое назначение const "x") - JavaScript

TypeError: invalid assignment to const "x"(недопустимое назначение const "x")
=============================================================================

Сообщение
---------
```

TypeError: недопустимое назначение const "x" (Firefox)
TypeError: присвоение переменной константы. (Chrome)
TypeError: присвоение const (Edge)
TypeError: повторное объявление const 'x' (IE)
```

Тип ошибки
----------

`TypeError`Что пошло не так?
-----------------

Константа-это значение, которое не может быть изменено программой в обычном исполнении. Он не может быть изменён путём повторного назначения и не может быть повторно объявлен. В JavaScript, константы объявляются с помощью ключевого слова const.

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

### Недопустимое повторное объявление

Assigning a value to the same constant name in the same block-scope will throw.

```js
const COLUMNS = 80;

// ...

COLUMNS = 120; // TypeError: invalid assignment to const `COLUMNS'
```

### Решение проблемы

Есть несколько вариантов, чтобы исправить эту ошибку. Проверьте, что должно было быть достигнуто с рассматриваемой константой.

#### Переназовите

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

```js
const COLUMNS = 80;
const WIDE\_COLUMNS = 120;
```

#### `const`, `let` или `var`?

Не используйте const, если вы не хотели объявлять константу. Возможно, вы хотели объявить переменную в области блока с let или глобальную переменную с var.

```js
let columns = 80;

// ...

let columns = 120;
```

#### Обзор

Проверить, если вы находитесь в правильной области. Должна ли эта константа появиться в этой области или она должна была появиться в функции, например?

```js
const COLUMNS = 80;

function setupBigScreenEnvironment() {
  const COLUMNS = 120;
}
```

### `const` и неизменность

Объявление const создаёт ссылку только для чтения на значение. Это не означает, что значение, которое он содержит, является неизменяемым, просто идентификатор переменной не может быть переназначен. Например, если содержимое является объектом, это означает, что сам объект все ещё может быть изменён. Это означает, что нельзя изменить значение, хранящееся в переменной:

```js
const obj = { foo: "bar" };
obj = { foo: "baz" }; // TypeError: invalid assignment to const `obj'
```

Но можно изменить свойства в переменной:

```js
obj.foo = "baz";
obj; // Object { foo: "baz" }
```

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

* `const`
* `let`
* `var`


SyntaxError: missing ; before statement - JavaScript

SyntaxError: missing ; before statement
=======================================

Сообщение
---------
```

SyntaxError: Expected ';' (Edge)
SyntaxError: missing ; before statement (Firefox)
```

Тип ошибки
----------

`SyntaxError`.

Что пошло не так?
-----------------

Отсутствует точка с запятой (`;`). Инструкции JavaScript должны заканчиваться точкой с запятой. В некоторых случаях имеет место автоматическая вставка точки с запятой (ASI), но в данном случае необходимо её поставить, чтобы JavaScript мог правильно обработать исходный код.

Часто эта ошибка является следствием другой ошибки, например, некорректного экранирования строк или неправильного использования `var`. Кроме того, где-то может быть слишком много скобок. Тщательно проверьте синтаксис при возникновении этой ошибки.

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

### Неэкранированные строки

Эта ошибка может легко возникнуть, если не экранировать строку правильным образом, из-за чего JavaScript будет рассматривать это место как конец строки. Например:

```js
var foo = 'Tom's bar';
// SyntaxError: missing ; before statement
```

Можно использовать двойные кавычки или экранировать апостроф:

```js
var foo = "Tom's bar";
var foo = 'Tom\'s bar';
```

### Объявление свойств через var

**Нельзя** объявить свойство объекта или массива с помощью `var`.

```js
var obj = {};
var obj.foo = 'привет'; // SyntaxError missing ; before statement

var array = [];
var array[0] = 'всем'; // SyntaxError missing ; before statement
```

Ключевое слово `var` необходимо опустить:

```js
var obj = {};
obj.foo = "привет";

var array = [];
array[0] = "всем";
```

### Неправильные ключевые слова

При переходе с другого языка программирования частой проблемой является использование ключевых слов, которые в JavaScript имеют другое значение или ничего не означают.

```js
def print(info){
  console.log(info);
}; // SyntaxError missing ; before statement
```

Вместо `def` используйте `function`:

```js
function print(info) {
  console.log(info);
}
```

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

* Автоматическая вставка точки с запятой (ASI)
* Инструкции JavaScript


TypeError: "x" is not a non-null object(Тип ошибки: "x" не является ненулевым объектом) - JavaScript

TypeError: "x" is not a non-null object(Тип ошибки: "x" не является ненулевым объектом)
=======================================================================================

Сообщения
---------
```

TypeError: недопустимый дескриптор свойства {x} (Edge)
TypeError: "x" не является ненулевым объектом (Firefox)
TypeError: описание свойства должно быть объектом: "x" (Chrome)
TypeError: недопустимое значение, используемое в слабом наборе (Chrome)
```

Тип ошибки
----------

`TypeError`Что пошло не так?
-----------------

Объект где-то ожидался и не был предоставлен. `null` не является объектом и не будет работать. Вы должны обеспечить надлежащий объект в данной ситуации.

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

### Ожидается дескриптор свойства

Когда такие методы, как `Object.create()` или `object.defineProperty()` и `object.defineProperties()` используются, дополнительный параметр дескриптора ожидает объект дескриптора свойства. Если не указать объект (например, просто число), возникнет ошибка:

```js
Object.defineProperty({}, "key", 1);
// TypeError: 1 is not a non-null object

Object.defineProperty({}, "key", null);
// TypeError: null is not a non-null object
```

Допустимый объект дескриптора свойства может выглядеть следующим образом:

```js
Object.defineProperty({}, "key", { value: "foo", writable: false });
```

### `СлабаяКарта` и `СлабыйСет` объектов требуют ключей объектов

`WeakMap` and `WeakSet` объекты хранят ключи объектов. Вы не можете использовать другие типы ключей.

```js
var ws = new WeakSet();
ws.add("foo");
// TypeError: "foo" is not a non-null object
```

Создание объекта вместо:

```js
ws.add({ foo: "bar" });
ws.add(window);
```

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

* `Object.create()`
* `Object.defineProperty()`, `Object.defineProperties()`
* `WeakMap`, `WeakSet`


Error: Permission denied to access property "x" - JavaScript

Error: Permission denied to access property "x"
===============================================

Сообщение
---------
```

Error: Permission denied to access property "x"
```

Тип ошибки
----------

`Error`.

Что пошло не так?
-----------------

Была попытка получить доступ к объекту, на который у вас нет разрешения. Вероятно, это элемент `<iframe>` (en-US), для которого вы нарушили правило ограничения домена.

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

```html
<!doctype html>
<html>
  <head>
    <iframe
 id="myframe"
 src="http://www1.w3c-test.org/common/blank.html"></iframe>
    <script>
 onload = function () {
 console.log(frames[0].document);
 // Error: Permission denied to access property "document"
 };
 </script>
  </head>
  <body></body>
</html>
```

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

* `<iframe>` (en-US)
* Same-origin policy


ReferenceError: can't access lexical declaration 'X' before initialization - JavaScript

ReferenceError: can't access lexical declaration 'X' before initialization
==========================================================================

Сообщение
---------
```

ReferenceError: can't access lexical declaration `X' before initialization (Firefox)
ReferenceError: 'x' is not defined (Chrome)
```

Тип ошибки
----------

`ReferenceError`Что случилось?
--------------

Попытка доступа к лексической переменной до её инициализации. Это может произойти в любом блоке, если попытаться обратиться к переменной, объявленной с помощью ключевых слов `let` или `const` до того, как им было присвоено значение.

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

### Неправильно

Здесь переменная "foo" заново объявляется внутри блока с помощью ключевого слова `let`.

```js
function test() {
  let foo = 33;
  if (true) {
    let foo = foo + 55;
    // ReferenceError: can't access lexical
    // declaration `foo' before initialization
  }
}
test();
```

### Правильно

Чтобы изменить "foo" в теле выражения if, надо убрать ключевое слово `let` и таким образом избавиться от повторного объявления.

```js
function test() {
  let foo = 33;
  if (true) {
    foo = foo + 55;
  }
}
test();
```

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

* Temporal Dead Zone and errors with let


Warning: unreachable code after return statement - JavaScript

Warning: unreachable code after return statement
================================================

Сообщение
---------
```

Warning: unreachable code after return statement (Firefox)
```

```
Предупреждение: недоступный код после оператора return (Firefox)
```

Тип ошибки
----------

Предупреждение

Что пошло не так?
-----------------

Недоступный код после оператора `return` может возникнуть в следующих ситуациях:

* когда в коде программы есть какие-либо выражения после оператора `return`
* когда используется оператор `return` без точки с запятой, но далее непосредственно за ним следует выражение.

Когда присутствует выражение после оператора `return`, то выдаётся предупреждение о том, что код программы после `return` недоступен, то есть он никогда не запустится и не выполнится.

Почему нужно ставить точку с запятой после оператора `return`? В случае оператора `return` без точки с запятой, совсем неясно, хотел ли разработчик вернуть результат, вычисляемый в следующей строке, или же он хочет остановиться сейчас и выйти из подпрограммы. Предупреждение указывает на неопределённость результата работы оператора `return`.

Предупреждение не появится для оператора `return` без точки с запятой, если за данной строкой следуют:

* `throw`
* `break`
* `var`
* `function`
Примеры
-------

### Неверные варианты

```js
function f() {
  var x = 3;
  x += 4;
  return x; //return завершает функцию немедленно,
  x -= 3; //поэтому эта строка никогда не запустится; она недоступна
}

function f() {
  return; //эта строка трактуется как завершение функции оператором `return;`,
  3 + 4; //поэтому происходит выход из функции, и эта строка не выполнится
}
```

### Верные варианты

```js
function f() {
  var x = 3;
  x += 4;
  x -= 3;
  return x; //OK: return находится после всех остальных выражений
}

function f() {
  return 3 + 4; //OK: return без точки с запятой и вычисляемое выражение находятся на одной строке
}
```

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

* Automatic Semicolon Insertion


TypeError: setting getter-only property "x"(установка свойства только для геттера "x") - JavaScript

TypeError: setting getter-only property "x"(установка свойства только для геттера "x")
======================================================================================

Сообщения
---------
```

TypeError: назначение свойств только для чтения не допускается в строгом режиме (Edge)
TypeError: установка свойства только для геттера "x" (Firefox)
TypeError: не удаётся установить свойство "prop" из #<Object>, который имеет только геттер (Chrome)
```

Тип ошибки
----------

`TypeError` только в строгом режиме.

Что пошло не так?
-----------------

Предпринята попытка задать новое значение свойству, для которого указан только геттер. . Пока это молча будет проигнорировано в non-strict режиме, оно бросит `TypeError` в strict mode.

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

В приведённом ниже примере показано, как установить getter для свойства. Он не задаёт сеттер, так TypeError выдаётся при попытке установить свойство температуры до 30. Дополнительные сведения см. Также в `Object.defineProperty()` странице.

```js
"use strict";

function Archiver() {
  var temperature = null;
  Object.defineProperty(this, "temperature", {
    get: function () {
      console.log("get!");
      return temperature;
    },
  });
}

var arc = new Archiver();
arc.temperature; // 'get!'

arc.temperature = 30;
// TypeError: setting getter-only property "temperature"
```

Чтобы устранить эту ошибку, необходимо либо удалить строку 16, в которой предпринята попытка задать свойство temperature, либо реализовать для неё сеттер, например, как показано ниже:

```js
"use strict";

function Archiver() {
  var temperature = null;
  var archive = [];

  Object.defineProperty(this, "temperature", {
    get: function () {
      console.log("get!");
      return temperature;
    },
    set: function (value) {
      temperature = value;
      archive.push({ val: temperature });
    },
  });

  this.getArchive = function () {
    return archive;
  };
}

var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]
```

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

* `Object.defineProperty()`
* `Object.defineProperties()`


SyntaxError: invalid regular expression flag "x" - JavaScript

SyntaxError: invalid regular expression flag "x"
================================================

Сообщение
---------
```

SyntaxError: invalid regular expression flag "x" (Firefox)
SyntaxError: Invalid regular expression flags (Chrome)
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

В коде есть недопустимые флаги регулярных выражений. Литерал в регулярном выражении, который содержит шаблон заключённый между двумя слешами, флаги определяются после второго флага. Они также могут быть объявлены в конструкторе функции `RegExp` object (второй параметр). Флаги регулярного выражения могут быть использованы отдельно или вместе в любой очерёдности, но в ECMAScript их только пять.

Чтоб включить флаг в регулярное выражение, используйте синтаксис:

```js
var re = /pattern/flags;
```

или

```js
var re = new RegExp("pattern", "flags");
```

Флаги регулярного выражения

| Флаг | Описание |
| --- | --- |
| `g` | Глобальный поиск. |
| i | Нечувствительный к регистру поиск. |
| m | Поиск по всем строкам. |
| u | Unicode; обрабатывать шаблон как последовательность кода Unicode |
| y | Выполняет «липкий» поиск, который будет начинаться с текущей позиции в целевой строке. См. `sticky` |

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

Существует только пять действительных флагов регулярных выражений.

```js
/foo/bar;

// Ошибка синтаксиса: недействительный флаг "b" для регулярного выражения
```

Вы намеревались создать регулярное выражение? Выражение, содержащее два слеша, интерпретируется как литерал регулярного выражения.

```js
let obj = {
  url: /docs/Web
};

// Ошибка синтаксиса: недействительный флаг "W" для регулярного выражения
```

Или вы хотели создать строку вместо этого? Добавьте одинарные или двойные кавычки, чтобы создать строковый литерал.

```js
let obj = {
  url: "/docs/Web",
};
```

### Действительные флаги регулярного выражения

Взгляните на таблицу выше, где представлены пять действительных флагов регулярного выражения, которые разрешены в JavaScript

```js
/foo/g;
/foo/gim;
/foo/uy;
```

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

* Regular expressions
* XRegEx flags – библиотека регулярного выражения, которая предоставляет четыре новых флага (`n`, `s`, `x`, `A`)


SyntaxError: missing ] after element list - JavaScript

SyntaxError: missing ] after element list
=========================================

Сообщение
---------
```

SyntaxError: missing ] after element list
```

Тип ошибки
----------

`SyntaxError`.

Что пошло не так?
-----------------

Ошибка в синтаксисе инициализации массива. Скорее всего, пропущена закрывающая квадратная скобка ("`]`") или запятая ("`,`").

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

### Незавершённый инициализатор массива

```js
var list = [1, 2,

var instruments = [
  'Укулеле',
  'Гитара',
  'Пианино'
};

var data = [{foo: 'bar'} {bar: 'foo'}];
```

Правильные варианты:

```js
var list = [1, 2];

var instruments = ["Укулеле", "Гитара", "Пианино"];

var data = [{ foo: "bar" }, { bar: "foo" }];
```

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

* `Array`


TypeError: "x" is not a constructor - JavaScript

TypeError: "x" is not a constructor
===================================

Сообщение
---------
```

TypeError: Object doesn't support this action (Edge)
TypeError: "x" is not a constructor

TypeError: Math is not a constructor
TypeError: JSON is not a constructor
TypeError: Symbol is not a constructor
TypeError: Reflect is not a constructor
TypeError: Intl is not a constructor
TypeError: SIMD is not a constructor
TypeError: Atomics is not a constructor
```

Тип ошибки
----------

`TypeError`Что пошло не так?
-----------------

Была попытка использовать объект или переменную как конструктор, однако этот объект или переменная - не конструктор. Смотрите constructor или `new` operator, чтобы получить больше информации о том, что такое конструктор.

Существует множество глобальных объектов, таких как `String` или `Array`, которые можно построить с использованием `new`. Однако, некоторые глобальные объекты - нельзя, т.к. их свойства и методы статичны. Следующие стандартные встроенные объекты JavaScript - не конструкторы: `Math`, `JSON`, `Symbol`, `Reflect`, `Intl`, `SIMD`, `Atomics`.

Функции-генераторы также не могут быть использованы как конструкторы.

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

### Неправильное использование

```js
var Car = 1;
new Car();
// TypeError: Car is not a constructor

new Math();
// TypeError: Math is not a constructor

new Symbol();
// TypeError: Symbol is not a constructor

function\* f() {}
var obj = new f();
// TypeError: f is not a constructor
```

### Конструктор "car" (автомобиль)

Представьте, что вы хотите создать тип объекта для автомобилей. Вы хотите, чтобы этот тип объектов назывался `car`, и вы хотите, чтобы были свойства для производителя, модели и года выпуска. Чтобы сделать это, вы должны написать следующую функцию:

```js
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
```

Теперь вы можете создать объект, который называется `mycar` (мой автомобиль) следующим образом:

```js
var mycar = new Car("Лада", "Самара", 1993);
```

### В Промисах

В случае, когда возвращается незамедлительно разрешённый или незамедлительно отклонённый промис, вам не нужно создавать новый промис *new Promise(...)* и работать с ним.

Это неправильно (конструктор Promise вызывается неправильно) и будет вызывать исключение `TypeError: this is not a constructor`:

```js
return new Promise.resolve(true);
```

Вместо этого используйте статические методы - Promise.resolve() или Promise.reject() :

```js
// Это допустимо, но слишком длинно, в этом нет необходимости:
return new Promise((resolve, reject) => {
  resolve(true);
});

// Вместо этого, возвращайте статический метод:
return Promise.resolve(true);
return Promise.reject(false);
```

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

* constructor
* `new` operator


RangeError: precision is out of range - JavaScript

RangeError: precision is out of range
=====================================

Сообщение
---------
```

RangeError: precision {0} out of range (Firefox)
RangeError: toExponential() argument must be between 0 and 20 (Chrome)
RangeError: toFixed() digits argument must be between 0 and 20 (Chrome)
RangeError: toPrecision() argument must be between 1 and 21 (Chrome)
```

Тип ошибки
----------

`RangeError`Что пошло не так?
-----------------

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

* `Number.prototype.toExponential()`
* `Number.prototype.toFixed()`
* `Number.prototype.toPrecision()`

Допустимые значения для аргументов данных методов обычно лежат в диапазоне от 0 до 20 (или 21), однако спецификация ECMAScript допускает его расширение.

| Метод | Firefox (SpiderMonkey) | Chrome, Opera (V8) |
| --- | --- | --- |
| `Number.prototype.toExponential()` | от 0 до 100 | от 0 до 20 |
| `Number.prototype.toFixed()` | от -20 до 100 | от 0 до 20 |
| `Number.prototype.toPrecision()` | от 1 до 100 | от 1 до 21 |

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

### Примеры некорректного кода

```js
(77.1234).toExponential(-1); // RangeError
(77.1234).toExponential(101); // RangeError

(2.34).toFixed(-100); // RangeError
(2.34).toFixed(1001); // RangeError

(1234.5).toPrecision(-1); // RangeError
(1234.5).toPrecision(101); // RangeError
```

### Примеры правильного кода

```js
(77.1234).toExponential(4); // 7.7123e+1
(77.1234).toExponential(2); // 7.71e+1

(2.34).toFixed(1); // 2.3
(2.35).toFixed(1); // 2.4 (обратите внимание: в данном случае производится округление в большую сторону)

(5.123456).toPrecision(5); // 5.1235
(5.123456).toPrecision(2); // 5.1
(5.123456).toPrecision(1); // 5
```

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

* `Number.prototype.toExponential()`
* `Number.prototype.toFixed()`
* `Number.prototype.toPrecision()`


TypeError: 'x' is not iterable (Тип ошибки  'x' не является итерационным) - JavaScript

TypeError: 'x' is not iterable (Тип ошибки 'x' не является итерационным)
========================================================================

Сообщение
---------
```

TypeError: "x" не является итерационным (Firefox, Chrome)
TypeError: 'x' не является функцией или её возвращаемое значение не является итерационным (Chrome)
```

Тип ошибки
----------

`TypeError`Что пошло не так?
-----------------

Значение, которое даётся как правая сторона for...of или как аргумент функции, такой как `Promise.all` или `TypedArray.from` (en-US), не является итерационным объектом. Повторяемое может быть, встроенный итератор типа, такие как `Array`, `String` или `Map` (en-US), генератор результатом, или объект, реализующий итератор протокол.

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

### Итерация по свойствам объекта

В JavaScript, `object` не повторяется, если они реализуют итерационный протокол . Поэтому нельзя использовать for...of для перебора свойств объекта.

```js
var obj = { France: "Paris", England: "London" };
for (let p of obj) {
  // TypeError: obj не является итерационным
  // …
}
```

Вместо этого вы должны использовать `Object.keys` или `Object.entries`, для итерации по свойствам или записям объекта.

```js
var obj = { France: "Paris", England: "London" };
// Iterate over the property names:
for (let country of Object.keys(obj)) {
  var capital = obj[country];
  console.log(country, capital);
}

for (const [country, capital] of Object.entries(obj))
  console.log(country, capital);
```

Другим вариантом для этого варианта использования может быть использование `Map` (en-US):

```js
var map = new Map();
map.set("France", "Paris");
map.set("England", "London");
// Iterate over the property names:
for (let country of map.keys()) {
  let capital = map[country];
  console.log(country, capital);
}

for (let capital of map.values()) console.log(capital);

for (const [country, capital] of map.entries()) console.log(country, capital);
```

### Итерация по генератору

Генераторы - это функции, вызываемые для создания итерационного объекта.

```js
function\* generate(a, b) {
  yield a;
  yield b;
}

for (let x of generate) // TypeError: генерация не является итерационной
  console.log(x);
```

Если они не вызываются, то объект `Function`, соответствующий генератору, можно вызвать, но нельзя выполнить итерацию. Вызов генератора создаёт итерационный объект, который будет выполнять итерацию по значениям, полученным во время выполнения генератора.

```js
function\* generate(a, b) {
  yield a;
  yield b;
}

for (let x of generate(1, 2)) console.log(x);
```

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

* iterable protocol
* `Object.keys`
* `Object.entries`
* `Map` (en-US)
* generators
* for…of


RangeError: radix must be an integer - JavaScript

RangeError: radix must be an integer
====================================

Сообщение
---------
```

RangeError: radix must be an integer at least 2 and no greater than 36 (Firefox)
RangeError: toString() radix argument must be between 2 and 36 (Chrome)
```

Тип ошибки
----------

`RangeError`Что пошло не так?
-----------------

Метод `Number.prototype.toString()` был вызван с дополнительным параметром `radix`. Его значение должно быть целым числом, принадлежащим промежутку от 2 до 36 и указывающим основание системы счисления, которая должна быть использована для представления численных значений. Например, десятичное (основание 10) число 169 представляется в шестнадцатеричном виде (основание 16) как A9.

Почему значение этого параметра не может быть больше, чем 36? Для оснований, превышающих 10, в качестве цифр используются алфавитные символы; следовательно, основание не может быть больше 36, поскольку в латинском алфавите (используемом английским и многими другими языками) только 26 символов.

Наиболее распространённые основания систем счисления:

* 2 для двоичных чисел,
* 8 для восьмеричных чисел,
* 10 для десятичных чисел,
* 16 для шестнадцатеричных чисел.
Примеры
-------

### Некорректное применение

```js
(42).toString(0);
(42).toString(1);
(42).toString(37);
(42).toString(150);
// Нельзя использовать для форматирования строку данного вида:
(12071989).toString("MM-dd-yyyy");
```

### Корректное применение

```js
(42).toString(2); // "101010" (двоичная система)
(13).toString(8); // "15" (восьмеричная)
(0x42).toString(10); // "66" (десятичная)
(100000).toString(16); // "186a0" (шестнадцатеричная)
```

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

* `Number.prototype.toString()`


TypeError: invalid Array.prototype.sort argument (TypeError: недопустимый Array.prototype.sort argument) - JavaScript

TypeError: invalid Array.prototype.sort argument (TypeError: недопустимый Array.prototype.sort argument)
========================================================================================================

Сообщение
---------
```

TypeError: аргумент не является объектом функции (Edge)
TypeError: недопустимый Array.prototype.sort аргумент для (Firefox)
```

Тип ошибки
----------

`TypeError`Что пошло не так?
-----------------

Аргумент `Array.prototype.sort()` предполагается либо `undefined` или функцию, которая сравнивает его операндов.

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

### Неправильные примеры

```js
[1, 3, 2].sort(5); // TypeError

var cmp = { asc: (x, y) => x >= y, dsc: (x, y) => x <= y };
[1, 3, 2].sort(cmp[this.key] || "asc"); // TypeError
```

### правильные

```js
[1, 3, 2].sort(); // [1, 2, 3]

var cmp = { asc: (x, y) => x >= y, dsc: (x, y) => x <= y };
[1, 3, 2].sort(cmp[this.key || "asc"]); // [1, 2, 3]
```

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

* `Array.prototype.sort()`


Ошибка Ссылки: устаревший вызывающий объект или использование аргументов - JavaScript

Ошибка Ссылки: устаревший вызывающий объект или использование аргументов
========================================================================

Message(сообщение)
------------------
```

TypeError(Ошибка Типа): 'arguments', 'callee' и 'caller' являются ограниченными свойствами функции и не могут быть доступны в этом контексте (EDGE)
Warning: ReferenceError(Ошибка Ссылки): deprecated caller usage (устаревшие использование вызывающего абонента Firefox)
Warning: ReferenceError(Ошибка Ссылки): deprecated arguments usage (использование устаревших аргументов Firefox)
TypeError(Ошибка Типа): 'callee' и 'caller' (не может быть доступен в строгом режиме safari)
```

Error type (Тип ошибки)
-----------------------

Предупреждение строгого режима, при котором произошла операция `ReferenceError` выполнение JavaScript не будет остановлено.

What went wrong?(Что пошло не так?)
-----------------------------------

В строгом режиме используются свойства `Function.caller` или `Function.arguments` которых не должны быть. Они являются устаревшими, потому что они утечка вызывающей функции, являются нестандартными, и их трудно оптимизировать, и это потенциально опасный для производительности компонент.

Examples(Примеры)
-----------------

### Устаревшая `function.caller` или `arguments.callee.caller`

`Function.caller` и `arguments.callee.caller` являются устаревшими (Дополнительные сведения см. в справочных статьях).

```js
"use strict";

function myFunc() {
  if (myFunc.caller == null) {
    return "The function was called from the top!";
  } else {
    return "This function's caller was " + myFunc.caller;
  }
}

myFunc();
// Warning: ReferenceError: устаревшее использование вызывающего абонента
// "функция была вызвана сверху!"
```

### `Function.arguments`

`Function.arguments` является устаревшим (Дополнительные сведения см. в справочной статье).

```js
"use strict";

function f(n) {
  g(n - 1);
}

function g(n) {
  console.log("before: " + g.arguments[0]);
  if (n > 0) {
    f(n);
  }
  console.log("after: " + g.arguments[0]);
}

f(2);

console.log("returned: " + g.arguments);
// Warning: ReferenceError: использование устаревших аргументов
```

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

* Deprecated and obsolete features (Устаревшие функции)
* Strict mode (строгий режим)
* `Function.arguments`
* `Function.caller` и `arguments.callee.caller`


SyntaxError: function statement requires a name(функция оператор требует имя) - JavaScript

SyntaxError: function statement requires a name(функция оператор требует имя)
=============================================================================

Сообщение
---------
```

SyntaxError: ожидаемый идентификатор (Edge)
SyntaxError: оператор функции требует имя [Firefox]
SyntaxError: непредвиденный токен ( [Chrome]
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

В коде есть оператор function, для которого требуется имя. Вам нужно будет проверить, как определены функции и нужно ли предоставить для них имя, или если рассматриваемая функция должна быть выражением функции, IIFE, или если код функции вообще правильно размещён в этом контексте.

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

### Операторы vs выражения

Оператор функции (или объявление функции) требует имя, это не будет работать:

```js
function () {
  return 'Hello world';
}
// SyntaxError: function statement requires a name
```

Вы можете использовать выражение функции (назначат) вместо:

```js
var greet = function () {
  return "Hello world";
};
```

Или, ваша функция возможно, предназначена для IIFE (немедленно вызываемое выражение функции), которое является функцией, которая запускается, как только она определена. В этом случае вам понадобится ещё несколько брекетов:

```js
(function () {})();
```

### Помеченные функции

При использовании меток функций после ключевого слова function всё равно потребуется указать имя функции. Это не работает:

```js
function Greeter() {
  german: function () {
    return "Moin";
  }
}
// SyntaxError: оператор функции требует имя
```

Это будет работать, например так:

```js
function Greeter() {
  german: function g() {
    return "Moin";
  }
}
```

### Методы объекта

Если вы намеревались создать метод объекта, вам нужно будет создать объект. Тогда допустим следующий синтаксис без имени после ключевого слова function.

```js
var greeter = {
  german: function () {
    return "Moin";
  },
};
```

### Синтаксис вызова

Кроме того, внимательно следите за синтаксисом при использовании колбэков. Очень легко забыть скобку или запятую.

```js
promise.then(
  function() {
    console.log("success");
  });
  function() {
    console.log("error");
}
// SyntaxError: function statement requires a name
```

как бы было правильно:

```json
promise.then(
  function() {
    console.log("success");
  },
  function() {
    console.log("error");
  }
);
```

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

* Functions in the JavaScript Guide (функции в javascript"e гайд)
* Оператор функции
* Выражение функции
* IIFE
* label


TypeError: "x" is (not) "y" - JavaScript

TypeError: "x" is (not) "y"
===========================

Сообщение
---------
```

TypeError: "x" is (not) "y"

Examples:
TypeError: "x" is undefined
TypeError: "x" is null
TypeError: "undefined" is not an object
TypeError: "x" is not an object or null
TypeError: "x" is not a symbol
```

Тип ошибки
----------

`TypeError`.

Что случилось?
--------------

Встречен неожиданный тип. Это часто случается со значениями `null` или `undefined`.

Так же, некоторые методы, такие как `Object.create()` или `Symbol.keyFor()`, требуют определённый тип, который должен быть предоставлен.

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

### Недопустимые случаи

```js
// Случаи undefined и null, при которых метод substring не будет работать
var foo = undefined;
foo.substring(1); // TypeError: foo is undefined

var foo = null;
foo.substring(1); // TypeError: foo is null

// Некоторые методы могут требовать определённый тип
var foo = {};
Symbol.keyFor(foo); // TypeError: foo is not a symbol

var foo = "bar";
Object.create(foo); // TypeError: "foo" is not an object or null
```

### Решение проблемы

Что бы исправить ошибку пустого указателя вы можете использовать оператор typeof.

```js
if (typeof foo !== "undefined") {
  // Теперь мы знаем, что foo определено.
}
```

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

* `undefined`
* `null`


SyntaxError: for-in loop head declarations may not have initializers - JavaScript

SyntaxError: for-in loop head declarations may not have initializers
====================================================================

Исключение "for-in loop head declarations may not have initializers" возникает в строгом режиме, когда в управляющей конструкции цикла for...in присваивается значение переменной-итератору, например `for (var i = 0 in obj)`. В нестрогом режиме также будет возникать исключение, если переменная-итератор объявлена через `const`, например `for (const i = 0 in obj)`.

Сообщение
---------
```

SyntaxError: for-in loop variable declaration may not have an initializer. (V8-based)
SyntaxError: for-in loop head declarations may not have initializers (Firefox)
SyntaxError: a lexical declaration in the head of a for-in loop can't have an initializer (Firefox)
SyntaxError: Cannot assign to the loop variable inside a for-in loop header. (Safari)
```

Тип ошибки
----------

`SyntaxError` только в строгом режиме.

Что не так?
-----------

Управляющая конструкция цикла for...in содержит выражение инициализации. Другими словами, при создании цикла присваивается значение переменной-итератору. В нестрогом режиме эта конструкция игнорируется, а поведение равно `for (var i = 0 in obj)`. В строгом же режиме, будет ошибка синтаксиса `SyntaxError`. Однако, даже в нестрогом режиме присвоение значения переменной-итератору, объявленной через `const`, вроде `for (const i = 0 in obj)`, приведёт к ошибке синтаксиса `SyntaxError`.

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

Данный пример приведёт к ошибке синтаксиса:

```js
"use strict";

const obj = { a: 1, b: 2, c: 3 };

for (const i = 0 in obj) {
  console.log(obj[i]);
}

// SyntaxError: for-in loop head declarations may not have initializers
```

### Правильный цикл for-in

Нужно удалить присвоение значения (`i = 0`) из инициализации цикла for-in.

```js
"use strict";

const obj = { a: 1, b: 2, c: 3 };

for (const i in obj) {
  console.log(obj[i]);
}
```

### Итерация массива

Цикл for...in не должен использоваться для итерации массива. Вы намеревались использовать цикл for вместо цикла for-in для итерации `Array`? Цикл for позволяет также установить инициализатор:

```js
const arr = ["a", "b", "c"];

for (let i = 2; i < arr.length; i++) {
  console.log(arr[i]);
}

// "c"
```

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

* `for...in`
* `for...of`
* `for`


SyntaxError: test for equality (==) mistyped as assignment (=)?(тест на равенство (==) опечатка как присваивание (=)?) - JavaScript

SyntaxError: test for equality (==) mistyped as assignment (=)?(тест на равенство (==) опечатка как присваивание (=)?)
======================================================================================================================

Сообщения
---------
```

Warning: SyntaxError: тест на равенство (==) опечатка как присваивание (=)?
```

Тип ошибки
----------

(Только в Firefox) `SyntaxError` предупреждение, в котором сообщается, только если `javascript.options.strict` предпочтение установлено в `true`.

Что пошло не так?
-----------------

Было присвоение ( = ), когда вы обычно ожидали тест на присвоение (==). Чтобы помочь отладке, JavaScript (с включёнными строгими предупреждениями) предупреждает об этом шаблоне.

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

### Задание в условных выражениях

Рекомендуется не использовать простые назначения в условном выражении (например, if...else), поскольку при просмотре кода назначение можно спутать с равенством. Например, не используйте следующий код:

```js
if (x = y) {
  // делать правильные вещи
}
```

Если необходимо использовать присваивание в условном выражении, то обычно вокруг него ставят дополнительные скобки. Например:

```js
if ((x = y)) {
  // делать правильные вещи
}
```

В противном случае вы, вероятно, хотели использовать оператор сравнения (например, = = или ===):

```js
if (x == y) {
  // делать правильные вещи
}
```

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

* `if...else`
* Comparison operators (en-US)


RangeError: repeat count must be non-negative - JavaScript

RangeError: repeat count must be non-negative
=============================================

Сообщение
---------
```

RangeError: repeat count must be non-negative (Firefox)
RangeError: Invalid count value (Chrome)
```

Тип ошибки
----------

`RangeError`Что пошло не так?
-----------------

Был использован метод `String.prototype.repeat()`, с параметром `count`, указывающим количество повторений строки. Параметр может принимать значения между 0 и положительной `Infinity`, и не может быть отрицательным числом. Диапазон допустимых значений может быть описан следующим образом: [0, + ∞).

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

### Неверно

```js
"abc".repeat(-1); // RangeError
```

### Верно

```js
"abc".repeat(0); // ''
"abc".repeat(1); // 'abc'
"abc".repeat(2); // 'abcabc'
"abc".repeat(3.5); // 'abcabcabc' (count will be converted to integer)
```

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

* `String.prototype.repeat()`


SyntaxError: Using //@ to indicate sourceURL pragmas is deprecated. Use //# instead - JavaScript

SyntaxError: Using //@ to indicate sourceURL pragmas is deprecated. Use //# instead
===================================================================================

Сообщение
---------
```

Warning: SyntaxError: Using //@ to indicate sourceURL pragmas is deprecated. Use //# instead

Warning: SyntaxError: Using //@ to indicate sourceMappingURL pragmas is deprecated. Use //# instead
```

Тип ошибки
----------

Предупреждение о том, что произошла ошибка `SyntaxError`. Выполнение скрипта не будет остановлено.

Что пошло не так?
-----------------

Есть устаревший синтаксис карты кода в исходном коде JavaScript.

Файлы JavaScript нередко объединяются и сокращаются, чтобы доставлять их с сервера более эффективно. С картой кода, отладчик может сопоставить код выполнения для исходных файлов.

Спецификация карты кода меняет синтаксис из-за конфликта с IE всякий раз, когда он был найден в странице после `//@cc_on` было интерпретировано для включения условной компиляции в IE JScript engine. Комментарий условной компиляции для IE малоизвестен, и это разбивает карты кода jQuery и других библиотек.

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

### Устаревший синтаксис

Синтаксис с использованием знака "@" устарел.

```js
//@ sourceMappingURL=http://example.com/path/to/your/sourcemap.map
```

### Стандартный синтаксис

Используйте знак "#".

```js
//# sourceMappingURL=http://example.com/path/to/your/sourcemap.map
```

Или, в качестве альтернативы, вы можете установить заголовок для вашего JavaScript-файла чтобы избежать комментирования:

```js
X-SourceMap: /path/to/file.js.map
```

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

* Как использовать карты кода – документация Firefox Tools (en-US)
* Введение в карты кода – HTML5 rocks


SyntaxError: return not in function - JavaScript

SyntaxError: return not in function
===================================

Сообщение
---------
```

SyntaxError: 'return' statement outside of function (Edge)
SyntaxError: return not in function (Firefox)
SyntaxError: yield not in function (Firefox)
```

Тип ошибки
----------

`SyntaxError`.

Что пошло не так?
-----------------

Вызов оператора `return` или `yield` был осуществлён вне функции. Может, где-то пропущена фигурная скобка? Операторы `return` и `yield` не могут существовать вне функции, поскольку они завершают (или останавливают и возобновляют) её исполнение и указывают значение, возвращаемое в место, откуда она была вызвана.

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

```js
var cheer = function(score) {
  if (score === 147)
    return 'Максимум!';
  };
  if (score > 100) {
    return 'Столетие!';
  }
}

// SyntaxError: return not in function
```

На первый взгляд кажется, что фигурные скобки расставлены правильно, но в данном примере пропущена `{` после первого оператора `if`. Правильный вариант:

```js
var cheer = function (score) {
  if (score === 147) {
    return "Максимум!";
  }
  if (score > 100) {
    return "Столетие!";
  }
};
```

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

* `return`
* `yield`


SyntaxError: unterminated string literal - JavaScript

SyntaxError: unterminated string literal
========================================

Ошибка JavaScript «незавершённый строковый литерал» возникает, когда где-то встречается незавершённый строковый литерал. Строковые литералы должны быть заключены в одинарные (`'`) или двойные (`"`)) кавычки.

Сообщение
---------
```

SyntaxError: Unterminated string constant (Edge)
SyntaxError: unterminated string literal (Firefox)
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

Где-то есть незавершённый строковый литерал. Строковые литералы должны быть заключены в одинарные (`'`) или двойные (`"`) кавычки. JavaScript не делает различий между строками в одинарных и двойных кавычках. Экранирование символов работают в строках, созданных и с одинарными и с двойными кавычками.

Чтобы исправить эту ошибку, проверьте:

* у вас есть открывающая и закрывающая кавычки (обе одинарные или обе двойные) для строкового литерала,
* вы правильно экранировали строковый литерал,
* строковый литерал не разбивается на несколько строк.
Примеры
-------

### Несколько строк

Вы не можете разделить строку на несколько строк, как в JavaScript:

```js
var longString = "Это очень длинная строка, которую
                  необходимо разбивать на несколько строк,
                  потому что иначе её трудно читать.";
// SyntaxError: unterminated string literal
```

Вместо этого используйте оператор +, обратную косую черту или шаблонные строки.

Вариант с оператором `+` выглядит следующим образом:

```js
const longString =
  "Это очень длинная строка, которую " +
  "необходимо разбивать на несколько строк, " +
  "потому что иначе её трудно читать.";
```

Или можно использовать символ обратной косой черты ("\") в конце каждой строки, чтобы указать, что текст будет продолжаться на следующей строке. Убедитесь, что после обратной косой черты нет пробелов или других символов (кроме разрыва строки) или отступа, иначе это не сработает. Такой подход выглядит следующим образом:

```js
const longString =
  "Это очень длинная строка, которую \
необходимо разбивать на несколько строк, \
потому что иначе её трудно читать.";
```

Ещё одна возможность — использовать шаблонные строки:

```js
const longString = `Это очень длинная строка, которую
необходимо разбивать на несколько строк,
потому что иначе её трудно читать.`;
```

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

* Строковый литерал
* Шаблонные строки


TypeError: More arguments needed - JavaScript

TypeError: More arguments needed
================================

Сообщение
---------
```

TypeError: Object.create requires more than 0 arguments
TypeError: Object.setPrototypeOf requires more than 1 argument
TypeError: Object.defineProperties requires more than 0 arguments
```

Тип ошибки
----------

`TypeError`.

Что пошло не так?
-----------------

Ошибка в вызове функции. Необходимо передать больше аргументов.

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

Метод `Object.create()` требует хотя бы один аргумент, а `Object.setPrototypeOf()` минимум двух:

```js
var obj = Object.create();
// TypeError: Object.create requires more than 0 arguments

var obj = Object.setPrototypeOf({});
// TypeError: Object.setPrototypeOf requires more than 1 argument
```

Вы можете исправить это, установив `null` в качестве прототипа, например:

```js
var obj = Object.create(null);

var obj = Object.setPrototypeOf({}, null);
```

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

* Функции


SyntaxError: illegal character - JavaScript

SyntaxError: illegal character
==============================

Сообщение
---------
```

SyntaxError: illegal character (Firefox)
SyntaxError: Invalid or unexpected token (Chrome)
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

Присутствует недопустимый или неожиданный знак, который не принадлежит данной позиции в коде. Используйте редактор, поддерживающий подсветку синтаксиса, и внимательно проверьте ваш код на предмет таких несовпадений, как знак минус (`-`) вместо тире (`–`) или простые кавычки (`"`) вместо нестандартных знаков цитирования (`“`).

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

### Несоответствующие символы

Некоторые символы выглядят одинаково, но становится причиной того, что анализатор не выполняет интерпретацию вашего кода.

```js
“This looks like a string”;
// SyntaxError: illegal character

42 – 13;
// SyntaxError: illegal character
```

Так должно работать:

```js
"This is actually a string";

42 - 13;
```

### Пропущенные символы

Это просто — пропустить символ здесь или там.

```js
var colors = ['#000', #333', '#666'];
// SyntaxError: illegal character
```

Добавляем пропущенную кавычку для `'#333'` .

```js
var colors = ["#000", "#333", "#666"];
```

### Скрытые символы

Подчас копирования кода из внешнего источника могут встречаться недействительные символы. Будьте внимательны!

```js
var foo = 'bar';
// SyntaxError: illegal character
```

Если проверить этот код в редакторе вроде Vim, вы можете увидеть, что в коде присутствует символ, именуемый нулевой пробел (zero-width space (ZWSP) (U+200B)).

```js
var foo = 'bar';<200b>
```

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

* Lexical grammar


RangeError: invalid date - JavaScript

RangeError: invalid date
========================

Сообщение
---------
```

RangeError: invalid date (Firefox)
RangeError: invalid time value (Chrome)
RangeError: Provided date is not in valid range (Chrome)
```

Тип ошибки
----------

`RangeError`Что пошло не так?
-----------------

Строка, ведущая к недопустимой дате, была выведена `Date` или `Date.parse()`.

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

### Неверные записи

Неопознанные строки или даты, содержащие недопустимые значения элементов в строках, отформатированных ISO, обычно возвращают `NaN`. Тем не менее, в зависимости от реализации, при несоответствии строкам формата ISO, может также возникнуть ошибка `RangeError: invalid date`, например в следующих случаях, в Firefox.

```js
new Date("foo-bar 2014");
new Date("2014-25-23").toISOString();
new Date("foo-bar 2014").toString();
```

Это, без сомнения, вернёт `NaN` в Firefox:

```js
Date.parse("foo-bar 2014"); // NaN
```

Для получения более подробной информации, смотрите документацию по `Date.parse()`

### Верная запись

```js
new Date("05 October 2011 14:48 UTC");
```

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

* `Date`
* `Date.prototype.parse()`
* `Date.prototype.toISOString()`


TypeError: can't define property "x": "obj" is not extensible - JavaScript

TypeError: can't define property "x": "obj" is not extensible
=============================================================

Сообщение
---------
```

TypeError: Cannot create property for a non-extensible object (Edge)
TypeError: can't define property "x": "obj" is not extensible (Firefox)
TypeError: Cannot define property: "x", object is not extensible. (Chrome)
```

Тип ошибки
----------

`TypeError`Что произошло не так?
---------------------

Обычно, объект расширяемый и к нему можно добавить новые свойства. Однако в этой ситуации `Object.preventExtensions()` сделал объект нерасширяемым, так что у него не может появиться других свойств, отличных от тех, которые были объявлены когда объект стал нерасширяемым.

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

В строгом режиме при попытке добавить новые свойства в нерасширяемый объект возникает ошибка TypeError. В нестрогом режиме добавление свойства "x" игнорируется.

```js
"use strict";

var obj = {};
Object.preventExtensions(obj);

obj.x = "foo";
// TypeError: can't define property "x": "obj" is not extensible
```

В обеих, строгом и нестрогом режимах, вызов `Object.defineProperty()` вызывает исключение при добавлении нового свойства в нерасширяемый объект.

```js
var obj = {};
Object.preventExtensions(obj);

Object.defineProperty(obj, "x", { value: "foo" });
// TypeError: can't define property "x": "obj" is not extensible
```

Чтобы исправить эту ошибку, необходимо удалить вызов `Object.preventExtensions()` полностью или переместить его в положение, чтобы сначала свойство добавлялось, а потом объект помечался как нерасширяемый. Конечно вы также можете удалить свойство, которое пытались добавить, если оно вам не нужно.

```js
"use strict";

var obj = {};
obj.x = "foo"; // add property first and only then prevent extensions

Object.preventExtensions(obj);
```

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

* `Object.preventExtensions()`


ReferenceError: assignment to undeclared variable "x" - JavaScript

ReferenceError: assignment to undeclared variable "x"
=====================================================

Сообщение
---------
```

ReferenceError: assignment to undeclared variable "x" (Firefox)
ReferenceError: "x" is not defined (Chrome)
ReferenceError: Variable undefined in strict mode (Edge)
```

Тип ошибки
----------

`ReferenceError` предупреждение только в строгом режиме.

Что пошло не так?
-----------------

Значению присвоена необъявленная переменная. Другими словами, было задание без ключевого слова var. Существуют некоторые различия между объявленными и необъявленными переменными, что может привести к неожиданным результатам, поэтому JavaScript представляет ошибку в строгом режиме.

Три примечания о объявленных и необъявленных переменных:

* Объявленные переменные ограничены в контексте выполнения, в котором они объявлены. Необъявленные переменные всегда глобальны.
* Объявленные переменные создаются до выполнения любого кода. Необъявленные переменные не существуют до тех пор, пока не будет выполняться присвоение им кода.
* Объявленные переменные - это неконфигурируемое свойство контекста их выполнения (функция или глобальная). Необъявленные переменные настраиваются (например, могут быть удалены).

Более подробную информацию и примеры см. На странице справки `Переменных`

Errors about undeclared variable assignments occur in strict mode code only. In non-strict code, they are silently ignored.

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

### Неправильно

В этом случае переменная "bar" является необъявленной переменной.

```js
function foo() {
  "use strict";
  bar = true;
}
foo(); // ReferenceError: assignment to undeclared variable bar
```

### Правильно

Чтобы сделать "bar" объявленной переменной, вы можете добавить перед ней ключевое слово `var` .

```js
function foo() {
  "use strict";
  var bar = true;
}
foo();
```

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

* режим Strict


ReferenceError: invalid assignment left-hand side - JavaScript

ReferenceError: invalid assignment left-hand side
=================================================

Сообщение
---------
```

ReferenceError: invalid assignment left-hand side
```

Тип ошибки
----------

`ReferenceError`.

Что пошло не так?
-----------------

Найдено неожиданное присваивание. Это может быть связано, например, с несоответствием оператора присваивания (en-US) и оператора сравнения: один знак «`=`» присваивает значение переменной, а операторы «`==`» или «`===`» осуществляют сравнение.

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

```js
if (Math.PI = 3 || Math.PI = 4) {
  console.log('исключено!');
}
// ReferenceError: invalid assignment left-hand side

var str = 'Привет, '
+= 'не меня ли '
+= 'ты ищешь?';
// ReferenceError: invalid assignment left-hand side
```

В выражении `if` вам нужно использовать оператор сравнения («==»), а для конкатенации строк необходим оператор плюс («+»).

```js
if (Math.PI == 3 || Math.PI == 4) {
  console.log("исключено!");
}

var str = "Привет " + "с другой " + "стороны!";
```

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

* Операторы присваивания (en-US)
* Операторы сравнения


TypeError: Reduce of empty array with no initial value(Тип ошибки: уменьшение пустого массива без начального значения) - JavaScript

TypeError: Reduce of empty array with no initial value(Тип ошибки: уменьшение пустого массива без начального значения)
======================================================================================================================

Сообщение
---------
```

TypeError: уменьшение пустого массива без начального значения
```

Тип ошибки
----------

`TypeError`Что пошло не так?
-----------------

В JavaScript существует несколько уменьшающих функций :

* `Array.prototype.reduce()`, `Array.prototype.reduceRight()` и
* `TypedArray.prototype.reduce()` (en-US), `TypedArray.prototype.reduceRight()` (en-US)).

Эти функции дополнительно принимают значение initialValue (которое будет использоваться в качестве первого аргумента для первого вызова колбэка). Однако если начальное значение не указано, будет использоваться первый элемент `Array` или `TypedArray` в качестве начального значения. Эта ошибка возникает, когда предоставляется пустой массив, так как в этом случае не может быть возвращено начальное значение.

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

### Неправильные примеры

Эта проблема часто возникает в сочетании с фильтром (`Array.prototype.filter()`, `TypedArray.prototype.filter()` (en-US)) который удалит все элементы списка. Таким образом, не оставляя ни одного для использования в качестве начального значения.

```js
var ints = [0, -1, -2, -3, -4, -5];
ints
  .filter((x) => x > 0) // удаление всех элементов
  .reduce((x, y) => x + y); // no more elements to use for the initial value.
```

Аналогично, та же проблема может возникнуть, если в селекторе есть опечатка или непредвиденное количество элементов в списке:

```js
var names = document.getElementsByClassName("names");
var name_list = Array.prototype.reduce.call(
  names,
  (acc, name) => acc + ", " + name,
);
```

### Правильные примеры

Эти проблемы могут быть решены двумя различными способами.

Один из способов - фактически предоставить initialValue в качестве нейтрального элемента оператора, например 0 для сложения, 1 для умножения или пустую строку для объединения

```js
var ints = [0, -1, -2, -3, -4, -5];
ints
  .filter((x) => x < 0) // removes all elements
  .reduce((x, y) => x + y, 0); // the initial value is the neutral element of the addition
```

Другим способом было бы два для обработки пустого случая, или перед вызовом reduce, или в обратном вызове после добавления неожиданного фиктивного начального значения.

```js
var names = document.getElementsByClassName("names");

var name_list1 = "";
if (names1.length >= 1)
  name_list1 = Array.prototype.reduce.call(
    names,
    (acc, name) => acc + ", " + name,
  );
// name\_list1 == "" when names is empty.

var name_list2 = Array.prototype.reduce.call(
  names,
  (acc, name) => {
    if (acc == "")
      // initial value
      return name;
    return acc + ", " + name;
  },
  "",
);
// name\_list2 == "" when names is empty.
```

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

* `Array.prototype.reduce()`
* `Array.prototype.reduceRight()`
* `TypedArray.prototype.reduce()` (en-US)
* `TypedArray.prototype.reduceRight()` (en-US)
* `Array`
* `TypedArray`
* `Array.prototype.filter()`
* `TypedArray.prototype.filter()` (en-US)


Warning: -file- is being assigned a //# sourceMappingURL, but already has one - JavaScript

Warning: -file- is being assigned a //# sourceMappingURL, but already has one
=============================================================================

Предупреждение "-file- is being assigned a //# sourceMappingURL, but already has one." возникает, когда для JavaScript-файла исходная карта была указана несколько раз.

Сообщение
---------
```

Warning: -file- is being assigned a //# sourceMappingURL, but already has one.
```

Тип ошибки
----------

Предупреждение. Выполнение скрипта не будет остановлено.

Что не так?
-----------

Для данного источника JavaScript исходная карта была указана несколько раз.

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

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

Настройка исходной карты с помощью комментария в файле:

```js
//# sourceMappingURL=http://example.com/path/to/your/sourcemap.map
```

Или, в качестве альтернативы, вы можете установить заголовок на ваш JavaScript-файл:

```http
X-SourceMap: /path/to/file.js.map
```

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

* Использование исходных карт in the Firefox source docs
* Введение в исходные карты в JavaScript on developer.chrome.com (2012)


SyntaxError: JSON.parse: bad parsing - JavaScript

SyntaxError: JSON.parse: bad parsing
====================================

Сообщение
---------
```

SyntaxError: JSON.parse: unterminated string literal
SyntaxError: JSON.parse: bad control character in string literal
SyntaxError: JSON.parse: bad character in string literal
SyntaxError: JSON.parse: bad Unicode escape
SyntaxError: JSON.parse: bad escape character
SyntaxError: JSON.parse: unterminated string
SyntaxError: JSON.parse: no number after minus sign
SyntaxError: JSON.parse: unexpected non-digit
SyntaxError: JSON.parse: missing digits after decimal point
SyntaxError: JSON.parse: unterminated fractional number
SyntaxError: JSON.parse: missing digits after exponent indicator
SyntaxError: JSON.parse: missing digits after exponent sign
SyntaxError: JSON.parse: exponent part is missing a number
SyntaxError: JSON.parse: unexpected end of data
SyntaxError: JSON.parse: unexpected keyword
SyntaxError: JSON.parse: unexpected character
SyntaxError: JSON.parse: end of data while reading object contents
SyntaxError: JSON.parse: expected property name or '}'
SyntaxError: JSON.parse: end of data when ',' or ']' was expected
SyntaxError: JSON.parse: expected ',' or ']' after array element
SyntaxError: JSON.parse: end of data when property name was expected
SyntaxError: JSON.parse: expected double-quoted property name
SyntaxError: JSON.parse: end of data after property name when ':' was expected
SyntaxError: JSON.parse: expected ':' after property name in object
SyntaxError: JSON.parse: end of data after property value in object
SyntaxError: JSON.parse: expected ',' or '}' after property value in object
SyntaxError: JSON.parse: expected ',' or '}' after property-value pair in object literal
SyntaxError: JSON.parse: property names must be double-quoted strings
SyntaxError: JSON.parse: expected property name or '}'
SyntaxError: JSON.parse: unexpected character
SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data
```

Тип ошибки
----------

`SyntaxError`Что пошло не так?
-----------------

`JSON.parse()` обрабатывает (парсит) строку в формате JSON. Это строка должна соответствовать формату, иначе будет выведена ошибка, что был нарушен синтаксис.

Examples
--------

### `JSON.parse()` не допускает запятые

Метод JSON.parse() не разрешает использование, так называемых, trailling запятых.

Обе строки выдадут ошибку типа SyntaxError:

```js
JSON.parse("[1, 2, 3, 4,]");
JSON.parse('{"foo": 1,}');
// SyntaxError JSON.parse: unexpected character
// at line 1 column 14 of the JSON data
```

Необходимо убрать последние запятые в строках и тогда ошибки не будет:

```js
JSON.parse("[1, 2, 3, 4]");
JSON.parse('{"foo": 1}');
```

### Названия свойств должны быть в двойных кавычках

Вы не можете использовать одинарные кавычки в именах свойств. Например, 'foo'.

```js
JSON.parse("{'foo': 1}");
// SyntaxError: JSON.parse: expected property name or '}'
// at line 1 column 2 of the JSON data
```

Вместо этого необходимо написать "foo":

```js
JSON.parse('{"foo": 1}');
```

### Незначащие нули или плавающая точка без последующей цифры

Вы не можете использовать незначащие нули, например, 01. Плавающая точка должна всегда сопровождаться хотя бы одной цифрой после неё.

```js
JSON.parse('{"foo": 01}');
// SyntaxError: JSON.parse: expected ',' or '}' after property value
// in object at line 1 column 2 of the JSON data

JSON.parse('{"foo": 1.}');
// SyntaxError: JSON.parse: unterminated fractional number
// at line 1 column 2 of the JSON data
```

Вместо этого напишите просто 1 без нуля и используйте хотя бы одну цифру после точки:

```js
JSON.parse('{"foo": 1}');
JSON.parse('{"foo": 1.0}');
```

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

* `JSON`
* `JSON.parse()`
* `JSON.stringify()`


constructor - JavaScript

constructor
===========

Baseline Widely available
-------------------------

This feature is well established and works across many devices and browser versions. It’s been available across browsers since March 2017.

* Learn more
* See full compatibility
* Report feedback
`constructor` - это специальный метод, служащий для создания и инициализации объектов, созданных с использованием `class`.

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

constructor([arguments]) { ... }
```

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

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

class Person {

  constructor(name) {
    this.name = name;
  }

  introduce() {
    console.log(`Hello, my name is ${this.name}`);
  }

}

const otto = new Person('Отто');

otto.introduce();
```

Если вы не определили метод constructor, то будет использован конструктор по умолчанию. Если ваш класс базовый, то конструктор по умолчанию пустой:
```

constructor() {}
```

Если ваш класс является производным классом, конструктор по умолчанию вызывает родительский конструктор, передавая любые аргументы, которые были предоставлены:
```

constructor(...args) {
  super(...args);
}
```

Это позволяет работать следующему коду:
```

class ValidationError extends Error {

  printCustomerMessage() {
    return `Проверка не удалась :-( (подробности: ${this.message})`;
  }

}

try {
  throw new ValidationError("Неправильный номер телефона");
} catch (error) {
   if (error instanceof ValidationError) {
    console.log(error.name); // Это Error вместо ValidationError!
    console.log(error.printCustomerMessage());
  } else {
    console.log('Неизвестная ошибка', error);
    throw error;
  }
}
```

`ValidationError` классу не нужен явный (explicit) конструктор, потому что не требуется инициализация. Затем, конструктор по умолчанию позаботится об инициализации родительского класса `Error`, переданным ему аргументом.

Однако, если определён ваш собственный конструктор и класс является производным от какого-либо родительского класса, то вы должны явно объявить конструктор родительского класса, используя `super`. К примеру:
```

class ValidationError extends Error {

  constructor(message) {
    super(message);  // вызов конструктора родительского класса
    this.name = 'ValidationError';
    this.code = '42';
  }

  printCustomerMessage() {
     return `Проверка не удалась :-( (подробности: ${this.message}, code: ${this.code})`;
  }

}

try {
  throw new ValidationError("Неправильный номер телефона");
} catch (error) {
   if (error instanceof ValidationError) {
    console.log(error.name); // Теперь это ValidationError!
    console.log(error.printCustomerMessage());
  } else {
    console.log('Неизвестная ошибка', error);
    throw error;
  }
}
```

В классе может быть только один метод с именем "`constructor`". Если класс содержит более одного `constructor`, будет сгенерировано исключение `SyntaxError`.

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

### Использование метода `constructor`

Данный фрагмент кода взят из classes sample (live demo).

```js
class Square extends Polygon {
  constructor(length) {
    // Здесь вызывается конструктор родительского класса,
    // в который передаётся length в качестве аргументов,
    // соответствующим полям width и height класса Polygon
    super(length, length);
    // Примечание: В производном классе, super() должен вызываться перед тем, как
    // вы сможете использовать 'this'. Иначе будет сгенерировано исключение reference error.
    this.name = "Square";
  }

  get area() {
    return this.height \* this.width;
  }

  set area(value) {
    this.area = value;
  }
}
```

### Другой пример

Посмотрите на этот отрывок кода.

```js
class Polygon {
  constructor() {
    this.name = "Polygon";
  }
}

class Square extends Polygon {
  constructor() {
    super();
  }
}

class Rectangle {}

Object.setPrototypeOf(Square.prototype, Rectangle.prototype);

console.log(Object.getPrototypeOf(Square.prototype) === Polygon.prototype); //false
console.log(Object.getPrototypeOf(Square.prototype) === Rectangle.prototype); //true

let newInstance = new Square();
console.log(newInstance.name); //Polygon
```

Здесь прототип **Square** класса изменён, но в то же время constructor предыдущего базового класса **Polygon** вызывается при создании нового экземпляра **Square**.

### Constructors по умолчанию

Если вы не определите метод constructor, будет использован constructor по умолчанию. Для базовых классов, constructor по умолчанию:

```js
constructor() {}
```

Для производных классов, constructor по умолчанию:

```js
constructor(...args) {
  super(...args);
}
```

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-static-semantics-constructormethod |

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

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

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

* super()
* `class` expression
* `class` declaration
* Classes
* Object.prototype.constructor