2016-12-28 78 views
16

下面的代碼在瀏覽器中:爲什麼不能操作「||」在此JavaScript代碼中替換三元運算符「?:」?

var event = event || window.event; 
var eTarget = event.target || event.srcElement; 
var eTargetId = eTarget.id; 

當我將其更改爲

var eTargetId = event.target ? event.target.id : event.srcElement.id; 

它的作品了。

當我修改代碼,

var eTargetId = event.target.id || event.srcElement.id; 

它不能在IE工作678我得到以下錯誤:

SCRIPT5007:Object expected.

這究竟是爲什麼?

+4

第三個例子是前兩個示例不同。 – guest271314

+1

您需要了解ES中不存在的存在訪問者操作符。 – Knu

+0

存在訪問者操作符也稱爲「安全導航操作符」。它的意思是「如果基礎對象引用爲null,則返回null,否則返回基礎對象的這個特定屬性。」 –

回答

14

不要試圖讀取屬性,如果你還沒有檢查的基礎值是一個真正的對象,而不是空。

通常一個會做

var eTargetId = event.target && event.target.id || event.srcElement.id; 

或者,如果有可能的事件目標沒有一個ID,

var eTargetId = event.target && event.target.id 
       || event.srcElement && event.srcElement.id 
       || ""; 
+1

你的例子是正確的,但你的第一行很混亂 - 不是導致問題的「id」屬性爲空。您可以讀取一個沒有錯誤的null屬性。問題是當你試圖把對象看作是一個對象時,它是空的。因此,更準確地說,「如果你沒有檢查對象存在,不要嘗試讀取屬性。」 – Niall

+0

@Niall謝謝,我的意思是基準值,而不是屬性值,是的。 – Oriol

+1

@MarcinJuraszek最後的代碼處理'event.target'的情況,'event.target.id'是空字符串。不是'srcElement',這不是問題。 – Oriol

13

這很可能發生,因爲event.target爲空,但event不是。如果event.target爲空,則您的前兩次嘗試使用短路來防止進一步評估。

3

評估eventevent.targetevent.srElement第一

var eTargetId = ((event = event || window.event) 
       && (eTargetId = event.target || event.srcElement) 
       && eTargetId["id"]) || void 0; 
相關問題