起因:看vue官方文档的时候,发现有段代码是Array.apply(null,{length:20}).map(() => {})这样的
解释:这段代码按照表面理解肯定是循环一个20长度的数组,返回一个新的20位数组
思考:1.为什么写Array.appply(null, {length:20})而不是写Array(20)?
2.xxx.apply(a,b) 这个b不应该是个数组么?为什么一个对象也可以?
解答:1.var arr = Array(20)是创建一个长度为20的数组,但是数组每个位置上都没有值,返回的是[empty × 20],仅仅只是占位作用,如果用arr[0]=undefined... arr[19]=undefined 就和Array.apply(null, {length:20})完全一样了。
所以如果用Array(20).map()是不会执行的;Array.apply(null, {length:20})是也是创建一个长度20的数组,返回的是[undefined,undefined,undefined,undefined...]这是的的确确有值的,只不过值为undefined,故使用Array.apply(null, {length:20})是可以完成遍历的。
2.{length:20}简单看似是个对象,但实际想想这是个类数组,0->19位都是undefined,length = 20,类数组是可以作为apply的第二个参数的,如:
function a () {
Array.prototype.push.apply(arguments)
};这里的arguments就是类数组
这样疑惑就都解开了。
实际测试中发现Array.apply(null,{name: 'a'})会返回一个[],这应该是js内部做了什么操作,我暂时还不太清楚,有清楚的大佬可以留言解答一下,多谢。总之没有length的普通对象就会返回[]