空白数组返回长度为 5

Blank Array Returned A Length of 5

我一直在观看 Mark Zamoyta 的 PluralSight 快速 JavaScript 培训,我偶然发现了这个。他展示了这两个例子。我一直在努力思考它,但仍然无法理解。

如何在使用 new Array() 方法创建数组后捕获条目的长度,看到它 return 编辑了一个空白数组 []。如果是这样的空白[],不应该是return-1吗?

  var entries = [1,2,3,4,5];
  entries.length
  => 5
  entries
  => [ 1, 2, 3, 4, 5 ]

  var entries = new Array(5);
  entries.length
  => 5
  entries
  => []

JS 中数组的 length 属性 不是即时计算的——也可以通过构造函数或赋值手动设置,并随着对象的添加或删除而更新(Spec):

Specifically, whenever a property is added whose name is an array index, the length property is changed, if necessary, to be one more than the numeric value of that array index[.]

这是一个简单的 属性,它会保持最新状态,而不是计算。使用构造函数 new Array(5) 初始化一个数组,其中 length 设置为 5。也可以手动设置,根据需要填写undefined或者截断数组:

var arr = [];
arr.length = 3;
// arr is now [undefined, undefined, undefined]
var myArray = new Array(5);

当您像上面那样通过向构造函数传递一个整数来定义数组时,会为数组中的 5 个槽分配内存。如果检查数组,您会发现:

console.log(myArray[1]);
=> undefined
console.log(myArray.toString);
=> ,,,,

如你所见,数组中确实有五个元素,每个元素undefined。所以你的数组不是 "blank."

以这种方式初始化数组可能是一种不好的做法,因为它没有很好的用例。推送到数组将产生:

myArray.push("value");
console.log(myArray.toString);
=> ,,,,,value

...这绝不是您想要的。我建议像下面这样初始化数组,忘记将整数传递给构造函数甚至是一个选项:

var myArray = [];