7

谁能解释一下这句话的意思?

e = e || x

具体来说,

e = e || window.event

这出现在我正在查看的一大段代码中。

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

但是将 e 分配给 e 的值是什么?e = window.event 不应该足够吗?也许取决于它的使用方式?

4

10 回答 10

18

e = e || x分配xe如果e评估为假。

这与以下内容相同:

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

这是一个表格,显示了哪些值评估为falsehttps ://stackoverflow.com/a/7615236/603003

最重要的值是:nullundefined


在你的上下文中是什么意思?你可能有一些这样的代码:

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

handler附加到 DOM 元素的事件侦听器在哪里。由于旧版本的 IE 没有将事件对象作为参数传递,因此必须检查参数是否为undefined。如果是后者,则将全局window.event对象(IE 提供)分配给e.

于 2013-07-15T15:42:01.057 回答
6

它不会将两者都分配给“e”,而只会分配不是undefined, null, 0, NaN,""或的那个false。它更喜欢 "e" 的原始值,window.event因为 "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;
  // ...
}
于 2013-07-15T15:41:48.600 回答
4

你误解了运营商。

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

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

于 2013-07-15T15:41:58.863 回答
2

分配是多余的e = e,他们将其作为此语句的一部分,因为它是一个成语。

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

特别是,如果e评估到,true那么评估就会立即停止,并且实际上你有e = e,这是多余的。但是如果e未定义或计算结果为,false则计算结果的右侧部分||并将其分配给e

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

编辑:我认为原始代码有问题。显然目的是检查是否e已经初始化。但是在这里,如果它已经初始化并计算为 ,则可以将其重新分配给自身true。这可能会产生不必要的副作用。

于 2013-07-15T15:41:52.477 回答
2

如果eundefined(或null,或任何其他false值),则用 初始化x

它是隐含的:

var e = e ? e : x;
于 2013-07-15T15:42:19.853 回答
2

它不会将两个值都分配给e. 如果原始值是, , , , , 还是空字符串 ( ) ,这只是一种分配方式x。如果原始值不符合上述任何条件,则保留原始值。eenullundefined0falseNaN""e

基本上,它是以下的简写形式:

if(!e) {
   e = x;
}
于 2013-07-15T15:42:43.503 回答
2

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

这是聪明的代码。聪明是愚蠢的。(观点)作为维护者,我更喜欢看

if (!e) {
    e = x;
}
于 2013-07-15T15:59:20.177 回答
1

它设置 e 等于它本身(如果它不为 null、未定义或 false),否则为 window.event。

这就像说

if (!e) e = window.event;
于 2013-07-15T15:42:38.520 回答
1

在您的示例e = e || window.event;中相当于:

if(!e){
     e = window.event;
}
于 2013-07-15T15:45:14.787 回答
1

当您将事件处理程序添加到元素时

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

在大多数浏览器中,它将事件作为第一个参数传递。

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
}
于 2013-07-15T15:50:50.727 回答