将函数的实际参数转换成数组的方法

实际参数在函数中我们可以使用 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?

方法一:

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;
    }
}
时间: 2024-10-27 06:56:02

将函数的实际参数转换成数组的方法的相关文章

将函数的实际参数转换成数组的方法,习惯用Array.prototype.slice.call(arguments)

实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组. 我们可以通过数组的 slice 方法将 arguments 对象转换成真正的数组. 方法一:通过Array.prototype属性调用slice方法 var args = Array.prototype.slice.call(arguments); Array 本身是没有 slice 方法,它的方法在 Arr

将arguments转换成数组的方法

将函数里的arguments,转换成一个真正的数组的方法,arguments是个类数组,除了有实参所组成的类似数组以外,还有自己的属性,如callee,arguments.callee就是当前正在执行的这个函数的引用,它只在函数执行时才存在.因为在函数开始执行时,才会自动创建第一个变量arguments对象. 一.arguments这个类数组 它将实参以数组的形式保存着,还可以像数组一样访问实参,如arguments[0]; 它也有自己独特的属性,如:callee, 它的长度是实参的个数.补充:

php最简单把xml转换成数组的方法

$xml= $this->getToken($url); $rs =simplexml_load_string (urldecode( $xml) ) ; $rs = json_decode( json_encode($rs) , true); json相关编码问题:http://www.nowamagic.net/php/php_JsonDecode.php

javascript 中 split 函数分割字符串成数组

分割字符串成数组的方法有很多,不过使用最多的还是split函数 <script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new Array(); //定义一数组 strs=str.split(","); //字符分割 for (i=0;i<strs.length ;i++ ) { document.write(strs[i]+"<b

【笔记】js Array.prototype.slice.call(arguments) 将函数的参数转换为数组方法的见解

我们知道函数里面的参数实际上是一个以数组形式储存的对象 但它并非一个数组 如果我们要将它转换为数组可以调用Array.prototype.slice() 这个方法 分析一下这个方法: Array.prototype:Array其实一个类名,但是调用类里面的方法只能够通过类的实例对象调用所以这里用了  Array.prototype 通过它自身的原型对象调用 其次是slice():这个是Array类里面的一个方法功能是截取数组里面的某一部分内容,它接收两个参数slice('数组下标起始位置','数

php如何遍历多维的stdClass Object 对象,php的转换成数组的函数只能转换外面一丛数组

php如何遍历多维的stdClass Object 对象,php的转换成数组的函数只能转换外面一丛数组 (2012-09-10 19:58:49) 标签: 杂谈 分类: 网页基础知识 function objtoarr($obj){$ret = array();foreach($obj as $key =>$value){if(gettype($value) == 'array' || gettype($value) == 'object'){$ret[$key] = objtoarr($val

黄聪:PHP字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、切割成数组等)

一.字符串替换 str_replace("iwind", "kiki", "i love iwind, iwind said"); 将输出 "i love kiki, kiki said" str_replace(find,replace,string,count)参数 描述 find 必需.规定要查找的值. replace 必需.规定替换 find 中的值的值. string 必需.规定被搜索的字符串. count 可选.一

把类似数组结构的数据转成数组的几种方式

例如 : 将函数的 arguments参数转成数组格式 es5: [].slice.call(arguments) Array.prototype.slice.call(arguments) es6: Array.from(arguments)      能将具有 Iterator接口的数据格式(Set, Map)转成真正的数组 [...arguments]  也能将arguments转成数组

Google的分布式计算模型Map Reduce map函数将输入分割成key/value对

http://www.nowamagic.net/librarys/veda/detail/1768 上一篇 大规模分布式数据处理平台Hadoop的介绍 中提到了Google的分布式计算模型Map Reduce,这里再单独拿出来了解一下. 并行计算简介 计算机的早期阶段,程序都是serial(连续的),类似于批处理程序. 并行计算的程序中,进程将一个任务分割成多个部分parts,每个“部分“都是能够并行处理的,每个“部分”可以同时运行在不同的cpu上,这些cpus可以是同一台机器上,也可以是通过