【问题标题】:What does "options = options || {}" mean in Javascript? [duplicate]Javascript 中的“options = options || {}”是什么意思? [复制]
【发布时间】:2011-02-20 12:56:08
【问题描述】:

前几天我遇到了一段我很好奇的代码,但我不确定它实际上是做什么的;

options = options || {};

到目前为止我的想法;将变量 options 设置为值 options 如果存在,则设置为空对象。

是/否?

【问题讨论】:

  • 是的,它就是这么做的。
  • 一个建议:“什么是”options = options || {}" mean in Javascript? 是一个恰当的问题,会让更多人看到这个问题。
  • 我试图回答“是”,但 SO 说我的回答太短了。 :(
  • 可以用函数比较??? var func = 回调 ||函数() { ... };

标签: javascript syntax notation


【解决方案1】:

这对于将 默认 值设置为函数参数很有用,例如:

function test (options) {
  options = options || {};
}

如果你在没有参数的情况下调用testoptions 将被初始化为一个空对象。

如果第一个操作数是 falsy,逻辑 OR || 运算符将返回其第二个操作数。

Falsy 值是:0nullundefined、空字符串 ("")、NaN,当然还有 false

ES6 更新:现在,自 ES6 以来,我们在语言中拥有真正的 default parameter values

function test (options = {}) {
  //...
}

如果您在没有参数的情况下调用该函数,或者如果使用值undefined 显式调用该函数,则options 参数将采用默认值。与|| 运算符示例不同,其他虚假值不会导致使用默认值。

【讨论】:

    【解决方案2】:

    是的,这正是它的作用。

    【讨论】:

      【解决方案3】:

      是的。示例相当于这样:

      if (options) {
          options = options;
      } else {
          options = {};
      }
      

      OR 运算符 (||) 将短路并返回第一个真值。

      【讨论】:

        【解决方案4】:

        这是 默认模式..

        sn-p 中的内容是实现 default-pattern 的最常见方式,它将返回产生 true 的第一个操作数的值转换为布尔值时的值。

        var some_data   = undefined;
        var some_obj_1  = undefined;
        var some_obj_2  = {foo: 123};
        
        var str = some_data || "default";
        var obj = some_obj1 || some_obj2  || {};
        
        /* str == "default", obj == {foo: 123} */
        

        上面基本上相当于做了下面更详细的替代方法

        var str = undefined;
        var obj = undefined;
        
        if (some_data) str = some_data;
        else           str = "default";
        
        if      (some_obj1) obj = some_obj1;
        else if (some_obj2) obj = some_obj2;
        else                obj = {};
        

        逻辑或运算符产生的值示例:

        1         || 3         -> 1
        0         || 3         -> 3
        undefined || 3         -> 3
        NaN       || 3         -> 3
        ""        || "default" -> "default"
        undefined || undefined -> undefined
        false     || true      -> true
        true      || false     -> true
        null      || "test"    -> "test"
        undefined || {}        -> {}
        {}        || true      -> {}
        

        null || false     || {} -> {}
        0    || "!!"      || 9  -> "!!"
        

        如您所见,如果未找到匹配项,则最后一个操作数的值为 yield。


        什么时候有用?

        有几种情况,但最流行的一种是设置函数参数的默认值,如下所示:

        function do_something (some_value) {
          some_value = some_value || "hello world";
        
          console.log ("saying: " + some_value);
        }
        
        ...
        
        do_something ("how ya doin'?");
        do_something ();
        

        saying: how ya doin'?
        saying: hello world
        

        注意事项

        这是 javascript 与许多其他流行编程语言相比的显着差异之一。

        运算符|| 不会隐式产生布尔值,但它会保留操作数类型并产生第一个将在布尔表达式中计算为真的类型。

        许多来自不是这种情况的语言(C、C++、PHP、Python 等)的程序员一开始会觉得这相当令人困惑,当然总是有相反的情况;来自 javascriptperl 等)的人想知道为什么这个功能没有在其他地方实现。

        【讨论】:

        • 哦,是的,愚蠢的错字 - 将尽快修复它(edit:已修复)。我最初为一个问题写了这个答案,这个问题被标记为这个问题的重复,在检查了这个线程中的答案后,我认为我的答案比其他答案好一点,因此我把它贴在这里。
        • 好东西。比较表很整洁,所以仍然很感激:)
        【解决方案5】:

        发现了这个的另一种变体:

        options || (options = {});
        

        似乎做同样的伎俩。

        【讨论】:

        • 两个版本都会进行布尔求值,但在这个版本中,变量赋值不必每次都进行,这样可以节省 CPU(假设增益很小)。再说一次,我不知道解释器是否必须解析括号,否定增益?你能放下括号吗?
        • @skibulk 不可能删除括号,因为 equals 的优先级低于逻辑运算符,但为什么它们必须解析呢?如果您谈到通常的解析,它可能什么都不是
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 2015-07-15
        • 2018-07-17
        • 2011-04-16
        • 2014-09-22
        • 2014-07-28
        • 2016-11-19
        相关资源
        最近更新 更多