2015-04-04 2 views
3

Свы быть раздражающимОбъединить строки с тройным оператором в JavaScript

следующим кода:

var arrays = [1,2,3]; 
alert('Array has ' + (arrays.length > 0) ? 'multiple':'single' + ' value'); 

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

Но этот код:

var arrays = [1,2,3]; 
alert('Array has ' + ((arrays.length > 0) ? 'multiple':'single') + ' value'); 

оповещение как Array has multiple value где строка сцепленный с троичным результатом.

Мой вопрос:

  1. Почему первый код не сцепляются со строкой.
  2. Есть ли синтаксическая ошибка в первом коде, если да, то почему она не выдает ошибку.

ответ

9

Ваш первый пример обрабатывается таким образом

alert(('Array has ' + (arrays.length > 0)) ? 'multiple':('single' + ' value')); 

учитывая operator precedence из + гораздо выше, чем у ?:.

+1

awesome !!!!!!!! – Jai

+0

Действительно такой замечательный ответ. – Raja

3

Оба фрагмента синтаксически правильны, но они различаются в зависимости от приоритета оператора. Тройной оператор имеет более низкий приоритет, чем +.

В первом фрагменте:

var arrays = [1,2,3]; 
alert('Array has ' + (arrays.length > 0) ? 'multiple':'single' + ' value'); 

Javascript оценивает первую часть 'Array has ' + (arrays.length > 0), которая дает строку 'Array has true'. Для условных целей непустая строка такая же, как true (обычно называемая значением правдой). Поскольку первый операнд в тернарном операторе является правдивым, значением всего выражения будет значение выражения 'multiple', то есть между ? и :.

Когда вы добавляете параметры во второй фрагмент, вы делаете тернарный оператор принимать только (arrays.length > 0) в качестве своего условия. Вот почему код работает так, как ожидалось.

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