[转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢?
这个语法其实不难理解,只是它有些不好看。Array 是 JavaScript 的基本类型,你可以使用 Array.prototype 获取它的属性值,在这里我假设你已经了解了 prototype 的概念。
slice 是 JavaScript 的一个方法,用于选取一个数组的一部分数据,并返回一个新的数组。它可以接收两个参数,startIndex(必选)和 endIndex。因此:
var a = ["a", "b", "c"];
a.slice(1,2);
将返回数组 ["b"],它包含 a 数组从 1 到 2 之间元素。而:
var a = ["a", "b", "c"];
a.slice(1);
则会返回数组 [“b”, “c”],它包含 a 数组从 1 到最后一个元素之间元素。
这里的 a 是个数组,那么变量 arguments 呢?
众所周知,当你调用 JavaScript 的函数的时候,会创建一个隐藏的名为 arguments 的参数,你是不是觉得它就是一个数组呢?答案是否定的,它是一个对象,但是与数组类似。
function f () {
return arguments;
}
f("1", "2") instanceof Array;
这里,你会得到 FALSE 的结果,就是说我们不能像平常一样使用 Array 的函数,例如:push,pop,slice等等这些。但是我想使用这些方法,应该怎么办呢?
我们可以使用 Array.prototype.slice.apply(arguments) 对参数进行转换为真正的 Array。这里我们使用了 JavaScript 的 apply 方法,通过这个方法可以更好的了解 JavaScript 中调用函数的另一种方法。该方法将 slice 应用到第一个参数 arguments 中,并返回一个数组。
Array.prototype.slice.apply(f("1", "2")) instanceof Array;
现在可以看到这里返回 TRUE 的结果!!
PS:在 ECMAScript5 中,我们只需要直接调用 arguments.slice() 即可。
[转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)的更多相关文章
- JavaScript中的Array.prototype.slice.call()方法学习
JavaScript中的Array.prototype.slice.call(arguments)能将有length属性的对象转换为数组(特别注意: 这个对象一定要有length属性). 但有一个例外 ...
- 理解javascript中的Function.prototype.bind
在初学Javascript时,我们也许不需要担心函数绑定的问题,但是当我们需要在另一个函数中保持上下文对象this时,就会遇到相应的问题了,我见过很多人处理这种问题都是先将this赋值给一个变量(比如 ...
- javascript:Array.prototype.slice.call(arguments)
我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js ...
- 理解 JavaScript 中的 Function.prototype.bind
函数绑定(Function binding)很有可能是你在开始使用JavaScript时最少关注的一点,但是当你意识到你需要一个解决方案来解决如何在另一个函数中保持this上下文的时候,你真正需要的其 ...
- 理解Array.prototype.slice.call(arguments)
在很多时候经常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面讲一下其原理: 1.基本讲解 1.在 ...
- Array.prototype.slice.call(arguments) 通俗法理解
Array.prototype.slice.call(arguments,num) 能将具有length属性的对象转成数组. slice 从字面上的意思可以理解为截取数组的一部分. call 从字 ...
- js Array.prototype.slice.call(arguments,0) 理解
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- 关于在函数中使用Array.prototype.slice.call而不是直接用slice
arguments是每个函数在运行的时候自动获得的一个近似数组的对象(除了length外没有其他属性),这个arguments对象其实并不是Array,所以没有slice方法. Array.proto ...
- 详解 Array.prototype.slice.call(arguments)
首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组 在这里我们看第二个方法 1.在JS里Array是一个类 slice是 ...
随机推荐
- 我的vim插件配置
set nocompatible " be iMproved, required filetype off " required " set the runtime pa ...
- Uva439:BFS题目总结
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <cstd ...
- vue自学入门-2(vue创建项目)
本人也是刚学习VUE,边找资料,边学习,边给大家分享.1.创建项目 2.启动项目 3.注意上面和下面全部用cnpm
- fatal error C1083: 无法打开包括文件: “SDKDDKVer.h”: No such file or directory(转)
fatal error C1083: 无法打开包括文件: “SDKDDKVer.h”: No such file or directory 解决办法:(Vs2013中) 项目--右键--属性--配置属 ...
- C# 反编译项目修复
1.反编译测试程序 1>.将测试程序添加到.NET Reflector 2>.选中测试程序后右键选择导出 2.反编译项目修复 1>.问题一 问题现象: base.AutoScaleM ...
- python - class类 (七) 三大特性 - 封装 结尾
封装: # 封装 #第一层,类就是麻袋,本身就是一种封装 #第二层,类中定义私有的,至在类的内部使用,外部无法访问 #第三层,封装在于明确区分内外,使得类实现者可以修改封装内的东西二不影响外部调用者 ...
- 快速创建SpringBoot2.x应用之工具类自动创建web应用、SpringBoot2.x的依赖默认Maven版本
快速创建SpringBoot2.x应用之工具类自动创建web应用简介:使用构建工具自动生成项目基本架构 1.工具自动创建:http://start.spring.io/ 2.访问地址:http://l ...
- 解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
http://www.cnblogs.com/yixius/articles/6971054.html
- linux笔记_day03
1.命令行展开{} mkdir -p a/b/{c,d/e} 2.-v verbose 详细的 3.touch touch - change file timestamps 4.stat 文件 显示 ...
- Dubbo服务容错
当一个服务调用另一个远程服务出现错误时的外观 Dubbo提供了多种容错方案,默认值为failover(重试) 1).Failover Cluster(默认) 失败自动切换,当出现失败,重试其他服务器, ...