我已经下载了一个javascript脚本,其中一行是:
qq = qq || {};
这是什么意思?
答案 0 :(得分:23)
检查qq
是否存在预先存在的truthy value,否则(||
)将其设置为空对象({}
)。
本质上,它的目的是快速确保对qq的任何进一步引用都不会被定义,因此您可以检查对象的属性,而不会因为变量甚至不是有效对象而破坏脚本首先。
答案 1 :(得分:7)
在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值)被分配给{{1} }。否则,qq
最初是Truthy值,qq
的结果(评估qq || {}
的结果)被分配给qq
。
这是惯用守护,用于轻松防范“未定义”参数,属性等。
有些人可能更喜欢使用以下近等效构造:
qq
然而,后一种情况只会在if (!qq) {
qq = {}
}
最初是假的情况下分配给qq
; qq
形式总是进行赋值,但这种“开销”是如此陈腐,不应该用作不使用该方法的理由。
快乐的编码。
答案 2 :(得分:4)
说明:
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!';
}
答案 3 :(得分:3)
到目前为止,这里的答案错过了一个重要的观点。 OP表示脚本以
开始qq = qq || {};
如果是,如果qq
未在任何地方声明(全局范围内没有var qq
,没有window.qq = ...
),那么该代码将抛出ReferenceError
。它不会只是默认qq
。
相反,如果代码是:
var qq = qq || {};
确实非常不同。它会这样做:
var qq
部分将在脚本中的任何分步代码之前处理。如果已经存在全局qq
变量,则它将是无操作。如果没有,则会创建一个全局qq
变量,其初始值为undefined
。
当逐步执行到达该行时,分配的右侧将按如下方式进行评估:
如果qq
的值为“falsey”(0
,""
,undefined
,false
,NaN
,或者null
),表达式qq || {}
评估为{}
。
如果qq
具有“真实”值(任何不是假的),则表达式会对qq
进行评估。
右侧的结果已分配到qq
。
var
产生大差异。
答案 4 :(得分:1)
如果qq不存在,qq会收到qq或者是新对象({}
)。