我对这些小家伙很困惑。在我遇到他们和Array.prototype.filter之间的一些有趣的行为后,我在re.pl中试图理解他们的真正价值。但似乎他们从<empty>
切换到undefined
取决于谁在寻找(至少在re.pl和节点中,它们在此环境中被记录为undefined
)。
let emptyArr = new Array(5);
//set up two control elements
emptyArr[0] = 0;
emptyArr[4] = undefined;
console.log('\nemptyArr:', emptyArr)
console.log('\npeeking at an empty element:', emptyArr[1])
console.log('\nfilter for undefined elements:', emptyArr.filter(e => e === undefined))
console.log('\nfilter for any element:',
emptyArr.filter(e => {
console.log("ele:", e)
return true
})
) // only two elements are registered here
console.log('\nmappedEmpty:', emptyArr.map(e => e)) //everything is preserved
console.log('\ngenerated array', Array.from(emptyArr))
console.log('\nalways true filter on generated array:', Array.from(emptyArr).filter(e => true)) // empties are now 'true' undefined
这里的故事是什么?古怪的阵列原型方法还是秘密的超假y值?
答案 0 :(得分:2)
这里的故事是什么?古怪的阵列原型方法还是秘密的超假y值?
数组是对象。数组的元素只是底层对象的属性。访问不存在的属性会返回undefined
。因此,当您访问emptyArr[1]
时,您会获得undefined
。查看Chrome控制台可能有所帮助:
如您所见,0
和4
存在,因为您通过分配这些条目来创建这些条目。 <{1}},1
和2
不存在。
这些没有价值的职位通常被称为&#34;漏洞&#34;。您的数组在3
,1
和2
位置有孔。带孔的数组也称为#34;稀疏数组&#34;。
大多数数组方法(3
,.filter
等)跳过漏洞。我们可以通过某些方法轻松证明这一点:
.map
&#13;
当然,我们也可以查看language specification,例如Array#every
所在的位置:
仅对实际存在的数组元素调用另一方面,callbackfn ;它不会被称为缺少数组的元素。
// Array#map
console.log([,,,42].map(() => 21)); // [,,,21], not [21,21,21,21]
// Array#every
console.log([,,,42].every(x => x === 42)); // true, not false
显式查看传递给它的值的Array.from
属性,它将复制.length
和0
之间的任何属性/元素。换句话说,它不跳过漏洞。
查看Chrome控制台中阵列之间的差异:
值得注意的是,.length
可能并不关心漏洞。它始终是数组+ 1中最高的 set 索引。
答案 1 :(得分:0)
他们是new_file = open('myfile.txt', 'wb')
t_w = text_list[y].encode('utf-8') # I assume you use Unicode strings
new_file.write(t_w)
new_file.write(ub'\n')
new_file.close()
。它只取决于引擎如何显示它们,但尝试访问它们会返回undefined
,因为它们是什么 - 尚未定义的元素。
例如,Chrome控制台将打印undefined
,而节点会为同一> (5) [empty × 5]
打印[ , , , , ]
。它比仅显示new Array(5)
更具视觉表现力。
答案 2 :(得分:0)
new Array(5)
得到:
{
length:5
}
所以像对象一样,对于非设置值,它们返回未定义:
array[3] // undefined
但这并不意味着属性设置为未定义。当您使用Array.from
时,这会发生变化。你可以想象它做得像......
for(var i = 0; i < oldarray.lemgth; i++){
newarray[i] = oldarray[i];
}
所以在Array.from
调用之后看起来像这样:
{
length:5,
0:undefined,
1:undefined,
2:undefined,
3:undefined,
4:undefined
}