ITPub博客

首页 > IT职业 > IT图书 > 分析Array.apply(null, { length: 20 })

分析Array.apply(null, { length: 20 })

IT图书 作者:kissxun 时间:2021-09-09 10:41:39 0 删除 编辑
Demo code:
render: function (createElement) {
  return createElement('div',
    Array.apply(null, { length: 20 }).map(function () {
      return createElement('p', 'hi')
    })
  )
}

其中这个表达式Array.apply(null, { length: 20 })有点让人费解。第一感觉这个表达式就是为了创建一个长度为20的数组,但表达式Array(20)也可以实现这个功能啊,为啥非要写那么复杂呢?看来情况没那么简单。。。

来自MDN描述):

It is not called for missing elements of the array (that is, indexes that have never been set, which have been deleted or which have never been assigned a value).

即map函数并不会遍历数组中没有初始化或者被delete的元素(有相同限制还有forEach, reduce方法)。OK,疑问到此终于真相大白了:写这么“复杂”就是为了实现:创建一个长度为20,且每个元素都被初始化的数组。这样map方法就可以循环20次了。

// 被初始化的数组
Array.apply(null, {length: 20}).map(function(val, index){
   console.log(index); // 循环20次
});
// 未被初始化的数组
Array(20).map(function(val, index){
   console.log(index); // 不会被执行
});

其实这已经是实现该功能很简洁的写法了,不得不佩服vuejs文档作者的基础功力。

  1. 如果为了少写几个字的话还可以把该表达式修改成:
    Array.apply(null, Array(20)); // 第二个参数用Array(20)代替{length: 20}
  2. 还可以使用ES6 API更直观表达意图:

    // 方法1:
    Array.from({length: 20})
    
    // 方法2
    Array(20).fill(null)
  3. Array.prototype.map方法

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2766/viewspace-2825191/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-16

最新文章