先来看一个问题:

如何理解Array.apply(null, {length:5})的{length:5}?

我测试过
Array.apply(null, {length:5}) //返回[undefined, undefined, undefined, undefined, undefined]

Array.apply(null, [{length:5}])和Array({length:5})返回的结果是一样的,为
[[object Object] {
length: 5
}]

第二、三还能理解!第一种怎么理解?

实际 这个 和 Array 没有任何关系,只是碰巧 使用 Array 时遇到了。

我觉得这个问题应该从 Function.call和 Function.apply 来入手。
这两个 函数的方法 功能都是一样的,都是为了改变 this 的指向。
唯一的区别就是参数不一样,apply的第二个参数必须传入数组。

首先需要有个 函数,定义个 iAmArray;

var iAmArray = function(){
return arguments;
};

这里不用管this,下面是正常调用它的三种方式:

//方便你复制到 Console 中测试,在此再写一遍
var iAmArray = function(){
return arguments;
}; //普通写法
iAmArray(1,2,3);
/*
[1, 2, 3]
*/ //call写法
iAmArray.call(null,1,2,3);
/*
[1, 2, 3]
*/ //apply写法
iAmArray.apply(null,[1,2,3]);
/*
[1, 2, 3]
*/

apply方式调用时,估计是一个小bug,只要是 Object,还有length,它就当作数组处理了,实际和 Array 没有任何关系,任何函数都会这样。

 
//方便你复制到 Console 中测试,在此再写一遍
var iAmArray = function(){
return arguments;
}; var iHaveLength = function(length){
this.length = length || 5;
this[2] = "第三个元素";
}; /*
只要是 Object,还有length,他就当作数组处理了。
*/
iAmArray.apply(null, new iHaveLength());
/*
[undefined, undefined, "第三个元素", undefined, undefined]
*/
iAmArray.apply(null, new iHaveLength(3));
/*
[undefined, undefined, "第三个元素"]
*/

最后总结

然后其实第二个参数只要是个类数组对象就可以了,比如 {length: 5} 就可以看作一个类数组对象,长度是 5,每个元素,比如 v[0] 是 undefined

所以,Array.apply(null, { length: 5}) 相当于
Array(undefined, undefined, undefined, undefined, undefined)

感谢您阅读上海前端培训文章,更多阅读或帮助请点击获取。欢迎评论,谢谢关注!

JavaScript中如何理解如何理解Array.apply(null, {length:5})的更多相关文章

  1. Array.apply(null, {length: 20})和Array(20)的理解

    话说今晚在学习Vue.js教程里:Render函数,这一章节是发现了一个问题,就是利用下面的这个render函数可以渲染20个重复的段落: render: function (createElemen ...

  2. Array.apply(null, {length: 2}) 的理解

    // apply 的第二参数通常是数组 但是也可以传递类数组对象{length: 2}console.log(Array.apply(null, {length: 2})) // [undefined ...

  3. 完全解析Array.apply(null, { length: 1000 })

    Array.apply(null, { length: 1000 }) 点击打开视频讲解更加详细 在阅读VueJS教程时有这么段demo code: render: function (createE ...

  4. Array.apply(null,{length:20})与new Array(20)的区别

    Array.apply(null,{length:20}) 这句代码的实际意义:创建长度为20的一个数组,但并非空数组. 跟new Array(20)的区别在于,前一种创建方式,得到的数组中的每一个元 ...

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

    Array.apply(null, { length: 5 }) 和 Array(5)有什么不同 注意:ES5,apply函数的第二个参数除了可以是数组外,还可以是类数组对象 // 类转成真正的数组 ...

  6. Array.apply(null,{length:6}).map()

    map定义和方法 map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值. map()方法按照原始数组元素顺序依次处理元素. 注意: map不会对空数组进行检测 map不会改变原始 ...

  7. javascript 中的继承实现, call,apply,prototype,构造函数

    javascript中继承可以通过call.apply.protoperty实现 1.call call的含义: foo.call(thisObject, args...) 表示函数foo调用的时候, ...

  8. javascript中的稀疏数组(sparse array)和密集数组

    学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...

  9. JavaScript中判断对象是否属于Array类型的4种方法及其背后的原理与局限性

    前言 毫无疑问,Array.isArray是现如今JavaScript中判断对象是否属于Array类型的首选,但是我认为了解本文其余的方法及其背后的原理与局限性也是很有必要的,因为在JavaScrip ...

随机推荐

  1. Make a plan

    1. 思考 2. 学习英语 3. 练习书法 执行周期:2015年1月15日到2016年1月16日. 要像每一次用餐一样对待每一天的计划. 早晨起来,第一件事情是洗漱,然后是思考: 中午时间,第一件事情 ...

  2. FCC中级算法(上)

    在学习FCC中级算法这一块,自己遇到了很多问题,通过RSA也慢慢把问题解决了,发现每一个问题都会有很多的解决思路,因此把自己想到的一些思路记录到这里. 1. Sum All Numbers in a ...

  3. mysql8.0 定时创建分区表记录 每天定时创建下一天的分区表

    因单表数据太大, 需要表按时间分区 分区字段 pay_out_date 按天分 要求自动创建 1. 创建分区表 MYSQL的分区字段,必须包含在主键字段内 常见错误提示 错误提示:#1503 A PR ...

  4. .net core 2.x - docker(for windows)-linux配置及项目+SqlServer发布

    将.net core2.x+sqlserver项目发布到docker.呵呵,操作很自如,如下. 1.罗嗦几句 在跑起来之前浪费了不少时间和精力,起初是将docker for windows的环境转换成 ...

  5. dbus-launch

    NAME dbus-launch - Utility to start a message bus from a shell script dbus-launch - 从shell脚本启动一个消息总线 ...

  6. 课堂小记---JavaScript(3)

    操作DOM var newDOM=DOM元素.cloneNode(参数); 克隆(复制)当前节点,参数默认为false只复制当前节点元素.参数为true时复制当前元素及其后代和所有属性. day06 ...

  7. TextBox使用技巧--转载

    [转载出处注明:http://tieba.baidu.com/p/3677706825] 在使用Visual Basic开发应用程序时,TextBox控件是最常用的(特别对于数据库程序),以下是笔者在 ...

  8. hdu 3478 Catch--二分图判断

    我觉得,给了初始点的话用bfs方便点,没有则dfs ||可能超片面 https://vjudge.net/contest/281085?tdsourcetag=s_pcqq_aiomsg#proble ...

  9. 【web安全】-- springboot实现两次MD5加密

    一.为什么要做两次MD5 客户端MD5:HTTP在网络上是使用明文传输,用户输入的明文密码直接在网络上传输太危险.所以,在客户端先进行一次MD5(明文+固定盐). 服务端:服务端接受到后,也不是直接写 ...

  10. Redis数据库概述

    Redis数据库概述 Redis是什么 redis是一个高性能的key-value存储系统.支持的value类型相对更多,包括string,list,set,zset(sorted set --有序集 ...