前几天我看到了一段我很好奇的代码,但我不确定它实际上做了什么;
options = options || {};
到目前为止我的想法;如果存在,则将变量设置options
为值options
,如果不存在,则设置为空对象。
是/否?
前几天我看到了一段我很好奇的代码,但我不确定它实际上做了什么;
options = options || {};
到目前为止我的想法;如果存在,则将变量设置options
为值options
,如果不存在,则设置为空对象。
是/否?
这对于为函数参数设置默认值很有用,例如:
function test (options) {
options = options || {};
}
如果test
不带参数调用,options
将用空对象初始化。
||
如果第一个操作数为假,则逻辑 OR运算符将返回其第二个操作数。
假值是:0
, null
, undefined
, 空字符串 ( ""
), NaN
, 当然还有false
.
ES6 更新:现在,自 ES6 以来,我们在语言中拥有真正的默认参数值。
function test (options = {}) {
//...
}
如果您不带参数调用该函数,或者使用 value 显式调用该函数,则undefined
该options
参数将采用默认值。与||
运算符示例不同,其他虚假值不会导致使用默认值。
您在代码片段中拥有的是实现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 等)的程序员一开始觉得这很令人困惑,当然总是有相反的情况;来自javascript(perl等)的人想知道为什么这个功能没有在其他地方实现。
是的。该示例等效于:
if (options) {
options = options;
} else {
options = {};
}
OR 运算符 ( ||
) 将短路并返回第一个真值。
是的,这正是它的作用。
发现了另一个变种:
options || (options = {});
似乎做同样的伎俩。