arguments和Array.prototype.slice.call(arguments,0);

原创 2015年11月19日 21:24:05
下列错误的代码:原因是arguments并不是真正的数组。所以并不能直接用forEach来,可以把arguments转换成数组。
function useArguments() {
    var sum = 0;
     arguments.forEach(function(e){
          sum+=e;
     });
     // for(var i=0;i<arguments.length;i++){
     //      sum=sum+arguments[i];
     // }
       return sum;
}
var s = useArguments(1, 2, 3, 4);
console.log(s);

或者改成
function useArguments() {
    var sum = 0;
    var args = Array.prototype.slice.call(arguments,0);
     args.forEach(function(e){
          sum+=e;
     });
       return sum;
}
var s = useArguments(1, 2, 3, 4);

题目描述

实现函数 callIt,调用之后满足如下条件
1、返回的结果为调用 fn 之后的结果
2、fn 的调用参数为 callIt 的第一个参数之后的全部参数
输入例子:
var a = 1; var b = 2; var test = function (first, second) { return first === a && second === b;}; callIt(test, a, b);

function callIt(fn) {
     var args = Array.prototype.slice.call(arguments,1);
    var s = fn.apply(null,args);
    return s;
}


function callIt(fn) {
    return fn.apply(this,[].slice.call(arguments,1));
}


关于Array.prototype.slice.call(arguments,1);的解释

因为arguments并不是真正的数组对象,只是与数组类似而已,所以它并没有slice这个方法,
而Array.prototype.slice.call(arguments, 1)可以理解成是让arguments转换成一个数组对象,让arguments具有slice()方法。
要是直接写arguments.slice(1)会报错

Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组;

var a={length:3,0:'abc',1:'def',2:'ghi'};
console.log(Array.prototype.slice.call(a));//  ["abc", "def",'ghi']
var a={length:0};
console.log(Array.prototype.slice.call(a));//  []
var a={length:3};
console.log(Array.prototype.slice.call(a));//  [undefined, undefined, undefined]


Array.prototype.slice.call(arguments).slice(1)

 


在很多的例子里面都会看到以上的调用,开始看了很久也不明白是什么意思,最近研究了一下,终于明白了。
要讨论这样的调用方式,其实只有一个目的,
arguments (typeof arguments它是一个object ),而在这里调用的是array的slice 方法.
array.prototype.slice 是原型slice 方法,
call()查看帮助文档会发现,会把call(thisObject)做为当前上下文使用,(也可以简单thisObject可以调用Array的方法。)
slice()返回一个数组的一段

  1. Array.prototype.slice.call(arguments,0);//将参数转换成真正的数组  
call的作用是改变this的指向,就相当于arguments调用了,slice这个方法。0就是start=0,end没指定,所以返回整个arguments,这个时候就转换成数组了。
这里有一个问题
  1. arguments.slice(0)//为什么不直接这样呢,非要用call改下this的指向就可以了?见下文的分析  
引用: 能用slice方法的,只要有length属性就行。虽然arguments有length属性,但是没有slice方法,所以 呢,Array.prototype.slice()执行的时候,Array.prototype已经被call改成arguments了,因为满足 slice执行的条件(有length属性),所以没有报错。感觉有点hack的意思了。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Array.prototype.slice.call()详解及转换数组的方法

在翻看以前公司留下的项目时,看到一段代码。 var $show=$imgList.filter(':visible'); var showPics=Array.prototype.slice.ca...
  • bowen11233
  • bowen11233
  • 2016年11月22日 15:41
  • 3220

浅谈arguments与arguments的妙用

1.每个函数都有一个arguments属性,表示函数的实参集合,这里的实参是重点,就是执行函数时实际传入的参数的集合。 2.arguments不是数组而是一个对象,但它和数组很相似,所以通常称为...
  • guofang9410
  • guofang9410
  • 2017年04月08日 18:10
  • 84

js中arguments的用法

1、在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例。可以通过如下代码得以证...
  • chenpeng19910926
  • chenpeng19910926
  • 2016年03月10日 15:40
  • 2689

JS中arguments对象详解

作者 : Windstep 出处: http://www.cnblogs.com/lwbqqyumidi/archive/2012/12/03/2799833.html1、在JavaS...
  • babybk
  • babybk
  • 2016年04月28日 11:28
  • 1770

shell脚本if判断语句报错[: too many arguments的两种原因

shell脚本,if判断语句报错[: too many arguments 我遇到过两种情况: 1、第一中情况就是网上大家说的,字符串变量中可能存在空格,shell解析时将其认为是多个参数,再进行判断...
  • huangjin0507
  • huangjin0507
  • 2015年04月15日 15:47
  • 6536

简析arguments与arguments转化成数组的方法

arguments是什么?arguments 就是函数内一个內建对象,它包含函数接收到的所有变量。...
  • Milk_Brother
  • Milk_Brother
  • 2017年04月04日 13:52
  • 668

js的arguments到底是什么?

类数组对象:arguments
  • qq_16339527
  • qq_16339527
  • 2016年11月19日 16:38
  • 7258

JavaScript中arguments对象的使用方法

arguments对象     arguments对象对应于传递给函数的参数,我们可以使用arguments对象在函数内部引用函数的参数。此对象中包含了传递给函数的每个参数的条目,与数组的方法类似,a...
  • crazyorange_shen
  • crazyorange_shen
  • 2017年04月01日 15:34
  • 217

温故而知新: JavaScript arguments 对象详解

温故而知新: JavaScript arguments 对象详解
  • cc18868876837
  • cc18868876837
  • 2016年11月29日 14:51
  • 1686

MySql绿色版安装出现的问题总结

MySql绿色版安装出现的问题总结: (1)下载安装包链接 (2)一定要配环境变量: 在path中添加“mysql安装路径\bin;” (3)修改mysql安装路径下的my-d...
  • ytf523
  • ytf523
  • 2016年03月21日 23:51
  • 506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:arguments和Array.prototype.slice.call(arguments,0);
举报原因:
原因补充:

(最多只允许输入30个字)