很抱歉在这里产生误导性标题,我无法设定任何合适的标题。
当数组里面什么都没有(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])
唯一的区别是当我打印a和b时(尽管stackoverflow控制台打印它们相同,但浏览器控制台打印不同)以及当我尝试遍历数组时。同样,momentjs isEqual赋予它们相等(jsfiddle here)
我主要的疑问是:
我已经阅读了有关null和未定义的数组值的知识,并且已经理解它。但是对于这个,我还没有找到合适的方法。我发现的大多数搜索都与const a = []有关,它是一个空数组或如何检查数组是否为空等等。
因此,如果有人可以解释或提供任何适当的阅读链接,这将非常有帮助。
如果要添加其他内容,请告诉我。
答案 0 :(得分:1)
首先,将您创建的内容称为稀疏数组。简而言之,稀疏数组与普通数组相似,但并非所有索引都具有数据。在某些情况下,例如JavaScript,这会导致对它们的处理稍显重要。其他语言只是具有固定长度的普通数组,某些值在某种意义上为“零”(取决于什么值可以表示特定数组“无”-可能是0
或null
或""
等。
稀疏数组中的空插槽听起来确实像是-没有填充数据的插槽。与大多数其他实现不同的是,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
元素的数组没有类型,不能在其上应用任何数组方法。