類數組對象arguments 和 數組對象

 

arguments並非一個真正的數組,而是一個「相似數組(array-like)」的對象;數組

就像下面的這段輸出,就是典型的類數組對象:函數

{0:12, 1:23}

 

1、類數組 VS 數組

相同點:spa

  • 均可用下標訪問每一個元素
  • 都有length屬性

不一樣點:prototype

  • 數組對象的類型是Array,類數組對象的類型是Object;
  • 類數組對象不能直接調用數組API;
  • 數組遍歷能夠用for in和for循環,類數組只能用for循環遍歷;
複製代碼
function calc(){
    console.log(arguments);        // ["sky", "moon", callee: ƒ, Symbol(Symbol.iterator): ƒ]
    console.log(arguments[0]);    // sky
    console.log(arguments.length);    // 2
    // arguments.pop();   // 報錯,arguments.pop is not a function
}

calc('sky', 'moon');
複製代碼

 

類數組對象轉爲數組對象方法: Array.prototype.slice.call ( arguments );

複製代碼
function calc(){
    var newArr = Array.prototype.slice.call(arguments);
    newArr.pop();    
    console.log(newArr);    // ["sky"]
}

calc('sky', 'moon');
複製代碼

 

2、類數組的用法

一、實現重載(overload):當函數的參數個數不明確時,函數體根據參數的不一樣進行相應處理;

好比咱們要實現:一個參數時,作乘法運算;二個參數時,作加法運算;code

看下面代碼,咱們能夠這樣實現:對象

複製代碼
// 實現重載(overload)
function calc(){
    //傳1個參數,求平方
    if(arguments.length == 1){
        return arguments[0] * arguments[0];  
    }
    //傳2個參數,求和
    else if(arguments.length == 2){
        return arguments[0] + arguments[1];
    }
}
console.log(calc(5));//25
console.log(calc(12,23));//35
複製代碼

 

二、實現遞歸:在函數內部反覆的調用函數自己

首先咱們用最原始的方法,實現數字的疊加blog

複製代碼
function calc(num){
    if(num <= 0){
        return 0;
    }else{
        return num += calc(num - 1);
    }
}

console.log(calc(3));    // 6
複製代碼

 

而後咱們用類數組來實現一樣的功能:遞歸

arguments.callee:返回當前函數自己
複製代碼
function calc(num){
    if(num <= 0){
        return 0;
    }else{
        return num += arguments.callee(num - 1);
    }
}
console.log(calc(3));  // 6
複製代碼

 

下面舉個栗子,來講明這兩種調用的一點小區別:it

若是寫成 return num += calc(num - 1) 會報錯;緣由很簡單,當執行calc = null 後,calc已經不是一個函數;io

可是寫成 return num += arguments.callee(num - 1) 不會報錯;由於arguments.callee指的是「當前函數」,並非「calc」

複製代碼
function calc(num){
    console.log(arguments);
    if(num <= 0){
        return 0;
    }else{
        return num += arguments.callee(num - 1);
        // return num += calc(num - 1);  // 報錯 Uncaught TypeError: calc is not a function
    }
}
var result = calc;
calc = null;
console.log(result(3));
複製代碼

 

注意: arguments.callee的用法在嚴格模式下是不容許的;

Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

複製代碼
"use strict";
function calc(num){
    if(num <= 0){
        return 0;
    }else{
        return num += arguments.callee(num - 1);
    }
}
console.log(calc(3));
相關文章
相關標籤/搜索