ES6学习笔记-数组的空位
数组的空位指,数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位。1
Array(3) // [, , ,]
上面代码中,Array(3)返回一个具有3个空位的数组。
注意,空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。1
20 in [undefined, undefined, undefined] // true
0 in [, , ,] // false
ES5对空位的处理,已经很不一致了,大多数情况下会忽略空位。
- forEach(), filter(), every() 和some()都会跳过空位。
- map()会跳过空位,但会保留这个值
- join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
1 | // forEach方法 |
ES6则是明确将空位转为undefined。
Array.from方法会将数组的空位,转为undefined,也就是说,这个方法不会忽略空位。1
2Array.from(['a',,'b'])
// [ "a", undefined, "b" ]
扩展运算符(…)也会将空位转为undefined。1
2[...['a',,'b']]
// [ "a", undefined, "b" ]
copyWithin()会连空位一起拷贝。1
2[...['a',,'b']]
// [ "a", undefined, "b" ]
fill()会将空位视为正常的数组位置。1
new Array(3).fill('a') // ["a","a","a"]
for…of循环也会遍历空位。1
2
3
4
5
6let arr = [, ,];
for (let i of arr) {
console.log(1);
}
// 1
// 1
上面代码中,数组arr有两个空位,for…of并没有忽略它们。如果改成map方法遍历,空位是会跳过的。
entries()、keys()、values()、find()和findIndex()会将空位处理成undefined。1
2
3
4
5
6
7
8
9
10// entries()
[...[,'a'].entries()] // [[0,undefined], [1,"a"]]
// keys()
[...[,'a'].keys()] // [0,1]
// values()
[...[,'a'].values()] // [undefined,"a"]
// find()
[,'a'].find(x => true) // undefined
// findIndex()
[,'a'].findIndex(x => true) // 0
由于空位的处理规则非常不统一,所以建议避免出现空位。