2015-04-04 33 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

真棒!!!!!!!! – Jai 2015-04-04 08:06:45

+0

真的很棒的答案。 – Raja 2015-04-04 08:15:21

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)爲條件。這就是代碼按預期工作的原因。