Javascript <;空的>;由new Array()创建的元素是否有?
我被这些小家伙搞糊涂了。在我遇到它们和Array.prototype.filter之间的一些有趣行为之后,我在re.pl中鬼混,试图理解它们的真正价值。但它们似乎从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正在查找空元
切换到未定义
,这取决于查看的人(至少在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
的键,但
甚至没有键。