【问题标题】:What does it mean : qq = qq || {}? [duplicate]什么意思:qq = qq || {}? [复制]
【发布时间】:2011-09-17 10:22:03
【问题描述】:

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

 qq = qq || {};

什么意思?

【问题讨论】:

  • 如果对象未初始化则初始化对象
  • @Igor 那里只有一个对象,{} -- qq 只是一个变量(或者,如果这是在全局上下文中,一个 属性)
  • @Felix Kling:然后点击“关闭”并将其标记为重复。
  • @JoshDavis:我希望他做到了,Felix 已经习惯了 SO 的工作方式。当您这样做时,系统会自动添加该评论。
  • @Josh:是的,这些 cmets 是自动生成的。并且关闭投票会在一段时间后到期,我在一年前投票关闭了这个问题。

标签: javascript


【解决方案1】:

它会检查 qq 中是否存在预先存在的 truthy value,否则 (||) 会将其设置为空对象 ({})。

本质上,它的目的是快速确保对 qq 的任何进一步引用都不会未定义,因此您可以检查对象的属性而不会因为变量甚至不是有效对象而中断脚本首先。

【讨论】:

  • 它检查它是否是“假的”,而不是简单地检查它是否被定义。这通常有效,因为undefined 是一个虚假值。但是如果它被定义并且它是一个虚假值,那么它将覆盖现有值。 var qq = false; qq = qq || {}; q // {}
  • 是的,这是真的。稍微澄清一下。
  • 注意:0和空字符串都被认为是“假的”。
  • 这不会检查“变量是否存在”。如果变量(或全局属性)未绑定,这将导致异常。这个答案中根本不应该出现“存在”这个词。考虑从“检查变量值...”或类似内容开始。
  • 好吧,有点技术性的观点,我只是想用通俗易懂的语言来表达行为和目的,但我已经改变了一些措辞以更清楚,并使用了“真实”这个词为了准确。
【解决方案2】:

在 JavaScript 中,||(逻辑或)运算符具有以下逻辑表:

一个 |乙|一个 ||乙 诚实 |不在乎 | A(保证真实) 假|不在乎 | B(可能是真或假)

(有关这些术语的含义,请参阅 Truthy and Falsy in JavaScript。)

因此,在qq = qq || {}的情况下:

如果 qq 最初计算为 Falsy 值,则 qq || {} 的结果为 {},因此({},一个 Truthy 值)分配给 qq。否则,qq 最初是一个 Truthy 值,qq || {} 的结果(这是评估qq 的结果)分配给qq

这是一个惯用的警卫,用于轻松防止“未定义”参数、属性和类似内容。

有些人可能更喜欢使用以下近似等效的构造:

if (!qq) {
  qq = {}
}

但是,如果qq 最初是 Falsy,则后一种情况只会分配给 qqqq = qq || {} 的形式总是进行分配,但这种“开销”太陈旧了,不应该作为不使用该方法的理由。

编码愉快。

【讨论】:

    【解决方案3】:

    解释:

        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/

    【讨论】:

    • 调用 = 'equal' 有点误导:'assign' 在这里是更好的术语。
    【解决方案4】:

    到目前为止,这里的答案漏掉了一个重要的点。 OP 说脚本 开始

    qq = qq || {};
    

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

    相反,如果代码是:

    var qq = qq || {};
    

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

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

    2. 当逐步执行到达该行时,赋值右侧的评估如下:

      • 如果 qq 具有“假”值(0""undefinedfalseNaNnull),则表达式 qq || {} 评估为{}

      • 如果qq 具有“真实”值(任何非虚假),则表达式计算为qq

      (更多详情:JavaScript's Curiously-Powerful || Operator.)

    3. 右边的结果赋值给qq

    var 带来了很大的不同。

    【讨论】:

      【解决方案5】:

      qq 将接收 qq 或者如果它不存在将成为一个新对象 ({})。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        • 2018-10-10
        • 1970-01-01
        相关资源
        最近更新 更多