这是什么意思:qq = qq || {}?

时间:2011-06-17 18:42:28

标签: javascript

我已经下载了一个javascript脚本,其中一行是:

 qq = qq || {};

这是什么意思?

5 个答案:

答案 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!';
}

小提琴:http://jsfiddle.net/maniator/dr5Ra/

答案 3 :(得分:3)

到目前为止,这里的答案错过了一个重要的观点。 OP表示脚本

开始
qq = qq || {};

如果是,如果qq未在任何地方声明(全局范围内没有var qq,没有window.qq = ...),那么该代码将抛出ReferenceError。它不会只是默认qq

相反,如果代码是:

var qq = qq || {};

确实非常不同。它会这样做:

  1. var qq部分将在脚本中的任何分步代码之前处理。如果已经存在全局qq变量,则它将是无操作。如果没有,则会创建一个全局qq变量,其初始值为undefined

  2. 当逐步执行到达该行时,分配的右侧将按如下方式进行评估:

    • 如果qq的值为“falsey”(0""undefinedfalseNaN,或者null),表达式qq || {}评估为{}

    • 如果qq具有“真实”值(任何不是假的),则表达式会对qq进行评估。

    (有关详情:JavaScript's Curiously-Powerful || Operator。)

  3. 右侧的结果已分配到qq

  4. var产生差异。

答案 4 :(得分:1)

如果qq不存在,qq会收到qq或者是新对象({})。