Javascript中"options = options || {}"的含义是什么?

ptr*_*trn 40 javascript syntax notation

前几天我好奇地想到了一段代码,但我不确定它到底是做什么的;

options = options || {};
Run Code Online (Sandbox Code Playgroud)

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

是/否?

CMS*_*CMS 49

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

function test (options) {
  options = options || {};
}
Run Code Online (Sandbox Code Playgroud)

如果test不带参数调用,options将使用空对象进行初始化.

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

Falsy值是:0,null,undefined,空字符串(""),NaN和当然的false.


Fil*_*efp 13

这是默认模式 ..

您在代码片段中的内容是实现默认模式的最常用方法,它将返回第一个操作数的值,该值在转换为布尔值时产生值.

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} */
Run Code Online (Sandbox Code Playgroud)

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

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 = {};
Run Code Online (Sandbox Code Playgroud)

逻辑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      -> {}
Run Code Online (Sandbox Code Playgroud)

null || false     || {} -> {}
0    || "!!"      || 9  -> "!!"
Run Code Online (Sandbox Code Playgroud)

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


什么时候有用?

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

function do_something (some_value) {
  some_value = some_value || "hello world";

  console.log ("saying: " + some_value);
}

...

do_something ("how ya doin'?");
do_something ();
Run Code Online (Sandbox Code Playgroud)

saying: how ya doin'?
saying: hello world
Run Code Online (Sandbox Code Playgroud)

笔记

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

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

许多程序员来自不是这种情况的语言(C,C++,PHP,Python等等),起初发现这个相当混乱,当然总是相反; 来自javascript(perl等)的人想知道为什么这个功能没有在其他地方实现.


jim*_*mbo 10

是.样本等同于:

if (options) {
    options = options;
} else {
    options = {};
}
Run Code Online (Sandbox Code Playgroud)

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


Jak*_*mpl 6

是的,这正是它的作用.