Spec-Zone.ru › ESLint

semi

Требовать или запрещать точки с запятой вместо ASI

🔧 Исправимо

Некоторые проблемы, обнаруженные этой настройкой, автоматически исправляются с помощью параметра --fix командной строки

Эта настройка была устарела в ESLint v8.53.0. Используйте соответствующую настройку правило в @stylistic/eslint-plugin-js.

JavaScript не требует точек с запятой в конце каждой инструкции. В большинстве случаев движок JavaScript может определить, что точка с запятой должна быть в определённом месте, и автоматически добавит её. Эта функция называется автоматической вставкой точки с запятой (ASI) и считается одной из наиболее спорных функций JavaScript. Например, следующие строки являются допустимыми:

var name = "ESLint"
var website = "eslint.org";

В первой строке движок JavaScript автоматически вставит точку с запятой, поэтому это не считается синтаксической ошибкой. Движок JavaScript всё ещё знает, как интерпретировать строку и понимает, что конец строки указывает на конец инструкции.

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

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

return
{
    name: "ESLint"
};

Это может показаться return инструкцией, возвращающей объект-литерал, однако движок JavaScript интерпретирует этот код как:

return;
{
    name: "ESLint";
}

В результате точка с запятой вставляется после return инструкции, в результате чего код ниже (меченый литерал внутри блока) становится недоступным. Это правило и правило no-unreachable защитят ваш код от таких случаев.

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

var globalCounter = { }

(function () {
    var n = 0
    globalCounter.increment = function () {
        return ++n
    }
})()

В этом примере точка с запятой не будет вставлена после первой строки, что приведёт к ошибке во время выполнения (потому что пустой объект вызывается так, как будто это функция). Правило no-unexpected-multiline может защитить ваш код от таких случаев.

Хотя ASI предоставляет больше свободы в стиле кодирования, она также может заставить ваш код вести себя неожиданным образом, используете вы точки с запятой или нет. Поэтому лучше знать, когда происходит ASI, а когда нет, и использовать ESLint для защиты вашего кода от потенциально неожиданных случаев. Короче говоря, как однажды описал Исаак Шлютер, \n символ всегда завершает инструкцию (как и точка с запятой), если не выполняется одно из следующих условий:

  1. Инструкция имеет не закрытую скобку, массивный литерал или объект-литерал или заканчивается иным образом, который не является допустимым способом завершения инструкции. (Например, завершение . или ,.)
  2. Строка -- или ++ (в этом случае она будет уменьшать/увеличивать следующий токен).
  3. Это for(), while(), do, if(), или else, и нет {
  4. Следующая строка начинается с [, (, +, *, /, -, ,, ., или каким-либо другим бинарным оператором, который может быть только между двумя токенами в одном выражении.

Подробное описание правила

Это правило обеспечивает соблюдение согласованного использования точек с запятой.

Параметры

Это правило имеет два параметра: строковый и объектный.

Строковый параметр:

  • "always" (по умолчанию) требует точек с запятой в конце инструкций
  • "never" запрещает точки с запятой в конце инструкций (за исключением случаев, когда они используются для разграничения инструкций, начинающихся с [, (, /, +, или -)

Объектный параметр (когда "always"):

  • "omitLastInOneLineBlock": true запрещает последнюю точку с запятой в блоке, в котором фигурные скобки (и, следовательно, содержимое блока) находятся в одной строке
  • "omitLastInOneLineClassBody": true запрещает последнюю точку с запятой в теле класса, в котором фигурные скобки (и, следовательно, содержимое тела класса) находятся в одной строке

Объектный параметр (когда "never"):

  • "beforeStatementContinuationChars": "any" (по умолчанию) игнорирует точки с запятой (или отсутствие точки с запятой) в конце инструкций, если следующая строка начинается с [, (, /, +, или -.
  • "beforeStatementContinuationChars": "always" требует точек с запятой в конце инструкций, если следующая строка начинается с [, (, /, +, или -.
  • "beforeStatementContinuationChars": "never" запрещает точки с запятой в конце инструкций, если это не создаёт опасности ASI, даже если следующая строка начинается с [, (, /, +, или -.

Примечание: beforeStatementContinuationChars не применяется к полям класса, потому что поля класса не являются инструкциями.

always

Примеры неправильного кода для этого правила с параметром по умолчанию "always":

Открыть в Playground
/*eslint semi: ["error", "always"]*/

var name = "ESLint"
object.method = function() {
    // ...
}
class Foo {
    bar = 1}

Примеры правильного кода для этого правила с параметром по умолчанию "always":

Открыть в Playground
/*eslint semi: "error"*/

var name = "ESLint";

object.method = function() {
    // ...
};

class Foo {
    bar = 1;
}

omitLastInOneLineBlock

Примеры дополнительных правильных примеров кода для этого правила с параметрами "always", { "omitLastInOneLineBlock": true }:

Открыть в Playground
/*eslint semi: ["error", "always", { "omitLastInOneLineBlock": true}] */

if (foo) { bar() }

if (foo) { bar(); baz() }

function f() { bar(); baz() }

class C {
    foo() { bar(); baz() }

    static { bar(); baz() }
}

omitLastInOneLineClassBody

Примеры дополнительных правильных примеров кода для этого правила с параметрами "always", { "omitLastInOneLineClassBody": true }:

Открыть в Playground
/*eslint semi: ["error", "always", { "omitLastInOneLineClassBody": true}] */

export class SomeClass{
    logType(){
        console.log(this.type);
        console.log(this.anotherType);
    }
}

export class Variant1 extends SomeClass{type=1}
export class Variant2 extends SomeClass{type=2; anotherType=3}

never

Примеры неправильного кода для этого правила с параметром "never":

Открыть в Playground
/*eslint semi: ["error", "never"]*/

var name = "ESLint";

object.method = function() {
    // ...
};

class Foo {
    bar = 1;
}

Примеры правильного кода для этого правила с параметром "never":

Открыть в Playground
/*eslint semi: ["error", "never"]*/

var name = "ESLint"

object.method = function() {
    // ...
}

var name = "ESLint"

;(function() {
    // ...
})()

import a from "a"
(function() {
    // ...
})()

import b from "b"
;(function() {
    // ...
})()

class Foo {
    bar = 1
}

beforeStatementContinuationChars

Примеры дополнительных неправильных примеров кода для этого правила с параметрами "never", { "beforeStatementContinuationChars": "always" }:

Открыть в Playground
/*eslint semi: ["error", "never", { "beforeStatementContinuationChars": "always"}] */
import a from "a"
(function() {
    // ...
})()

Примеры дополнительных неправильных примеров кода для этого правила с параметрами "never", { "beforeStatementContinuationChars": "never" }:

Открыть в Playground
/*eslint semi: ["error", "never", { "beforeStatementContinuationChars": "never"}] */
import a from "a"

;(function() {
    // ...
})()

Когда не следует использовать

Если вы не хотите каким-либо образом навязывать использование (или отсутствие) точек с запятой, вы можете отключить это правило.

Связанные правила

  • нет лишних точек с запятой
  • нет неожиданных многострочных
  • отступ после точки с запятой

Версия

Эта правила была добавлена в ESLint v0.0.6.

Дополнительные материалы

Открытое письмо лидерам JavaScript по поводу точек с запятой
Вставка точек с запятой в JavaScript

Ссылки

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/semi

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API