2010-12-02 2 views
4

Отрывок 1:Разница между if (x) {foo(); } и x? foo(): 0;

if (x) { 
    foo(); 
} 

Отрывок 2:

x ? foo() : 0; 

Каковы различия между этими двумя отрывками?

Редактировать: Исправлена ​​ошибка синтаксиса.

Update: кстати, кажется, что есть еще короче обозначение:

x && foo(); 

ответ

1

Как правило, if является инструкцией (например, вы не можете назначить ее переменной), а тернарный оператор ?: является частью выражения (дает значение, которое может быть присвоено переменным).

Кроме того, блок if может содержать операторы, в то время как компоненты ?: могут содержать только выражения.

В примере, который вы даете, нет никакой разницы, так как вы не используете результат ?:. Оба фрагмента оценивают foo() только в том случае, если x является истинным значением.

8

Отрывок # 2 является недопустимым выражением ECMAScript, так как ему не хватает необходимый : blah для того, чтобы сделать это тройным.

EDIT: Существует на самом деле не разница между этими двумя фрагментами, они оба вызова foo если x является truthy. Если x является ложным (undefined/false/empty string/0 /), то первый фрагмент не будет оцениваться ничем, последний фрагмент будет оцениваться до 0, но 0 действительно не влияет на скрипт.

+0

Кроме того, синтаксис блока не оценивает любое значение (это не выражение). Тернарный оператор действительно оценивает значение. – cdhowie 2010-12-02 22:31:54

+0

@meder Я обновил вопрос ... – 2010-12-02 22:32:48

3

Я думаю, что вы имели в виду, чтобы спросить не следующие

// Why should I use 
if (x) { 
    do(); 
} 

// instead of 
x && do(); 

или

// Why should I use 
if (x) { 
    do(); 
} else { 
    dont(); 
} 

//instead of 
x ? do() : dont() 

Как они написаны, нет никакой разницы в результатах. Мне не нравится использовать тернар или оператор & & в этих случаях из-за семантики использования троичного кода и & &. Терминал возвращает значение, которое вы не используете, равно как и выражение & &. Поэтому я предпочел бы использовать способ использования операторами.

Однако, я люблю использовать & & для нулевых проверок

var val = obj && obj.getValue(); 

Обратите внимание, что в данном случае мы используем возвращаемое значение выражения

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