Подтвердить что ты не робот

Javascript: || вместо утверждения IF - этот законный и перекрестный браузер действителен?

Кажется, что

if (typeof a == 'undefined') {
    a = 0;
}

и

(typeof a != 'undefined') || (a = 0)

имеет тот же эффект в Javascript.

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

4b9b3361

Ответ 1

IMHO || (a = 0) слишком похож на || (a == 0) и, таким образом, запутывает. Один день переусердствующий разработчик просто "исправит", изменив смысл вашего кода. И каждый другой разработчик должен будет сидеть некоторое время, чтобы выяснить, было ли это ваше намерение или просто простая ошибка.

И это на самом деле то, что JSLint пытается сказать:

Ожидаемое условное выражение и вместо этого увидело назначение.

Я избегаю использования запутывающих конструкций, поскольку они ухудшают читаемость. a = a || 0; является более узнаваемым и похожим по смыслу.

Ответ 2

Почему бы не сделать что-то более простое, например:

a = a || 0;

или

a = a ? a : 0;

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

Если вам нужно включить весь тип проверки, он все еще не такой большой.

a = (typeof a !== "undefined") ? a : 0;  // [parentheses are there for clarity]

Ответ 3

Этот законный и перекрестный браузер действителен?

Да, он будет работать во всех механизмах EcmaScript. Однако очень редко (ab) использовать оценку короткого замыкания как оператор if.

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

Нет, JsLint прав. Это необычно и запутанно, по крайней мере, для других разработчиков. Он слишком похож на OR-условие, но у него нет "тела". И если вы выполняете назначения, ожидается, что переменная будет находиться в начале инструкции, а не внутри некоторого выражения.

Мне очень нравится второй, потому что он короткий, один строковый код

Затем используйте

if (typeof a == 'undefined') a = 0;

Ответ 4

Вы можете использовать:

a = typeof(a) !== "undefined" ? a : 0; 

Ответ 5

Стилистически, установка значений по умолчанию, таких как a || a=default, является общей идиомой при входе в функцию, потому что javascript не применяет количество аргументов.

Чтение будет скомпрометировано, если эта конструкция используется в других обстоятельствах, где вы действительно имеете в виду if/else.

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

Ответ 6

Могу ли я спросить, почему вы предпочитаете одну строку кода?

Как человек, я предпочитаю читаемый код. Моя машина предпочитает короткий и быстрый код (легко загрузить и выполнить).

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

typeof a=="undefined"&&(a=0)

Вы можете попробовать:

http://marijnhaverbeke.nl/uglifyjs

[Обновить] Мои личные предпочтения (опять же с учетом удобочитаемости) - это использовать, если есть варианты, а || для резервов. Ваш конкретный пример кажется резервным (если a не существует или является undefined, а затем присваивает значение 0), поэтому я бы использовал ||. Как я сказал в комментарии, (var a = 0) будет иметь больше смысла для меня в тех случаях, когда переменная a еще не объявлена ​​(я не знаю вашего контекста).

Ответ 7

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

a = 0 if (typeof a == 'undefined');

В вашем случае, когда у вас есть одна переменная в состоянии и присваивании, используйте однострочный трёхмерный оператор javascript:

a = (typeof a == 'undefined') ? 0 : a;

Ответ 8

(typeof a != 'undefined') || (a = 0)

- выражение. Но одно из его подвыражений

(a = 0)

- задание. По существу, это выражение с побочным эффектом. Заявления (особенно те из них, которые являются изъятиями), которые имеют побочные эффекты, как правило, являются одной из первых вещей, которые вы изучаете не во вводном классе кодирования. Так почему же это просто потому, что он занимает только одну строку?

Ответ 9

Я ненавидел "|| вместо IF" годами.

Я, наконец, привык к этому, и теперь мне это нравится.

Мне также нравится использовать && таким же образом.

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

Полностью понять, откуда идут другие. Был там сам.

Ответ 10

Более того, я предполагаю, что это повлияет на производительность, потому что

(typeof a != 'undefined') || (a = 0)

состоит из двух тестов (даже если мы не заботимся о втором).

В то время как

if (typeof a == 'undefined') {
    a = 0;
}

содержит только один тест