3

下面一行的目的和结果是什么?

var arr = arr || [];
4

3 回答 3

7

它声明变量“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”,那么||表达式的值就是那个值;否则,它是右侧的值。当左侧是“真实的”时,右侧根本不被评估。

于 2012-09-13T16:50:38.663 回答
3

实例化if is falsynew的一个实例。Arrayarr


在 C# 中,这种模式称为“空值合并操作”。如果您熟悉 C#,您将执行以下操作:

string foo = bar ?? String.Empty

这是关于该主题的详尽帖子

于 2012-09-13T16:50:56.590 回答
2

基本上在 Javascript 和其他语言(例如 Perl)中,||通常用作短路运算符。如果您有一个变量需要分配 5 个其他变量之一的值,以首先定义的为准,您可以尝试以下操作:

a = b || c || d || e || f;

这将评估b. 如果它的值为true,那么a将被赋值b,仅此而已。如果b发现是false,则搜索将传播到c。通常需要将变量与自身进行比较以检查是否分配新值。这就是它的a = a || b作用。如果是 Perl,您可以将其缩短为a ||= b.

于 2012-09-13T16:55:17.407 回答