js中的arguments、Array.prototype.slice.call()
类数组对象:arguments
js把传入到这个函数的全部参数存储在arguments里面,其实arguments也是个对象,而且是一个特殊的对象,它的属性名是按照传入参数的序列来的,第1个参数的属性名是’0’,第2个参数的属性名是’1’,以此类推,并且它还有length属性,存储的是当前传入函数参数的个数,很多时候我们把这种对象叫做类数组对象。
数组比类数组对象多了很多其他的方法,类数组对象只是长得像数组而已。
在arguments对象里面,数据是这样存储的:
- {
- length: 4,
- '0': 'zero',
- '1': 'one',
- '2': 'two',
- '3': 'three'
- }
Array.prototype.slice.call()
在Array类中有一个方法叫做slice,用来截取数组中的一部分,用法是:
- arrayObj.slice(start, [end])
call的用法是:
- call([thisObj[,arg1[arg2[[argN]]]]])
- //thisObj是一个对象的方法 ,arrg1~argN是参数
那么Array.prototype.slice.call()的意思就是说把调用方法的参数截取出来。
- Array.prototype.slice.call(arguments,1);
为什么要用Array.prototype.slice,而不是直接引用?
因为Array是一个类,不能直接引用,需要获取原型后才能使用。
如果要直接引用,需要实例化Array,如下:
var array = new Array();
array.slice();
- function test(a,b,c,d)
- {
- var arg = Array.prototype.slice.call(arguments,1);
- alert(arg);
- }
- test("a","b","c","d"); //b,c,d
多次用到 Array.prototype.slice.call(arguments, 1),不就是等于 arguments.slice(1) 吗?像前者那样写具体的好处是什么?为什么要这样写?
因为arguments并不是真正的数组对象,只是与数组类似而已,所以它并没有slice这个方法,而
Array.prototype.slice.call(arguments, 1)
可以理解成是让arguments转换成一个数组对象,让arguments具有slice()方法。要是直接写arguments.slice(1)会报错。
总的来说Array.prototype.slice.call(arguments)
能将具有length属性的对象转成数组。
将函数的实际参数转换为数组的方法
方法一:
- var args = Array.prototype.slice.call(arguments);
方法二:
- var args = [].slice.call(arguments, 0);
方法三:
- var args = [];
- for (var i = 1; i < arguments.length; i++) {
- args.push(arguments[i]);
- }
最后,附个转成数组的通用函数
- var toArray = function(s){
- try{
- return Array.prototype.slice.call(s);
- } catch(e){
- var arr = [];
- for(var i = 0,len = s.length; i < len; i++){
- //arr.push(s[i]);
- arr[i] = s[i]; //据说这样比push快
- }
- return arr;
- }
- }
js中的arguments、Array.prototype.slice.call()的更多相关文章
- js基础进阶--关于Array.prototype.slice.call(arguments) 的思考
欢迎访问我的个人博客:http://www.xiaolongwu.cn Array.prototype.slice.call(arguments)的作用为:强制转化arguments为数组格式,一般出 ...
- 观V8源码中的array.js,解析 Array.prototype.slice为什么能将类数组对象转为真正的数组?
在官方的解释中,如[mdn] The slice() method returns a shallow copy of a portion of an array into a new array o ...
- 关于在函数中使用Array.prototype.slice.call而不是直接用slice
arguments是每个函数在运行的时候自动获得的一个近似数组的对象(除了length外没有其他属性),这个arguments对象其实并不是Array,所以没有slice方法. Array.proto ...
- js Array.prototype.slice.call(arguments,0) 理解
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...
- 【笔记】js Array.prototype.slice.call(arguments) 将函数的参数转换为数组方法的见解
我们知道函数里面的参数实际上是一个以数组形式储存的对象 但它并非一个数组 如果我们要将它转换为数组可以调用Array.prototype.slice() 这个方法 分析一下这个方法: Array.pr ...
- 详解 Array.prototype.slice.call(arguments)
首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组 在这里我们看第二个方法 1.在JS里Array是一个类 slice是 ...
- Array.prototype.slice.call(arguments) 类数组转成真正的数组
Array.prototype.slice.call(arguments) 我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数 ...
- 转对象(含length属性)成数组Array.prototype.slice.call(arguments)
我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js ...
随机推荐
- CSS - div居中在屏幕中(水平居中 + 垂直居中)
方法一代码 <div> <h1>404 Not Found.</h1> </div> <style> div { text-align: c ...
- opencv:图像的算术操作
前提:输入图像的大小和类型必须一致 越界处理: 大于255,则会减去255 小于0,则等于0 基本计算,加减乘除 #include <opencv2/opencv.hpp> #includ ...
- JAVA(4)之关于项目部署在tomcat
关于项目部署的报错问题一直是找不到项目 在重装几次tomcat9和tomcat7后找到了原因,关键原因是访问路径不正确,项目名拼写错误. 排除问题的思路如下(控制变量法) 工作方法和思路 列出步骤,从 ...
- spring与jdbc,mybatis的结合
关键点在于把DataSource(数据源)配置到spring容器中,通过数据源获取数据库连接对象 数据库连接池(pool):管理数据库连接对象 四种数据源: 1)<!-- 基于jdk的规范数据源 ...
- 吴裕雄 python 神经网络TensorFlow实现LeNet模型处理手写数字识别MNIST数据集
import tensorflow as tf tf.reset_default_graph() # 配置神经网络的参数 INPUT_NODE = 784 OUTPUT_NODE = 10 IMAGE ...
- 文本编辑器EditPlus的安装
- ztree-编辑节点(树节点添加,删除,修改)
<!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - addNodes / editName / rem ...
- Android学习08
PopupWindow PopupWindow用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 1.弹出框的布局:画一个PopupWindow的 ...
- MySQL:ALTER COLUMN、MODIFY COLUMN 和 CHANGE COLUMN
ALTER COLUMN.MODIFY COLUMN 和 CHANGE COLUMN 语句修改列: ALTER COLUMN:改变.删除列的默认值(备注:列的默认值存储在 .frm 文件中). 这个语 ...
- netty(二)---客户端连接
概述 先了解一下 netty 大概框架图 ,可以看到客户端的创建和服务端最大的区别 - 服务端传入两个 EventLoopGroup,客户端传入一个 EventLoopGroup - channel ...