Использование '&&' в качестве сокращенного выражения 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

потому что вы используете недопустимый оператор в правой части. его попытка прочитать весь оператор как одну переменную.