数组的空位指,数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位。
上面代码中,Array(3)返回一个具有3个空位的数组。
注意,空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。
1 2
| 0 in [undefined, undefined, undefined] 0 in [, , ,]
|
上面代码说明,第一个数组的0号位置是有值的,第二个数组的0号位置没有值。通过apply
方法,利用Array
构造函数将数组的空元素变成undefined。
1 2
| Array.apply(null, ["a",,"b"])
|
ES5 对空位的处理,已经很不一致了,大多数情况下会忽略空位。
- forEach(),filter(),every() 和some(), reduce() 都会跳过空位。
- map()会跳过空位,但会保留这个值(位置)
- join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| [,'a'].forEach((x,i) => console.log(i));
['a',,'b'].filter(x => true)
[,'a'].every(x => x==='a')
[,'a'].some(x => x !== 'a')
[,'a'].map(x => 1)
[,'a',undefined,null].join('#')
[,'a',undefined,null].toString()
|
ES6 则是明确将空位转为undefined。
现在有个面试题,移除数组的空位,我们就可以利用 filter
或者 forEach
等方法。
1 2 3
| function removeEmpty(arr) { return arr.filter(n => n) }
|
ref: http://es6.ruanyifeng.com/#docs/array#数组的空位