const arr = Array.apply(null, {length: 3});
console.log(arr); // [ undefined, undefined, undefined ]
用undefined初始化一个长度为3的数组, 数组的每一个元素都是存在的. 和使用
[].length = 3;
有本质的区别, 前者是在每个位置上实打实地设置undefined, 后者是长度为3的"空"数组, 这个"空"在不同环境不同浏览器上的行为是不一样的. 重点不是这个.
重点是apply第二个参数不应该是一个数组吗? 这里用了一个含有length属性的对象, apply会去解析这个对象(当做数组去解析). 首先取length, 取到了3, apply会认为"数组"里有3个元素, 这三个元素会被当做函数的参数, 当然, 这里是undefined, 因为根本没有这三个参数. 这是一次对apply的欺骗.
const arr = Array.apply(null, {length: 3, '0': 0, '1': 1, '2': 2});
console.log(arr); // [ 0, 1, 2 ]