2013-07-15 43 views
6

任何人都可以解释这个说法是什么意思吗?有人可以解释e = e || X?为什么将e分配给e?

e = e || x 

具体来说,

e = e || window.event 

这似乎在一段代码,我在看。

我并没有完全丧失,但我的理解是,它将e和window.event(或x/whatever)都分配给e。这很自然,对吧?

但是,将e赋值给e有什么价值?不应该e = window.event够了吗?也许取决于它是如何使用的?

+0

是不是'||'布尔运算符?那么在这之后'e'应该是'true'还是'false'? –

+0

它是“使用e,如果它已经定义/可用,否则使用x”。这是javascript中的一个很好的语法糖,用伪代码“if(exists e)then return e else return x”。 –

+5

@Cobra_Fast'||'在javascript中不返回true/false,它返回“truthy”的第一个对象。 – Matthew

回答

18

e = e || x指定xe如果e评估为假。

这是一样的:

if (!e) { 
    e = x; 
} 
// or 
e = e ? e : x 

这里是显示其值evalute到表:https://stackoverflow.com/a/7615236/603003

最重要的价值是:不确定


这是什么意思在你的上下文中? 你可能有某种这段代码:

function handler(e) { 
    e = e || window.event; 
} 

哪里handler是连接到一个DOM元素的事件监听器。由于较旧版本的IE没有将事件对象作为参数传递,因此必须检查参数是否为undefined。如果后者是这种情况,则将全局window.event对象(其提供的IE)分配给e

+0

Yikes!我感到很傻,我应该记住这一点。这很简单。谢谢! – muiiu

6

它不会给到 “e”,只是一个最也不undefinednull0NaN"",或false。由于“e”位于||的左侧,因此它更喜欢“e”的原始值,因为“e”在||的左侧,但如果它是空的(我列出的那些值之一),那么“e”将被指定为window.event

这样做是因为Internet Explorer未将事件引用作为参数传递,而是简单地绑定到全局符号。事件处理程序是很经常写:

function someHandler(e) { 
    e = e || window.event; 
    // ... 
} 

它或许会被越来越严格的“正确”写:

function pedanticHandler(e) { 
    if (e === undefined) // or arguments.length == 0 perhaps 
    e = window.event; 
    // ... 
} 
+2

具体来说,如果e有一个值,它将保持其值。如果它没有定义,我们会在别处寻找一个值。 –

+0

@JonKiparsky是的,扩大:) – Pointy

+0

NaN也触发默认... – dandavis

2

是多余的分配e = e,他们这样做是因为这种说法,因为一部分这是一个成语。

该语句检查是否定义了e,如果不是,则使用||后面的表达式对其进行初始化。这是有效的,因为当||表达式被评估时,解释器在找到第一个true部分(从左边)时停止评估。

尤其是,如果e的计算结果为true,那么评估将立即停止,并且实际上您有e = e,这是多余的。但是,如果e未定义或评估为false,那么||的右侧部分将被评估并指定为e

我个人会使用if声明而不是聪明。或者更多地重构代码以完全避免if

编辑:我认为原来的代码是越野车。显然意图是检查e是否已经初始化。但是如果它已经被初始化并且评估为true,它可以被重新分配给自己。这可能会产生不必要的副作用。

+0

你误解了代码。 – SLaks

+0

真的吗?我呢? :) – akonsu

+0

是的,真的,你做 – Bojangles

4

您误会了操作员。

此行将表达式e || x分配给变量e

e || x的值是第一个真值。
如果e是真的,那将是e;如果e是虚假的,那将是x

2

如果eundefined(或null,或任何其他false值)时,它被初始化为x

它是隐式:

var e = e ? e : x; 
1

它集合E等于或者本身(如果它不为空,未定义或假),否则window.event。

这好像是说

if (!e) e = window.event; 
2

它没有这两个值赋给e。这只是分配xe的方式如果e原始值是nullundefined0falseNaN,或空字符串("")。如果e的原始值不符合上述任何条件,则保持原始值。当你添加一个事件处理程序的元素

document.addEventListener('click',handler,false); 

if(!e){ 
    e = window.event; 
} 
+0

或NaN,例如:parseInt('lol')|| 0 – Virus721

+0

@ Virus721谢谢!补充说,答案。 –

1

在您的例子e = e || window.event;等同于大多数浏览器会将事件作为第一个参数传递。

handler=function(e){// e is the event in some browsers 
e=e||window.event; // but in some old browsers the event is window.event 
    // so you check if e(event) exists else you use window.event. 
    // '||' means or... 
    // e is already defined as a placeholder in the handler function 
    // so you don't need to put var infront of it 
} 
1

基本上,它是一个简写形式:

if(!e) { 
    e = x; 
} 
2

上面的答案(ComFreek)是正确的。 原因它这样做是因为懒惰的评估。布尔x || y,懒懒评估将首先检查x。如果它的计算结果为TRUE(即非零,非空),则表达式停止并返回TRUE。如果x的计算结果为FALSE,则返回y

这是聪明的代码。聪明是愚蠢的。 (意见) 作为维护者,我更愿意看到

if (!e) { 
    e = x; 
} 
+0

同意。 C#有一个更好的符号,其中e = e? X;双重quesiton标记更清楚地表明您检查是否存在某个事物,而不是分配布尔值。 –

相关问题