将函数的实际参数转换成数组的方法
2016-02-29 10:37
330 查看
实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组。arguments本身不是一个数组,可以说是有length属性的一个对象(类数组对象),所以需要将其变通,改造成一个数组。
我们可以通过slice 方法将 arguments 对象转换成真正的数组。首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组,这里我们看第2个。Array.prototype.slice.call(arguments)能够将arguments转成数组,那么就是arguments.toArray().slice();到这里,是不是就可以说Array.prototype.slice.call(arguments)的过程就是先将传入进来的第一个参数转为数组,再调用slice?
方法一:
方法二:
方法三:
注:一般的函数的 arguments.length 都在 10 以内,方法二有优势; 方法二的代码量上也比第一种少,至少可以减小一点字节
下面附一个例子:
再来看下面这个例子:
最后,附个转成数组的通用函数:
我们可以通过slice 方法将 arguments 对象转换成真正的数组。首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组,这里我们看第2个。Array.prototype.slice.call(arguments)能够将arguments转成数组,那么就是arguments.toArray().slice();到这里,是不是就可以说Array.prototype.slice.call(arguments)的过程就是先将传入进来的第一个参数转为数组,再调用slice?
方法一:
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]); }
注:一般的函数的 arguments.length 都在 10 以内,方法二有优势; 方法二的代码量上也比第一种少,至少可以减小一点字节
下面附一个例子:
function revse() { var args = Array.prototype.slice.call(arguments); newarr = []; for (var i = args.length - 1; i >= 0; i--) { newarr.push(args[i]); } return args; } var s = revse('a', 'b', 'c'); console.log(s);
再来看下面这个例子:
var a = {length: 2, 0 : 'first', 1 : 'second'}; //类数组,有length属性,长度为2,第0个是first,第1个是second console.log(Array.prototype.slice.call(a, 0)); // ["first", "second"],调用数组的slice(0); var a = {length: 2, 0 : 'first', 1 : 'second'}; console.log(Array.prototype.slice.call(a, 1)); //["second"],调用数组的slice(1); var a = {0 : 'first', 1 : 'second'}; //去掉length属性,返回一个空数组 console.log(Array.prototype.slice.call(a, 0)); //[] function test() { console.log(Array.prototype.slice.call(arguments, 0)); //["a", "b", "c"],slice(0) console.log(Array.prototype.slice.call(arguments, 1)); //["b", "c"],slice(1) } test("a", "b", "c");
最后,附个转成数组的通用函数:
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; } }
相关文章推荐
- vim编辑器使用
- MFC CEdit获取编辑框内容
- 梯度、梯度下降,随机梯度下降
- 在Unity3D中基于订阅者模式实现事件机制
- Django model.py表单的默认值 默认允许为空
- UIKit框架(6)控制器view的加载方式
- binder驱动-------之内存映射篇
- 2月份Web服务器份额:排名不变 仅Microsoft份额上扬
- SAS backfeed macro
- SAS Backfeed Process
- mathtype6.0部分符号显示为框的解决方法
- 计算器Pro应用项目源码
- poj 2411 Mondriaan's Dream 【dp】
- 201512读书分享——读《做自己的No.1》“哪一天”是永远不会到来的
- EXT弹出窗口
- Android 使用加速度传感器实现摇一摇功能(带音效、动画效果)
- c++抽象类和纯虚函数 知识整理
- IoC(Inversion of Control)控制反转
- C/C++ 之 left operand must be l-value 错误提示总结
- SAS 代码合集