Javascript 中的“options = options || {}”是什么意思?

IT技术 javascript syntax notation
2021-01-18 11:23:15

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

options = options || {};

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

是/否?

5个回答

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

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

如果test不带参数调用options将用空对象初始化。

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

值是:0, null, undefined, 空字符串 ( ""), NaN, 当然还有false.

ES6 更新:现在,自 ES6 以来,我们在语言中拥有真正的默认参数值

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

如果您不带参数调用该函数,或者使用 value 显式调用该函数,则undefinedoptions参数将采用默认值。||运算符示例不同,其他虚假值不会导致使用默认值。

这是默认模式..

您在代码片段中拥有的是实现default-pattern的最常见方法,它将返回第一个操作数的值,该值在转换为布尔值时产生值。

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 = {};

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

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等)的人想知道为什么这个功能没有在其他地方实现。

好东西。比较表很整洁,所以仍然很感激:)
2021-03-23 11:23:15
哦,是的,愚蠢的错字 - 会尽快修复它(编辑:已修复)。我最初为一个被标记为与此问题重复的问题写了这个答案,在检查了该线程中的答案后,我认为我的答案比其他答案要好一些,因此我将其发布在这里。
2021-04-08 11:23:15

是的。该示例等效于:

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

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

是的,这正是它的作用。

发现了另一个变种:

options || (options = {});

似乎做同样的伎俩。

@skibulk 可能无法删除括号,因为 equals 的优先级低于逻辑运算符,但为什么它们必须解析?如果你谈到通常的解析,它可能什么都不是
2021-03-15 11:23:15
两个版本都会进行布尔求值,但在这个版本中,变量赋值不必每次都发生,这样可以节省 CPU(当然增益很小)。再说一次,我不知道解释器是否必须解析括号,否定增益?你能去掉括号吗?
2021-04-04 11:23:15