Array.apply(null, { length: 2 }) 是什么意思
看到vue文档的示例中,使用以下代码创建了2个相同的段落
注:文档中length的值为20,这里方便演示改为了2
render: function (createElement) {
return createElement('div',
Array.apply(null, { length: 2 }).map(function () {
return createElement('p', 'hi')
})
)
}
1. apply方法中第二个参数{length: 2}是什么意思
对象{length: 2}是一个类数组对象,因为没有初始化下标0,1的值,所以获取0,1下标的值得到的都是undefined。
// 类数组对象可以转成真正的数组
const a = Array.prototype.slice.call({length: 2});
console.log(Array.isArray(a)) // true
2. Array.apply(null, { length: 2 })是什么意思
ES5开始apply函数的第二个参数除了可以是数组外,还可以是类数组对象(即包含length属性,且length属性值是个数字的对象)
直接调用Array函数和new方式调用是等价的
cosnt a = Array(2) // 等价于const a = new Array(2)
因此Array.apply(null, { length: 2 })就是创建一个存储两个undefined的数组
Array.apply(null, { length: 2 })
// 等价于
Array.apply(null, [undefined, undefined])
// 等价于
Array(undefined, undefined)
// 等价于
new Array(undefined, undefined)
3. Array(2)与Array.apply(null, { length: 2 })的区别
- 相同点:都是创建一个长度为2的数组
- 不同点:Array(2)创建的数组元素没有被初始化,Array.apply(null, { length: 2 })创建的数组每个元素都被赋值为undefined。
4. vue文档中为什么用Array.apply(null, { length: 2 })
map函数不会遍历数组中没有初始化或者被delete的元素(有相同限制还有forEach, reduce方法),根据上述“Array(2)与Array.apply(null, { length: 2 })的区别”可以得知,Array(2)创建的数组map的回调函数不会执行,Array.apply(null, { length: 2 })创建的数组map的回调函数才会执行两次
本文来自博客园,作者:这货不是古月先生,转载请注明原文链接:https://www.cnblogs.com/gu-yue-hu/p/16033653.html