首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Array.apply(null,{length:99})逻辑解析

01

基础概述

vue 教程中有一段 demo code,如下:

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

于是乎就想,如果是这样子,那么我把这一段代码换成 Array(20) ,变成下面这样:

演化成 JS 代码如下:

控制台输出

按照刚刚的理解,把代码换成这个样子应该是没有问题的。然而打印结果告诉我们刚刚那样子理解应该是不对的, Array.apply(null, { length: 99 })和Array(99) 这两句代码还是有区别的,那么区别是什么?

02

apply 函数方式解析

ES5开始 apply 函数的第二个参数除了可以是数组外,还可以是类数组对象(即包含length属性,且length属性值是个数字的对象)。对象就是一个类数组对象,因为没有初始化下标0,1的值,所以获取0,1下标的值得到的都是undefined。

这样表达式 Array.apply(null, { length: 2}) 就等价于如下代码:

这样就很容易知道该表达式的值是一个长度为2,且每个元素值都被初赋值为 undefined 的数组(注意此时不是数组元素没有初始化,而是初始化成undefined,这就是跟 Array(2) 的区别)

为啥非要写那么复杂呢?

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

该表达式还可以修改成:

使用 ES6 API 创建初始化数组:

03

Array函数 + 一个数字参数方式解析

直接调用Array函数跟new方式调用是等价的,即

表示创建一个长度为 99 的数组,注意该数组的元素并没有被初始化([empty ×99]),即

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230223A07UX000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券