2009-11-18 59 views
3

我最近遇到這個問題,並認爲它會產生一個很好的SO問題。JavaScript語法:字符串賦值語句中的內聯If

假設你正在給一個局部變量賦值一個字符串,並且你想通過一個簡單的條件來改變它。所以你插入的if語句內嵌到字符串:

var someCondition = true; 
var url = "beginning-" + (someCondition)?('middle'):('other_middle') + "-end"; 

但是,這並不如預期,URL的值將是「中等」,沒有開始,中端。此聲明產生預期結果:

var url = "beginning-" + ((someCondition)?('middle'):('other_middle')) + "-end"; 

最好的解釋,爲什麼這是贏得令人垂涎的答案標誌!

+1

這被稱爲**三元操作符**。以下鏈接提供了運營商優先權的詳細說明:http://blog.stchur.com/2006/07/14/the-javascript-ternary-operator/ – 2009-11-18 23:56:43

回答

9

這當然與優先權有關。

var url = "beginning-" + (someCondition)?('middle'):('other_middle') + "-end"; 

被解釋爲:

var url = ("beginning-" + (someCondition)) ? ('middle') : (('other_middle') + "-end";) 
4

這是因爲運營商的優先級。

第一個例子計算結果爲:

if ("beginning-" + someCondition) { 
    url = 'middle'; 
} else { 
    url = 'other_middle' + "-end"; 
} 

因爲?操作的優先級高於+

1

在你的第一個例子中,條件運算符的第三個操作數是這樣的:

('other_middle') + "-end" 

您需要包裝由條件運算符評估的表達式,並且您不需要所有這些括號:

var url = "beginning-" + (someCondition ? 'middle' :'other_middle') + "-end"; 

檢查運營商優先權的this table

0

在我看來,像運算符優先級的問題。

JavaScript是解釋語句,如:

IF ("beginning-" + (someCondition)) { 
    'middle'; 
} else { 
    'other middle' + "-end"; 
} 

( 「開始 - 」 +(someCondition))將被連接成一個字符串(例如, 「開始-1」),並因爲它不爲空,它將被評估爲布爾真,所以結果將始終爲'中間'

0

如果條件也是值。

短手var x = y || z;也不應該被遺忘。

在這種情況下,我想

var url = "beginning-" + (middle || 'middle_was_bad') + "-end"; 

可能是有用的一些人。