下面一行的目的和结果是什么?
var arr = arr || [];
它声明变量“arr”并将其值设置为另一个已经存在的变量(可能在某个外部范围内),除非该变量不是“真实的”,在这种情况下,“arr”被设置为引用一个新的空数组.
因此,如果已经存在的 "arr" 的值是null
, 0
, false
, or ""
, or is undefined
,那么本地 "arr" 将是一个空数组。否则,它将具有与外部“arr”相同的值。
你通常会在这样的情况下看到:
var arr;
function whatever() {
var arr = arr || [];
...
}
有时人们会这样做:
function questionable( arr ) {
var arr = arr || [];
在这种情况下,var
是不必要的。
这一切都有效,因为||
JavaScript 中的运算符与其他类 C 语言中的表亲明显不同。在 JavaScript 中,||
表达式的值并不强制为布尔值。相反,它是其左侧操作数或右侧操作数的值。它确实检查这些值以确定它们是否“真实”,但布尔强制是内部的。如果左边是“truthy”,那么||
表达式的值就是那个值;否则,它是右侧的值。当左侧是“真实的”时,右侧根本不被评估。
实例化if is falsynew
的一个实例。Array
arr
在 C# 中,这种模式称为“空值合并操作”。如果您熟悉 C#,您将执行以下操作:
string foo = bar ?? String.Empty
这是关于该主题的详尽帖子。
基本上在 Javascript 和其他语言(例如 Perl)中,||
通常用作短路运算符。如果您有一个变量需要分配 5 个其他变量之一的值,以首先定义的为准,您可以尝试以下操作:
a = b || c || d || e || f;
这将评估b
. 如果它的值为true
,那么a
将被赋值b
,仅此而已。如果b
发现是false
,则搜索将传播到c
。通常需要将变量与自身进行比较以检查是否分配新值。这就是它的a = a || b
作用。如果是 Perl,您可以将其缩短为a ||= b
.