浅谈[].slice.call(arguments, 1)

今天在跟踪调试项目的代码时,发现在一个function中用到了这么一段[].slice.call(arguments, 1) 的代码。心中便起了疑惑,对于slice 和 call 的方法,倒是不怎么陌生,解析了下上面的那段代码,就是为了获取arguments 从1 开始到结尾的所有元素。只是觉得奇怪为什么不直接用 arguments.slice(1) 这样去使用呢?(PS:JS当初是啃了《JavaScript权威指南》,可是后面也没有怎么深入去用,最近转来开发HTML5 Game 时,才发现好多基础的东西都忘记的差不多了,汗!!!)。于是,就自己先做了下面的测试:

测试1 先打印下 arguments

var a = function(f){
console.log(arguments);
}

a('show', [12,3,4,55]);

 

结果:['show', Array[4]]

测试2

var a = function(f){
console.log([].slice.call(arguments, 1));
}

a('show', [12,3,4,55]);

 

结果:[Array[4]]
测试3

var a = function(f){
console.log(arguments.slice(1));
}

a('show', [12,3,4,55]);

结果:报错!!! **arguments.slice is not a function(...)**
此时就心中产生了疑惑了,为啥在测试一中打印出来的arguments 是个数组的东西啊,为啥会提示没有slice这个方法呢?带着疑问我去请教下了队伍里的大牛,得到了下面的答案:

测试4

(function() {
console.log(arguments instanceof Array)
})();

结果:false
arguments 并非数组,只是访问单个参数的方式与访问数组元素的方式相同。因此在使用slice方法的时候,需要用类似[].slice.call(arguments, 1) 的这种方式去调用,至此,关于这条语句引发的思考也就此结束了

 

 

 

 

 

.

上一篇:如何在Google App Engine上将参数传递给python cron任务?


下一篇:13、shell printf命令:格式化输出语句