Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 <;空的>;由new Array()创建的元素是否有?_Javascript_Arrays - Fatal编程技术网

Javascript <;空的>;由new Array()创建的元素是否有?

Javascript <;空的>;由new Array()创建的元素是否有?,javascript,arrays,Javascript,Arrays,我被这些小家伙搞糊涂了。在我遇到它们和Array.prototype.filter之间的一些有趣行为之后,我在re.pl中鬼混,试图理解它们的真正价值。但它们似乎从切换到未定义,这取决于查看的人(至少在re.pl和node中,在这个环境中,它们被记录为未定义) 设emptyArr=新数组(5); //设置两个控制元素 emptyArr[0]=0; emptyArr[4]=未定义; console.log('\nemptyrr:',emptyArr) console.log('\n正在查找空元

我被这些小家伙搞糊涂了。在我遇到它们和Array.prototype.filter之间的一些有趣行为之后,我在re.pl中鬼混,试图理解它们的真正价值。但它们似乎从
切换到
未定义
,这取决于查看的人(至少在re.pl和node中,在这个环境中,它们被记录为
未定义


设emptyArr=新数组(5);
//设置两个控制元素
emptyArr[0]=0;
emptyArr[4]=未定义;
console.log('\nemptyrr:',emptyArr)
console.log('\n正在查找空元素:',emptyArr[1])
console.log('\n未定义元素的筛选器:',emptyArr.filter(e=>e==undefined))
console.log('\n任何元素的筛选器:',
空过滤器(e=>{
console.log(“ele:,e)
返回真值
})
)//此处仅注册了两个元素
console.log('\nmappedEmpty:',emptyArr.map(e=>e))//所有内容都被保留
console.log('\n生成的数组',array.from(emptyArr))

console.log('\nalways true filter on generated array:',array.from(emptyArr).filter(e=>true))//空值现在是'true'未定义的
它们是
未定义的
。它只取决于引擎如何显示它们,但尝试访问它们会返回未定义的
,因为它们就是未定义的元素


例如,Chrome控制台将打印
(5)[empty×5]
,而节点将为相同的
新数组(5)
打印
[,]
。它只是一种比显示
[未定义,未定义,未定义,未定义,未定义]
更直观的表示方式,它们是
未定义的。它只取决于引擎如何显示它们,但尝试访问它们会返回未定义的
,因为它们就是未定义的元素


例如,Chrome控制台将打印
(5)[empty×5]
,而节点将为相同的
新数组(5)
打印
[,]
。它只是一种更直观的表示,而不是,比如说,显示
[未定义,未定义,未定义,未定义]

实际上它们并不存在。假设数组是对象,使用
新数组(5)
您将得到:

{
 length:5
}
所以像对象一样,它们返回未定义的非集值:

array[3] // undefined
但这并不意味着有一个属性设置为未定义。当您使用
数组.from
时,会发生变化。你可以想象它在做什么

for(var i = 0; i < oldarray.lemgth; i++){
 newarray[i] = oldarray[i];
}

事实上它们并不存在。假设数组是对象,使用
新数组(5)
您将得到:

{
 length:5
}
所以像对象一样,它们返回未定义的非集值:

array[3] // undefined
但这并不意味着有一个属性设置为未定义。当您使用
数组.from
时,会发生变化。你可以想象它在做什么

for(var i = 0; i < oldarray.lemgth; i++){
 newarray[i] = oldarray[i];
}
这里的故事是什么?古怪的阵列原型方法还是秘密的超假y值

数组是对象。数组元素只是底层对象的属性。访问不存在的属性将返回未定义的
。因此,当您访问
emptyArr[1]
时,会得到
未定义的
。查看Chrome的控制台可能会有所帮助:

如您所见,
0
4
的存在是因为您通过分配给它们来创建这些条目<代码>1
2
3
不存在

这些没有值的位置通常称为“孔”。您的阵列在位置
1
2
3
处有孔。带有孔的阵列也称为“稀疏阵列”

大多数数组方法(
.filter
.map
等)都会跳过漏洞。对于某些方法,我们可以很容易地证明这一点:

//数组#映射
console.log([,,42].map(()=>21));//[,,21],而不是[21,21,21,21]
//数组#每
console.log([,,42]。每(x=>x==42));//正确,不是错误
这里的故事是什么?古怪的阵列原型方法还是秘密的超假y值

数组是对象。数组元素只是底层对象的属性。访问不存在的属性将返回未定义的
。因此,当您访问
emptyArr[1]
时,会得到
未定义的
。查看Chrome的控制台可能会有所帮助:

如您所见,
0
4
的存在是因为您通过分配给它们来创建这些条目<代码>1
2
3
不存在

这些没有值的位置通常称为“孔”。您的阵列在位置
1
2
3
处有孔。带有孔的阵列也称为“稀疏阵列”

大多数数组方法(
.filter
.map
等)都会跳过漏洞。对于某些方法,我们可以很容易地证明这一点:

//数组#映射
console.log([,,42].map(()=>21));//[,,21],而不是[21,21,21,21]
//数组#每
console.log([,,42]。每(x=>x==42));//true,非false
项在数组中缺少键值项。
未定义
条目只是一个值为
未定义
的键,但
甚至没有键。
条目在数组中缺少键-值条目。
undefined
条目只是一个值为
undefined
的键,但
甚至没有键。