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

时间:2019-12-12 11:26:08

标签: javascript arrays

很抱歉在这里产生误导性标题,我无法设定任何合适的标题。

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

enter image description here

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])

唯一的区别是当我打印a和b时(尽管stackoverflow控制台打印它们相同,但浏览器控制台打印不同)以及当我尝试遍历数组时。同样,momentjs isEqual赋予它们相等(jsfiddle here

我主要的疑问是:

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

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

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

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

2 个答案:

答案 0 :(得分:1)

稀疏数组简介

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

空插槽

稀疏数组中的空插槽听起来确实像是-没有填充数据的插槽。与大多数其他实现不同的是,JavaScript数组的大小不是固定的,甚至可以具有某些 missing 的索引。例如:

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

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

const person = {foo: "hello"};

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

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

  • “该属性存在,并且为其分配的值为undefined
  • “该财产根本不存在”

这里有一个例子:

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'));

在两种情况下尝试解决undefined时都会得到age,但是原因有所不同。

由于JavaScript 中的数组是对象,因此您将获得相同的行为:

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));

为什么重要

稀疏数组在JavaScript中得到了不同的处理。即,迭代项目集合的数组方法将仅通过 filled 插槽,而将省略空插槽。这是一个示例:

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

const arr1 = sparseArray.map(word => word.toUpperCase());

console.log(arr1); //["HELLO", empty, "WORLD"]


const denseArray = []; //empty array
denseArray[0] = "hello"; // index 0 filled
denseArray[1] = undefined; //index 1 filled
denseArray[2] = "world"; //index 2 filled

const arr2 = denseArray.map(word => word.toUpperCase()); //error

console.log(arr2);

如您所见,迭代稀疏数组是可以的,但是如果您在数组中有显式undefined,则word => word.toUpperCase()将失败,因为word为{{1} }。

如果您要运行undefined.filter.find.map等以数字索引的数据,则稀疏数组很有用。让我们再次说明:

.forEach

答案 1 :(得分:0)

它就是empty既不是undefined也不是null
const a = [,,,,]const a = new Array(4)相同
这里a是一个数组,其中没有填充任何元素,并且只有length属性
为此,let arr1 = new array(),然后console.log(arr1.length),您将获得0作为输出。如果您进行console.log(arr1),则会得到[ <4 empty items> ] 如果您像这样arr1.length = 4更改arr1的length属性,则将有一个空数组,其length属性= 4,但是没有填充任何项目,因此这些插槽将是empty,并且如果执行{{1 }}之所以得到console.log(typeof(arr1[0]),是因为没有其他可能的类型可供显示。并且Array的任何方法都不会应用于具有空元素的数组

所以

空数组表示具有length属性且没有填充插槽的数组

这与带有undefined的数组不同,因为在JS中,undefined是一种类型,您可以通过调用所有数组方法来执行并获得结果,而带有undefined元素的数组没有类型,不能在其上应用任何数组方法。