Spec-Zone.ru › ESLint

semi

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

🔧 Можно исправить автоматически

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

Важно

Это правило было устаревшим в ESLint v8.53.0. Оно будет удалено в v11.0.0. Используйте соответствующее правило из @stylistic/eslint-plugin.

Подробнее

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() {
    // ...
})()

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

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

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

  • no-extra-semi
  • no-unexpected-multiline
  • semi-spacing

Версия

Это правило появилось в ESLint v0.0.6.

Дополнительная литература

Открытое письмо лидерам JavaScript о точках с запятой
blog.izs.me
Вставка точек с запятой в JavaScript
web.archive.org

Ресурсы

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

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

Spec-Zone.ru

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