2012-03-15 1 views
4

Я работаю с этим плагином JS, и я столкнулся с некоторым синтаксисом, который я никогда раньше не видел. Я понимаю, что он делает, но я не уверен, почему он работает.Что это за синтаксис JS? Назначение в выражении? (x! = null && (y = x))

Вот пример одного экземпляра этого:

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

это просто пользуясь условными и одиночными =? Является ли этот общий синтаксис для JS?

+0

эй, кажется, плохой код - (! =) Означает не равный и проверка, если объект не равен нулю, а второе условие (=) означает назначение - интересно, почему он используется в условном выражении в этом экземпляре. Ура! –

+0

@Tats_innit: Где условное утверждение? Этот код совершенно верен; это просто глупо. –

+0

@LightnessRacesinOrbit Hiya Счастый человек, которого я предположил ** условный **, потому что он использует не нулевую проверку, спасибо и srry, если я ошибаюсь - Ах круто, поэтому не только я на самом деле это плохое утверждение! Cheers –

ответ

13

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

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

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

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

Днем кодирования.

3

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

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

3

Оператор && известен как «boolean 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.

+0

Вы никогда не поймете, как удивительно ... – m93a

Смежные вопросы