Что это за синтаксис JS?Назначение в выражении?(x! = null && (y = x)) - PullRequest
4 голосов
/ 15 марта 2012

Я работаю с этим плагином JS, и я столкнулся с синтаксисом, которого я никогда раньше не видел.Я понимаю, что он делает, но я не уверен, почему это работает.

Вот пример одного из примеров:

settings.maxId != null && (params.max_id = settings.maxId);

Это просто использование условий и единственногознак равноЭто общий синтаксис для JS?

Ответы [ 3 ]

14 голосов
/ 15 марта 2012

В JavaScript оператор = является выражением и оценивает присвоенное значение. Поскольку это выражение , его можно использовать везде, где разрешено выражение , даже если оно вызывает побочный эффект . Таким образом:

settings.maxId != null && (params.max_id = settings.maxId)

Означает: если settings.maxId не равно нулю, то ( и только тогда , поскольку && означает короткое замыкание ), вычислить правильное выражение (params.max_id = settings.maxId), которое в В результате поворота значение settings.maxId будет присвоено params.max_id. Это гораздо яснее записано как:

if (settings.maxId != null) {
  params.max_id = settings.maxId
}

Счастливого кодирования.

3 голосов
/ 15 марта 2012

Оператор && известен как "логическое AND".Как правило, вы увидите это в выражении if:

if (x == true && y == false) {

, но это не ограничение.Вы можете использовать его в любом допустимом выражении, чтобы «объединить» логические значения его операндов в один логический результат, в соответствии с логической операцией «И»:

var z = (x == true && y == false);
// z is now true or false, accordingly

Одна из замечательных вещей о && это то, что это "короткие замыкания".В false && true, поскольку первый операнд false, все выражение может оцениваться только до false, поэтому второй операнд даже не оценивается.

Давайте проверим это снова:

var z = (false && foo());
// z is now false

В этом утверждении функция foo даже никогда не вызывается!Не нужно, чтобы программа знала, что z будет false.

Это больше, чем оптимизация - вы можете положиться на нее.

Некоторые глупые людииспользуйте эту технику, чтобы переписать условные операторы:

if (x == 0) {
   foo();
}

в трудно читаемые одиночные выражения:

(x == 0) && foo();

Теперь рассмотрим, что присваивание может быть выражением, аналогичным вызову функции:

var a = (b = c);

Или:

var a = (b = foo());

И добавьте условное выражение с помощью описанной выше техники:

var a = ((x == 0) && (b = foo()));

Теперь все выражение b = foo() не будетоценивается вообще, если x не равно 0, из-за короткого замыкания.

Нам даже не нужно ничего делать с результатом операции &&, и если мы не хранимдля a осталось только:

(x == 0) && (b = foo());

, что является оператором, который присваивает b значению foo(), только если x равно 0.

Избегайте этого.Трудно читать.Просто используйте оператор if.

3 голосов
/ 15 марта 2012

этот оператор присваивает params.max_id = settings.maxId только если settings.maxId != null из-за того, что && является логическим оператором короткого замыкания

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

...