任何人都可以解释这个说法是什么意思吗?有人可以解释e = e || X?为什么将e分配给e?
e = e || x
具体来说,
e = e || window.event
这似乎在一段代码,我在看。
我并没有完全丧失,但我的理解是,它将e和window.event(或x/whatever)都分配给e。这很自然,对吧?
但是,将e赋值给e有什么价值?不应该e = window.event够了吗?也许取决于它是如何使用的?
任何人都可以解释这个说法是什么意思吗?有人可以解释e = e || X?为什么将e分配给e?
e = e || x
具体来说,
e = e || window.event
这似乎在一段代码,我在看。
我并没有完全丧失,但我的理解是,它将e和window.event(或x/whatever)都分配给e。这很自然,对吧?
但是,将e赋值给e有什么价值?不应该e = window.event够了吗?也许取决于它是如何使用的?
e = e || x
指定x
到e
如果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
。
Yikes!我感到很傻,我应该记住这一点。这很简单。谢谢! – muiiu
它不会给都到 “e”,只是一个最也不undefined
,null
,0
,NaN
,""
,或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;
// ...
}
是多余的分配e = e
,他们这样做是因为这种说法,因为一部分这是一个成语。
该语句检查是否定义了e
,如果不是,则使用||
后面的表达式对其进行初始化。这是有效的,因为当||
表达式被评估时,解释器在找到第一个true
部分(从左边)时停止评估。
尤其是,如果e
的计算结果为true
,那么评估将立即停止,并且实际上您有e = e
,这是多余的。但是,如果e
未定义或评估为false
,那么||
的右侧部分将被评估并指定为e
。
我个人会使用if
声明而不是聪明。或者更多地重构代码以完全避免if
。
编辑:我认为原来的代码是越野车。显然意图是检查e
是否已经初始化。但是如果它已经被初始化并且评估为true
,它可以被重新分配给自己。这可能会产生不必要的副作用。
您误会了操作员。
此行将表达式e || x
分配给变量e
。
e || x
的值是第一个真值。
如果e
是真的,那将是e
;如果e
是虚假的,那将是x
。
如果e
是undefined
(或null
,或任何其他false
值)时,它被初始化为x
。
它是隐式:
var e = e ? e : x;
它集合E等于或者本身(如果它不为空,未定义或假),否则window.event。
这好像是说
if (!e) e = window.event;
它没有这两个值赋给e
。这只是分配x
到e
的方式如果e
原始值是null
,undefined
,0
,false
,NaN
,或空字符串(""
)。如果e
的原始值不符合上述任何条件,则保持原始值。当你添加一个事件处理程序的元素
document.addEventListener('click',handler,false);
if(!e){
e = window.event;
}
或NaN,例如:parseInt('lol')|| 0 – Virus721
@ Virus721谢谢!补充说,答案。 –
在您的例子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
}
:
基本上,它是一个简写形式:
if(!e) {
e = x;
}
上面的答案(ComFreek)是正确的。 原因它这样做是因为懒惰的评估。布尔x || y
,懒懒评估将首先检查x
。如果它的计算结果为TRUE
(即非零,非空),则表达式停止并返回TRUE。如果x
的计算结果为FALSE
,则返回y
。
这是聪明的代码。聪明是愚蠢的。 (意见) 作为维护者,我更愿意看到
if (!e) {
e = x;
}
同意。 C#有一个更好的符号,其中e = e? X;双重quesiton标记更清楚地表明您检查是否存在某个事物,而不是分配布尔值。 –
是不是'||'布尔运算符?那么在这之后'e'应该是'true'还是'false'? –
它是“使用e,如果它已经定义/可用,否则使用x”。这是javascript中的一个很好的语法糖,用伪代码“if(exists e)then return e else return x”。 –
@Cobra_Fast'||'在javascript中不返回true/false,它返回“truthy”的第一个对象。 – Matthew