【问题标题】:Javascript statement with || {}; [duplicate]带有 || 的 Javascript 语句{}; [复制]
【发布时间】:2013-04-22 09:34:12
【问题描述】:

我正在学习 javascript,今天我发现了这段代码:

window.Picture2 = window.Picture2 || {};

我不明白 || {} ; 有人可以为我解释一下吗?太感谢了:)

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这是为全局变量Picture2 分配默认值的危险方法。

    window.Picture2 = window.Picture2 || {};
    

    这会将window.Picture2 初始化为新对象{}(如果未定义)。 然而因为这是对真实性的检查,如果Picture2 有以下falsy values 中的任何一个,它也会被分配一个空对象:

    // these are all falsy
    0, NaN, null, '', undefined, false
    

    这可能不是所有这些情况的期望行为,尤其是对于 0NaNfalse'' 值。

    编辑
    ?? "NULLISH COALESCING" 运算符现在是 ECMAScript 标准的一部分,并且已经具有 pretty decent browser support

    所以你的用例的语法是:

    window.Picture2 ?? {};
    

    如果Picture2 等于undefinednull,这将评估为假,但对于其余的假值则不然。

    如果要为函数参数分配默认值,现在还可以编写以下代码:

    function myfunc(Picture2 = {}){
       /* function body */
    }
    

    默认参数语法和空值合并运算符都是唯一正确的方法来分配默认值而不会产生副作用。

    【讨论】:

    • +1 检查if (!window.Picture2) { window.picture2 = {} }不是更好吗?在这两种情况下都需要进行比较,但可以跳过重新分配。事件虽然这段代码稍长,但它应该更快,并且对于某些人来说更具可读性。
    • @insertusernamehere 保存选项是if(typeof window.Picture2 != undefined){...} - 非常冗长,但可以将其放入defined 函数或类似函数中。
    • 这正是我要写的,只是用尤达符号。 :) 我想指出,除了您在回答中已经说过的内容之外,三元运算符可能不是所有地方的最佳选择。
    • @insertusernamehere Yoda 表示法对旧浏览器没有帮助,因为 undefined 在 ES5 之前没有写保护。
    【解决方案2】:

    如果window.Picture2 未定义,它会为window.Picture2 分配一个默认的空对象(falsy)

    【讨论】:

    • 可悲的是不仅是undefined...
    • @Christoph 这就是为什么在() 我说falsy
    • 确实如此,但这是使用该技术时最需要注意的一点(见我的回答)!
    • 有一个建议 ecmascript 6 用默认操作符来填补这个空白。
    【解决方案3】:

    它将检查 .Picture2 是否已定义,如果它使用了该值,则将 Window.Picture2 分配给新的对象字面量。

    正如@Christoph 所说 - 如果对象是 falsyPicture2 将被分配一个新的对象字面量。

    http://www.sitepoint.com/javascript-truthy-falsy/

    【讨论】:

    • 准确地说:如果它是虚假的 - 这包括 0""NaNnullfalse
    • @Christoph - 谢谢,已编辑。
    【解决方案4】:

    读作:

    如果 window.Picture2undefinednull 将空对象分配给 window.Picture2

    【讨论】:

    • 空 json?那是什么?
    • @GeraldSchneider 对不起。
    【解决方案5】:

    如果 window.Picture2 未定义(在条件评估中为 false),则执行 OR (||) 并且 window.Picture2 变为空对象。

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 2016-07-11
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 2012-10-24
      • 2015-12-24
      • 1970-01-01
      • 2012-09-05
      相关资源
      最近更新 更多