新Array()创建的<empty>元素有哪些值?

时间:2017-10-12 18:49:18

标签: javascript arrays

我对这些小家伙很困惑。在我遇到他们和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值?

3 个答案:

答案 0 :(得分:2)

  

这里的故事是什么?古怪的阵列原型方法还是秘密的超假y值?

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

enter image description here

如您所见,04存在,因为您通过分配这些条目来创建这些条目。 <{1}},12不存在。

这些没有价值的职位通常被称为&#34;漏洞&#34;。您的数组在312位置有孔。带孔的数组也称为#34;稀疏数组&#34;。

大多数数组方法(3.filter等)跳过漏洞。我们可以通过某些方法轻松证明这一点:

&#13;
&#13;
.map
&#13;
&#13;
&#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属性,它将复制.length0之间的任何属性/元素。换句话说,它跳过漏洞。

查看Chrome控制台中阵列之间的差异:

enter image description here

值得注意的是,.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
}