2016-12-28 43 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; 
相关问题