arguments 是 全部非箭頭函數 內部可訪問的局部變量,全部參數複製給該變量對象。它是實參,真正傳入的參數,而並不是定義函數時的形式參數parameter。它相似於Array,可是除了length和索引屬性不具備其餘數組屬性。經過Object.prototype.toString.call()執行結果咱們能夠看到它是屬於[Object Arguments],這是一個獨立類型Arguments。數組
【圖1】箭頭函數訪問arguments報錯
函數
使用Array的原型方法,Array.prototype.slice.call(arguments),返回新的數組。this
圖2ecma-262規範指出對象類型有length屬性便可,會先建立一個新的Array對象,而後對傳入的對象進行遍歷,因此隨意 this 被賦值爲 arguments 對象是會返回數組的。prototype
【圖2】Array.prototype.slice(start,end)規範
指針
答案是ES6的 擴展運算。ES6引入了rest參數(形式爲…變量名),用於獲取函數的多餘參數,這樣就不須要使用arguments對象了。res參數搭配的變量是一個數組,該變量會將多餘(arguments會獲得所有參數)的參數放入到其中。這樣的好處是(1)可使寫法更簡潔不須要經過Array.prototype.slice去轉換成數組, 在數組要轉換成逗號分隔的參數也只須要進行res參數的反運算——擴展運算;(2)箭頭函數不能訪問arguments,能夠經過res參數獲取函數多餘的參數;(3)args是聲明變量比起arguments函數自帶的會好理解不少。須要注意的是res參數後不可有其餘參數了,不然會報錯。rest
【圖3】arguments和res參數對比
code
callee,該屬性是一個指針,指向擁有這個arguments對象的函數。優勢是若是函數體內有調用該函數的時候(遞歸),解除函數體代碼與函數名的耦合狀態,即便函數被從新命名也不會受到影響。這裏會經常聯想到函數的caller屬性,在代碼中可能會使用 arguments.callee.caller 來獲得函數的調用函數。cdn