我已经下载了一个 JavaScript 脚本和第一行之一是:
qq = qq || {};
这是什么意思?
它检查qq
是否有预先存在的truthy value,否则 (||
) 将其设置为空对象 ({}
)。
从本质上讲,它的目的是快速确保对 qq 的任何进一步引用都不会被定义,因此您可以检查对象的属性,而不会因为变量甚至不是有效的对象而导致脚本中断。
在 JavaScript 中,||
(逻辑或)运算符具有以下逻辑表:
A | B | A || B Truthy | Don't care | A (guaranteed to be Truthy) Falsy | Don't care | B (may be Truthy or Falsy)
(有关术语的含义,请参见Truthy and Falsy in JavaScript。)
因此,在qq = qq || {}
的情况下:
如果qq
最初计算为 Falsy 值,则qq || {}
的结果为{}
,因此({}
,Truthy 值)被分配给qq
。否则,01的结果最初是0
这是一个惯用后卫,用于轻松防止“未定义”的参数,属性等。
有些人可能更喜欢使用以下近似等效的构造:
if (!qq) {
qq = {}
}
然而,如果qq
最初是 Falsy,则后一种情况只会分配给qq
;形式qq = qq || {}
总是进行分配,但是这样的“开销”是如此陈腐,不应该用作不使用该方法的理由。
快乐编码
说明:
qq = qq || {};
// ^^ is equal to iself, but if it does not exist,
// then it is equal to an empty object
例如:
for(var i = 0; i < 5; i++){
qq = qq || {};
qq[i] = 'something!';
}
Fiddle:http://jsfiddle.net/maniator/dr5Ra/
到目前为止,这里的答案遗漏了一个重要的点。OP 说脚本以开头
qq = qq || {};
如果是这样,并且如果qq
没有在任何地方声明(全局范围内没有var qq
,没有window.qq = ...
),则该代码将引发ReferenceError
。它不仅会默认qq
。
相反,如果代码是:
var qq = qq || {};
这将是确实非常不同。它会这样做:
var qq
部分将在脚本中的任何分步代码之前处理。如果已经有一个全局qq
变量,它将是一个无操作。如果没有,它将创建一个具有初始值undefined
的全局qq
变量。
当逐步执行到达该行时,分配的右侧将按如下方式进行评估:
如果qq
的值为“falsey”(0
,""
,undefined
,false
,NaN
,或null
),则表达式qq || {}
将变为{}
。
如果qq
具有“truthy”值(任何不是 falsey 的值),则表达式的值为qq
。
(有关更多详细信息:JavaScript's Curiously-Powerful ||
Operator。)
右侧的结果分配给qq
。
var
使大差异。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(2条)