数组中什么是空的?例如 [空 X 5]

Sun*_*ary 2 javascript arrays

抱歉,这里的标题具有误导性,我无法构建任何合适的标题。

当数组中没有任何内容(由 打印empty X n)但它们有长度时,我对数组感到困惑。
例如我通过创建数组const a = [,,,]。这将创建一个长度为 3 但内部没有任何内容的数组。如果我在浏览器控制台中打印它,它会打印以下内容:

在此输入图像描述

What does empty mean here?如果我运行 map 或 forEach 函数并尝试控制台某些内容,我什么也得不到。

添加了一些代码。

const a = [,,,]

console.log("print a: ",a)
console.log("print a.length: ",a.length)
console.log("print typeof a[0]: ", typeof a[0])
console.log("a.forEach((data, index) => { console.log(data, index) }): ", a.forEach((data, index) => { console.log(data, index) }))
console.log("")


const b = [undefined, undefined, undefined]

console.log("print b: ", b)
console.log("print b.length: ", b.length)
console.log("print typeof b[0]: ", typeof b[0])
console.log("b.forEach((data, index) => { console.log(data, index) }): ", b.forEach((data, index) => { console.log(data, index) }))
console.log("")

console.log("compare a[0] and b[0]: ", a[0] === b[0])
Run Code Online (Sandbox Code Playgroud)

唯一不同的是当我打印 a 和 b 时(尽管 stackoverflow 控制台打印它们相同,但浏览器控制台打印不同)以及当我尝试循环遍历数组时。momentjs isEqual 也使它们相等(这里是 jsfiddle

我的主要疑问是:

  • 它是什么类型的数组?
  • 这里的空是什么意思?
  • 它与具有所有未定义值或空数组的数组有何不同?或者不是吗?
  • 我们是否使用它或任何示例用例

我已经阅读了有关 null 和未定义数组值的内容并理解了它。但对于这个,我还没有找到合适的东西。我发现的大多数搜索都与 const a = [] 是一个空数组或如何检查数组是否为空等相关。

因此,如果有人可以解释或提供任何适当的阅读链接,这将非常有帮助。

如果我需要添加其他内容,请告诉我。

VLA*_*LAZ 8

稀疏数组简介

首先澄清一下您创建的内容称为稀疏数组。简而言之,稀疏数组与普通数组类似,但并非所有索引都有数据。在某些情况下,比如 JavaScript,这会导致对它们的处理稍微更重要。其他语言只是有一个固定长度的普通数组,其中一些值在某种意义上是“零”(取决于什么值可以表示特定数组的“无” - 可能是0null""等)。

空槽位

稀疏数组中的空槽顾名思义就是没有填充数据的槽。与大多数其他实现不同,JavaScript 数组的大小不固定,甚至可能缺少一些索引。例如:

const arr = [];   // empty array
arr[0] = "hello"; // index 0 filled
arr[2] = "world"; // index 2 filled
Run Code Online (Sandbox Code Playgroud)

你将得到一个没有索引 1 的数组。它不是null,也不是空的,它不在那里。当您有一个没有属性的对象时,这与您得到的行为相同:

const person = {foo: "hello"};
Run Code Online (Sandbox Code Playgroud)

例如,您有一个具有属性的对象foo,但它没有bar属性。与之前的数组没有索引完全相同1

JavaScript 表示“未找到值”的唯一方式是使用undefined,但是这会混淆

  • “该属性存在并且分配给它的值是undefined
  • “该财产根本不存在”

这里作为一个例子:

const arr = [];   // empty array
arr[0] = "hello"; // index 0 filled
arr[2] = "world"; // index 2 filled
Run Code Online (Sandbox Code Playgroud)

undefined无论是哪种情况,尝试解决时都会遇到age这种情况,但原因不同。

由于 JavaScript 中的数组对象,因此您会得到相同的行为:

const person = {foo: "hello"};
Run Code Online (Sandbox Code Playgroud)

为什么这很重要

稀疏数组在 JavaScript 中得到不同的处理。也就是说,迭代项目集合的数组方法将仅遍历已填充的槽,并忽略空槽。这是一个例子:

const person1 = { name: "Alice", age: undefined };
const person2 = { name: "Bob" };

console.log("person1.age", person1.age);
console.log("person2.age", person2.age);

console.log("person1.hasOwnProperty('age')", person1.hasOwnProperty('age'));
console.log("person2.hasOwnProperty('age')", person2.hasOwnProperty('age'));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,迭代稀疏数组很好,但是如果undefined数组中有显式 , ,那么word => word.toUpperCase()就会失败,因为wordis undefined

如果您有要运行、、、等的数字索引数据,则稀疏.filter数组非常.find有用。我们再举例说明一下:.map.forEach

const arr = [];   // empty array
arr[0] = "hello"; // index 0 filled
arr[2] = "world"; // index 2 filled

console.log("arr[1]", arr[1]);

console.log("arr.hasOwnProperty(1)", arr.hasOwnProperty(1));
Run Code Online (Sandbox Code Playgroud)