JavaScript中如何理解如何理解Array.apply(null, {length:5})
先来看一个问题:
如何理解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})的更多相关文章
- Array.apply(null, {length: 20})和Array(20)的理解
话说今晚在学习Vue.js教程里:Render函数,这一章节是发现了一个问题,就是利用下面的这个render函数可以渲染20个重复的段落: render: function (createElemen ...
- Array.apply(null, {length: 2}) 的理解
// apply 的第二参数通常是数组 但是也可以传递类数组对象{length: 2}console.log(Array.apply(null, {length: 2})) // [undefined ...
- 完全解析Array.apply(null, { length: 1000 })
Array.apply(null, { length: 1000 }) 点击打开视频讲解更加详细 在阅读VueJS教程时有这么段demo code: render: function (createE ...
- Array.apply(null,{length:20})与new Array(20)的区别
Array.apply(null,{length:20}) 这句代码的实际意义:创建长度为20的一个数组,但并非空数组. 跟new Array(20)的区别在于,前一种创建方式,得到的数组中的每一个元 ...
- 分析Array.apply(null, { length: 5 })
Array.apply(null, { length: 5 }) 和 Array(5)有什么不同 注意:ES5,apply函数的第二个参数除了可以是数组外,还可以是类数组对象 // 类转成真正的数组 ...
- Array.apply(null,{length:6}).map()
map定义和方法 map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值. map()方法按照原始数组元素顺序依次处理元素. 注意: map不会对空数组进行检测 map不会改变原始 ...
- javascript 中的继承实现, call,apply,prototype,构造函数
javascript中继承可以通过call.apply.protoperty实现 1.call call的含义: foo.call(thisObject, args...) 表示函数foo调用的时候, ...
- javascript中的稀疏数组(sparse array)和密集数组
学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...
- JavaScript中判断对象是否属于Array类型的4种方法及其背后的原理与局限性
前言 毫无疑问,Array.isArray是现如今JavaScript中判断对象是否属于Array类型的首选,但是我认为了解本文其余的方法及其背后的原理与局限性也是很有必要的,因为在JavaScrip ...
随机推荐
- Lesson 1-1
1.1常见难记的几种运算符 1.1.1 除运算 ‘/’ 除运算的结果为小数,即浮点数. >>> 10/3 3.3333333333333335 >>> 10/2 5 ...
- 马拉车算法——边界拓展时加限制hdu4513
#include<bits/stdc++.h> using namespace std; #define maxn 500005 int n,p[maxn],s[maxn],s_new[m ...
- Mybatis面试集合(转)
Mybatis技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用Mybatis的文章,所以,一些参数使用细节略掉了,我们的目标是介绍 ...
- linux命令详解之df命令
df命令概述df命令作用是列出文件系统的整体磁盘空间使用情况.可以用来查看磁盘已被使用多少空间和还剩余多少空间. df命令显示系统中包含每个文件名参数的磁盘使用情况,如果没有文件名参数,则显示所有当前 ...
- eclipse如何更换工作空间
关于工作空间的更换,小生也操作较少,今天做个记录并分享给大家. 1.找到文件——更换工作空间——其他 2.选择自己要更换的工作空间点击确定即可.
- .net core 利用日志查看ef生成的SQL语句
EF Core 没有直接提供像 EF6 那样方便的在日志中记录最终生成的 SQL 的功能,可以通过官方提供的日志记录(Microsoft.Extensions.Logging)实现. 一. 使用 Mi ...
- 从Jensen不等式到Minkowski不等式
整理即证 参考资料: [1].琴生不等式及其加权形式的证明.Balbooa.https://blog.csdn.net/balbooa/article/details/79357839.2018.2 ...
- Debian+Django+uWsgi+nginx+mysql+celery
下载系统各种依赖 nano /etc/apt/sources.list 在Debian中使用apt-get安装软件包时经常会提示让你插入netinst的光盘: Media change: please ...
- web页面和小程序页面实现瀑布流效果
小程序实现瀑布流效果,和web页面差不多,都要经过以下步骤: 1).加载图片,获取图片的宽高度: 2).根据页面需要显示几列计算每列的宽度: 3).根据图片真实宽度和每列的宽度比,计算出图片需要显示的 ...
- King 差分约束 判负环
给出n个不等式 给出四个参数第一个数i可以代表序列的第几项,然后给出n,这样前面两个数就可以描述为ai+a(i+1)+...a(i+n),即从i到n的连续和,再给出一个符号和一个ki当符号为gt代表‘ ...