上面代码中,Array(3)返回一个具有 3 个空位的数组。

    注意,空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。

    1. 0 in [undefined, undefined, undefined] // true
    2. 0 in [, , ,] // false

    上面代码说明,第一个数组的 0 号位置是有值的,第二个数组的 0 号位置没有值。

    • forEach(), filter(), reduce(), every()some()都会跳过空位。
    • map()会跳过空位,但会保留这个值
    • join()toString()会将空位视为undefined,而undefinednull会被处理成空字符串。
    1. // forEach方法
    2. [,'a'].forEach((x,i) => console.log(i)); // 1
    3. // filter方法
    4. ['a',,'b'].filter(x => true) // ['a','b']
    5. // every方法
    6. [,'a'].every(x => x==='a') // true
    7. [1,,2].reduce((x,y) => x+y) // 3
    8. // some方法
    9. [,'a'].some(x => x !== 'a') // false
    10. // map方法
    11. [,'a'].map(x => 1) // [,1]
    12. // join方法
    13. [,'a',undefined,null].join('#') // "#a##"
    14. // toString方法
    15. [,'a',undefined,null].toString() // ",a,,"

    ES6 则是明确将空位转为undefined

    Array.from方法会将数组的空位,转为undefined,也就是说,这个方法不会忽略空位。

    扩展运算符(...)也会将空位转为undefined

    1. [...['a',,'b']]
    2. // [ "a", undefined, "b" ]
    1. [,'a','b',,].copyWithin(2,0) // [,"a",,"a"]

    fill()会将空位视为正常的数组位置。

    for...of循环也会遍历空位。

    1. let arr = [, ,];
    2. for (let i of arr) {
    3. }
    4. // 1
    5. // 1

    上面代码中,数组arr有两个空位,for...of并没有忽略它们。如果改成map方法遍历,空位是会跳过的。

    1. // entries()
    2. [...[,'a'].entries()] // [[0,undefined], [1,"a"]]
    3. // keys()
    4. [...[,'a'].keys()] // [0,1]
    5. // values()
    6. [...[,'a'].values()] // [undefined,"a"]
    7. // find()
    8. [,'a'].find(x => true) // undefined
    9. // findIndex()

    由于空位的处理规则非常不统一,所以建议避免出现空位。