Использование '&&' в качестве сокращенного выражения if?
В то время как я убиваю время отрываясь Javascript шаблоны сокращенные, я наткнулся на интересный способ выражения, if
выражение здесь. Следующие работы:
var var1 = 5;
var var2 = 1;
var1 == 5 && var2++;
Я думаю, что это абсолютно здоровый (и более короткий, более чистый) способ написания оператора if
который должен выполнять только одну операцию. Тем не менее, я столкнулся с проблемой со следующим кодом, как только я попробовал что-то еще с ним:
var var1 = 5;
var var2 = 1;
var1 == 5 && var2 = 2;
Вместо того, чтобы работать как первый фрагмент кода, мой тест выдает ошибку:
Uncaught ReferenceError: Недопустимая левая сторона в присваивании
Почему это не работает, и почему левая сторона моего заявления называется неправильной, а не правой?
Ответы
Ответ 1
Это не работает, потому что оператор &&
имеет более высокий приоритет, чем оператор =
. Другими словами, ваш код интерпретируется следующим образом:
(var1 == 5 && var2) = 2;
Если вы вручную разместите круглые скобки вокруг назначения, они будут интерпретироваться правильно.
var1 == 5 && (var2 = 2);
Другие люди будут выговаривать вас за то, что вы пишете такой код, заявив, что это плохая идея, потому что это затрудняет чтение кода - что верно, особенно для людей, незнакомых с этой идиомой, - но важно попробовать и экспериментируйте с такими вещами, чтобы убедиться, что происходит. Вы уже столкнулись с одной из неприятных вещей об этом подходе.
Во всяком случае, в подобных случаях я лично предпочитаю использовать однострочные операторы if
, подобные этому
if(condition) statement;
Хотя я уверен, что другие скажут вам, что этот плохой стиль, потому что вам нужно вручную добавить скобки, когда вам нужно больше заявлений, это на самом деле не бит, а IMO он чище, чем использование трех строк только для простого условия, как вы сказали,
Ответ 2
Не беспокойтесь, что это не работает, как вы ожидали, ведь менее месяца назад Брендан Эйх (создатель JavaScript) делился с нами тем, что этот тип использования более известен как "злоупотребление" языка, поскольку этот логический оператор не предназначен для выполнения кода, подобного этому, а скорее для определения значения выражения.
"Я также согласен с тем, что строка && - это злоупотребление, разрешенное благодаря наследию JSs C посредством Java, но нахмурилось большинством JS-хакеров и что оператор if будет намного лучше..." http://brendaneich.com/2012/04/the-infernal-semicolon/
При этом вы можете избежать проблемы с приоритетом оператора, завернув свои заявления:
(var1 == 5) && (var2 = 2)
Ответ 3
потому что вы используете недопустимый оператор в правой части. его попытка прочитать весь оператор как одну переменную.