[].slice.call(arguments)原理解析

javascirpt的類數組對象能夠像數組同樣使用for循環遍歷,可是卻不能調用數組原型鏈的方法,爲了讓類數組對象能夠像數組對象同樣調用pushpop等方法,能夠將類數組對象轉成數組對象: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

  • slice()方法的做用
  • call()方法的做用
  • slice()方法的內部實現
  • 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的子數組,若是startend都沒有設置,則返回整個數組,這個過程不影響原數組。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方法內部實現
    slice方法內部實現,V8源碼第587行,其基本原理就相似咱們上面開頭寫的for循環遍歷原數組,根據start和end的值再複製一份到新數組並返回。因此當咱們使用[].slice.call(arguments),slice方法內部的this就會被替換成arguments,並循環遍歷arguments,複製到新數組返回,這樣就獲得了一個複製arguments類數組的數組對象。
  • 爲了提升性能,減小一層對原型鏈的追溯,通常咱們會採用如下的寫法
Array.prototype.slice.call(arguments)
相關文章
相關標籤/搜索