javascirpt
的类数组对象能够像数组同样使用for循环遍历,可是却不能调用数组原型链的方法,为了让类数组对象能够像数组对象同样调用push
,pop
等方法,能够将类数组对象转成数组对象:javascript
将类数组对象转换成数组
var args = []; var obj = {0:"www",1:"jianshu",2:"com",length:3}; for (var i = 0; i < obj.length; i++) { args.push(obj[i]); } console.log(args); //["www","jianshu","com"] //等价于如下的写法 console.log([].slice.call(obj)); //["www","jianshu","com"]
理解[].slice.call(arguments)
的原理,须要明白:css
Array.prototype.slice()
console.log([1,2,3,4,5].slice(0,1)); //[1] console.log([1,2,3,4,5].slice(1,3)); //[2,3] console.log([1,2,3,4,5].slice(3)); //[4,5] console.log([1,2,3,4,5].slice()); //[1,2,3,4,5]
数组的slice(start,end)
方法,返回从start
开始到end
的子数组,若是start
和end
都没有设置,则返回整个数组,这个过程不影响原数组。java
Function.prototype.call()
function func(name, price) { this.name = name; this.price = price; } var food = {name:"apple",price:10}; func.call(food,"orange",15); console.log(food); // {name: "orange", price: 15}
调用call
方法传入的参数比原方法多一个参数,简单来讲,call
方法的做用就是:用call
方法的第一个参数
代替func
方法内部的this
,其余参数为原func
方法的参数。git
slice方法内部实现
为了提升性能,减小一层对原型链的追溯,通常咱们会采用如下的写法
:Array.prototype.slice.call(arguments)