Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组中什么是空的?e、 g.[空X 5]_Javascript_Arrays - Fatal编程技术网

Javascript 数组中什么是空的?e、 g.[空X 5]

Javascript 数组中什么是空的?e、 g.[空X 5],javascript,arrays,Javascript,Arrays,很抱歉,这里的标题有误导性,我无法框出任何合适的标题 当数组中没有任何内容(按空X n打印)但它们有长度时,我对数组感到困惑。 e、 g.我通过常量a=[,,]创建数组。这将创建一个长度为3的数组,但其中没有任何内容。如果在浏览器控制台中打印,它将打印以下内容: 这里的empty是什么意思?如果我运行map或forEach函数并试图控制台某个东西,我将一无所获 添加了一些代码 const a=[,,] 日志(“打印a:,a”) log(“打印a.length:,a.length”) log(

很抱歉,这里的标题有误导性,我无法框出任何合适的标题

当数组中没有任何内容(按
空X n
打印)但它们有长度时,我对数组感到困惑。
e、 g.我通过
常量a=[,,]
创建数组。这将创建一个长度为3的数组,但其中没有任何内容。如果在浏览器控制台中打印,它将打印以下内容:

这里的empty是什么意思?
如果我运行map或forEach函数并试图控制台某个东西,我将一无所获

添加了一些代码

const a=[,,]
日志(“打印a:,a”)
log(“打印a.length:,a.length”)
log(“打印类型a[0]:”,类型a[0])
log(“a.forEach((数据,索引)=>{console.log(数据,索引)}):”,a.forEach((数据,索引)=>{console.log(数据,索引)}))
console.log(“”)
常量b=[未定义,未定义,未定义]
日志(“打印b:,b”)
console.log(“打印b.length:,b.length”)
console.log(“打印类型b[0]:”,类型b[0])
console.log(“b.forEach((数据,索引)=>{console.log(数据,索引)}):”,b.forEach((数据,索引)=>{console.log(数据,索引)}))
console.log(“”)

console.log(“比较a[0]和b[0]:”,a[0]==b[0])
它是空的它既不是未定义的也不是空的
常数a=[,,,]
常数a=新数组(4)

这里的
a
是一个数组,没有填充元素,只有
length
属性
这样做,
让arr1=newarray()
然后
console.log(arr1.length)
您将得到0作为输出。如果执行
console.log(arr1)
操作,您将得到
[]
如果您像这样更改arr1的length属性
arr1.length=4
,您将拥有一个长度属性为4的空数组,但不会填充任何项,因此这些插槽将
为空
console.log(typeof(arr1[0])
只有在没有其他可能的类型可显示的情况下,才会得到
未定义的
。并且数组的任何方法都不会应用于具有空元素的数组

所以

空数组表示具有长度属性且插槽未填充的数组

这与
未定义的
数组不同,因为在JS中
未定义的
是一种类型,您可以通过调用其上的所有数组方法来执行并产生结果,而
为空的
元素的数组没有类型,也不能对其应用任何数组方法。

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

空位 稀疏数组中的空插槽与它听起来的完全一样—插槽中没有填充数据。与大多数其他实现不同,JavaScript数组的大小不固定,甚至可能缺少一些索引。例如:

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表示“找不到值”的唯一方法是使用
未定义的
,但是这会混淆

  • “该属性存在,并且分配给它的值是未定义的
  • “该属性根本不存在”
  • 以下是一个例子:

    constperson1={name:“Alice”,年龄:未定义};
    const person2={name:“Bob”};
    日志(“person1.age”,person1.age);
    日志(“person2.age”,person2.age);
    log(“person1.hasOwnProperty('age')”,person1.hasOwnProperty('age');
    
    console.log(“person2.hasOwnProperty('age')”,person2.hasOwnProperty('age'));
    Empty是字面意思——该插槽中没有数据。它不是
    未定义的
    ,也不是
    null
    ——数组是稀疏的。从@VLAZ获取引用,如果我错了,请纠正我。它类似于:null意味着内存分配的值为null(或引用指向null),未定义表示分配了内存位置,但不存在任何值(或引用在那里,但不指向任何地方),但
    empty表示甚至没有分配内存(或引用根本不存在)
    ?这是否回答了您的问题?@Sunil排序。数组中是否分配内存是一个实现细节。JS中的数组不一定像其他语言一样提供连续内存,因此稀疏数组肯定可以有空插槽,甚至不占用空间。
    null
    未定义的
    都是无效的h值,因此它们是存在的。但是,所有设置为
    null
    的绑定可能实际上都指向一个值,因此您不会得到
    null
    的多个“副本”。不确定是否这样做。
    未定义的
    可能是实际值或缺少值-例如
    a={};a.foo
    。感谢您的解释和示例。我所有的疑问现在都解决了。