2015-10-24 9 views
0

Я только заметил странное поведение. Я уверен, что не первый заметил это, но я хотел бы понять, что происходит.оператор ИЛИ разрешение на ложь?

Почему true || true ? 'foo' : 'bar' решает 'foo'

И что делает его отличным от true || (true ? 'foo' : 'bar'), устраняющее в true?

jsFiddle: http://jsfiddle.net/tgdx5u8s/

ответ

2

Основное различие заключается в том, что без скобок, || имеет приоритет над ?:. Более подробно:

Первый случай

true || true ? 'foo' : 'bar' 

из-||, имеющий приоритет над ?: эквивалентно:

(true || true) ? 'foo' : bar' 

Оператор || возвращает левый операнд, если он является truthy, который в этом случае (в противном случае он вернет правый операнд).

Так что это решает:

true ? 'foo' : 'bar' 

разрешающего к 'foo'.

Второй случай

true || (true ? 'foo' : 'bar') 

решает:

true || 'foo' 

Опять оператор || возвращает левый операнд, если это является truthy, который в данном случае. Таким образом, это разрешается до true.

2

... || ... binds tighter чем ... ? ... : ..., поэтому ваше заявление анализируется как:

(true || true) ? 'foo' : 'bar' 

true || true является true, так что вы получите 'foo'.

2

О первом одном

true || true ? 'foo' : 'bar' 

бы быть такой же, как:

(true || true) ? 'foo' : 'bar' 

Так по существу:

true ? 'foo' : 'bar' 

О второй

true || (true ? 'foo' : 'bar'); 

будут одинаковыми как:

true || 'foo'; 

Так true или что-то другое дело true (нет необходимости даже оценить 'foo' для этого один ...)

0

Это происходит из-за порядок работы. Обычно || обрабатывается до? ?, но когда вы добавляете фигурные скобки, выражение внутри фигурных скобок вычисляется до ||.

Итак, первый заканчивается? 'foo': 'bar', а второй заканчивается как true || «Foo»

можете найти заказ на: https://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx

0

Не то, чтобы я хотел пойти против большинства, но приоритет || не является причиной наблюдаемого поведения, а приоритета круглых скобок. Конструкция logical or expression '?' expression ':' conditional expression не намного больше, чем слегка ограниченная IF '(' expression ')' statement ELSE statement, когда-то, когда память была измерена в килобайтах, разница между полностью оптимизирующим запуском компилятора и одним без него измерялась в часах, а мониторы имели 50 строк с 80 символами, если вам повезло - реализовано, чтобы сделать вещи проще и меньше для компьютера и компилятора. Не пользователь.

Так что, если вы не используете ?:; вы не нужны никакие if, не круглые скобки выражения после if, и не фигурные скобки, если у вас есть более чем одну строку после if. Отсутствие необходимости в круглых скобках, по моему скромному опыту, является причиной большинства, ну, давайте называть их раздражениями.

Чтобы перевести проблему в нечто более читаемым:

var a; 
if(true || true){ 
    a = 'foo'; 
} else { 
    a = 'bar'; 
} 

Второй кидает ошибку из-за его неправильного синтаксиса вместо того, чтобы позволить вам почесать голову:

var a; 
if(true || if(true){a='foo';}else{a='bar';})/*noop*/; 

Преимущество Конструкция ?:; - это ее способность заполнить правую часть декларации. Первый пример может быть легко уменьшена до:

a = true || true ? 'foo' : 'bar'; 

Я нахожу его более читаемым, если вы добавите скобки, несмотря на то излишними:

a = (true || true) ? 'foo' : 'bar'; 

Но это, вероятно, больше вопрос личного вкуса.