[].slice.call()的思考和擴展

1.[].slice.call()的思考

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};
let arr1 = [].slice.call(arrayLike);
arr1 //['a','b','c']json

分析:
[].slice是一個函數,函數能夠調用call方法.
經過call(),認arrayLike具備數組slice方法,而數組slice()會返回數組,間接認arrayLike調用slice()後最終返回數組
假如認call()帶上參數如:
let arr2 = [].slice.call(arrayLike, 1, 2); //['b']
與下面這行代碼運行結果是同樣
let arr3 = ['a','b','c'].slice(1,2) //['b']
能夠發現call()的第二參數和第三參數是arrayLike調用slice()時傳給slice()的參數數組

那爲何arr1結果爲['a','b','c'],而不是['a','b']或其它呢?
運行下面代碼:
let arr4 = [].slice.call(arrayLike, 0, 0);  //['a','b','c']
let arr5 = [].slice.call(arrayLike)  //['a','b','c']
經過對比arr4和arr5發現,若是call()不傳第二,三參數.js默認都是0,因此會返回['a','b','c']函數

2.[].slice.call()的擴展

* [].join.call(arrayLike) // a,b,c
   結果獲得字符串"a,b,c".由於數組join()就是返回字符串.也能夠傳參
  [].join.call(arrayLike, '|') // a|b|c測試

  //push(元素)是往數組尾部插入元素
* let arr6 = [].push.call(arrayLike, 'd'); //4
  arr6表示arrayLike的長度length
  而arrayLike變爲 {0: "a", 1: "b", 2: "c", 3: "d", length: 4}.net

* 經過如下四個函數,應該能夠間接實現對象作成隊列效果.本人暫沒詳細測試.有機會再深刻下
    [].push.call(),
    [].pop.call(),
    [].unshift.call(),
    [].shfit.call()對象

* [].sort.call() 能夠認json對象排序.
    let arrayLike1 = {
        '0': 'c',
        '1': 'a',
        '2': 'b',
        length: 3
    };
    let arr7 = [].sort.call(arrayLike1); //{0: "a", 1: "b", 2: "c", length: 3}blog

* [].reverse.call() 仍是以arrayLike1爲例
    let arr8 = [].reverse.call(arrayLike1); //{0: "b", 1: "a", 2: "c", length: 3}排序

* [].concat.call() 傳個參數比較明白
    let arr9 = [].concat.call(arrayLike1, 'd');
    結果爲:[{'0': 'c','1': 'a','2': 'b',length: 3}, 'd']隊列

* [].splice.call()
    let arr10 = [].splice.call(arrayLike1, 1, 1);
    arr10結果爲 ['a']表示要刪除的元素
    arrayLike1結果爲 {0: "c", 1: "b", length: 2}字符串

* [].indexOf.call() 
    let arr11 = [].indexOf.call(arrayLike1, 'a') // -1
    let arr12 = [].indexOf.call(arrayLike1, 'a') // 1

* [].lastIndexOf.call類上

轉載於:

https://blog.csdn.net/u010841017/article/details/78990257

相關文章
相關標籤/搜索