什么是数组空位?
比如:let args=[,,,],它就是数组空位
数组空位定义:在《数组的初始化》中提到,"数组元素可以在元素列表的开头,中间或结尾处省略。每当元素列表中的逗号前面没有AssignmentExpression(即,逗号在另一个逗号的开头或之后),丢失的数组元素就会增加Array的长度并增加后续元素的引索。未定义省略的数组元素。如果一个元素被省略在数组的末尾,则该元素不会对数组的长度产生影响"
让我们了解一下:在浏览器控制台输出
1.let args = [,,,]
2.args.length = 3
3.Array.prototype.slice.call(args)
4.(3)[empty x 3]
5.args[0]
6.undefined
从上面可以看出,args中存在空位(逗号的前或后不存在表达式),且空位的值是undefined,那么就会问,这样是不是跟传入undefined值是一样的呢?
那我们就定义一个args_unfied,其中传入的值为undefined:
1.let args_unfied = [undefined,undefined,undefined]
2.args_unfied.length = 3
3.Array.prototype.slice.call(args_unfied)
4.(3) [undefined, undefined, undefined]
5.args_unfied[0]
6.undefined
由上面可以看到,第3行的执行结果第四行不一样,由此可以得出结论,空位数组中不存在数组索引
那我们就深入探讨一下究竟哪里不一样:
args.hasOwnProperty(0) = false //说明没有索引
Object.keys(args)
[]//说明没有索引
args_unfied.hasOwnProperty(0) =true
Object.keys(args_unfied)
(3) ["0", "1", "2"]
-----------------------------------
//Array.prototype.reduce(fn)传入一个函数,累加器
args.reduce((x,y) =>x+y) //无法执行空数组
//VM1490:1 Uncaught TypeError: Reduce of empty array with no initial value
// at Array.reduce (<anonymous>)
// at <anonymous>:1:6
args_unfied.reduce((x,y) =>x+y) //NaN 非数字相加为NaN
-----------------------------------
Araay.prototype.every(fn) //数组中所有值都符合条件则返回true,如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测,且不会对空数组进行检测
args.every(x=>y)//不管y的值是什么,都返回true,默认返回true,跳过检测
args_unfied.every(x=>x==undefined) //true