Почему "Неожиданно". "При использовании || оператор для значения по умолчанию в скобках

Получение неожиданного "." от jslint (http://jslint.com/) по этому коду:

function test(foo) {
    "use strict";
    return (foo || "").replace("bar", "baz");
}

Почему jslint имеет проблему с || оператор, чтобы заставить пустую строку, чтобы замена могла быть выполнена без возникновения ошибки, в случае, если foo передается как undefined?

Это проходит:

function test(foo) {
    "use strict";
    var xFoo = (foo || "");
    return xFoo.replace("bar", "baz");
}

Я знаю, что это основано на мнениях, и я могу игнорировать его и т.д., но пытаюсь понять, почему такая привязка нахмурилась. Также знаю об eshint, но я не пытаюсь обойти это сообщение, просто хочу понять, почему.

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

Обе функции выполняют точно то же самое при любых условиях.

Ответ 2

Это может быть потому, что он считает, что (foo || "") будет оценивать логическое выражение, поэтому что-то вроде false.replace() не имеет смысла. Хотя, да, в вашем случае вы получаете вместо этого переменную или пустую строку.

Ответ 3

Вы можете просто сделать две строки.

function test(foo) {
    "use strict";
    foo = foo || "";
    return foo.replace("bar", "baz");
}

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

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

function test(foo) {
    "use strict";
    if (foo === undefined) {
      foo = "";
    }
    return foo.replace("bar", "baz");
}

Да, это менее красноречиво, но это оставит меньше места для намерения, чтобы код был неверно истолкован тем, кто его читает позже. Явная проверка типа также позволяет вам решать другие потенциальные проблемы.

function test(foo) {
    "use strict";
    if (foo === undefined) {
      foo = "";
    } else if (typeof foo !== 'string') {
      throw('foo must be a string');
    }
    return foo.replace("bar", "baz");
}

Если вы используете ES2015, вы также можете использовать параметр по умолчанию:

function test(foo = "") {
    "use strict";
    if (typeof foo !== 'string') {
      throw('foo must be a string');
    }
    return foo.replace("bar", "baz");
}

Для почти любого проекта я бы предложил добавить Babel в ваш процесс сборки, чтобы вы могли использовать параметры по умолчанию, а многие другие полезные функции ES2015 добавляет к языку. Использование Babel позволяет вам использовать их сейчас, не дожидаясь, пока все браузеры их реализуют.