javascript
对JavaScript内置对象arguments的一些见解
深入理解JavaScript內置對象arguments
這兩天有伙伴問到我關于arguments的問題,使我產生了一種arguments對象容易被學習者忽略的想法,想分享一下自己對于JavaScript內置對象arguments的一些見解
(閱讀提醒:本文適合對JavaScript中arguments對象 || es6 rest參數了解不多的小伙伴)。
說明:
??? 與很多語言不同,JavaScript函數可以使用任意數量的參數,調用時傳遞任意數量的參數。arguments是一個對應于傳遞給函數的參數的類數組對象,是所有非箭頭函數(es6的一種函數)中都可用的局部變量,我們可以使用arguments在函數中引用函數的參數。
arguments是什么類型?
我們先寫個方法驗證一下:
function test() {console.log(arguments)}test(1, 2, 3)運行結果:
看起來arguments對象有點像Array類型,其實不是的,因為它除了length屬性和索引元素之外沒有任何Array屬性,比如Array類型應該有的pop()、push()等它都沒有。所以arguments對象不是一個Array,只是類似于Array。
arguments轉成數組形式:
代碼比較少,直接在控制臺輸入然后回車即可:
function test() {var args = Array.prototype.slice.call(arguments)console.log(Object.prototype.toString.call(args))}test(1, 2, 3)結果:
可見arguments被轉成了數組類型,此時數組的方法已經可對args使用,在此就不測試了。
注:代碼中使用的判斷類型的代碼是本人目前知道的最準確的方法,可以用于判斷引用數據類型的。
arguments對象的callee屬性:
說明:它可以用于引用該函數的函數體內當前正在執行的函數。這在函數的名稱是未知時很有用,例如在沒有名稱的函數表達式 (也稱為“匿名函數”)內。
例子(返回數組各項階乘后的數組):
function factorial (n) {return !(n > 1) ? 1 : factorial(n - 1) * n;}[1,2,3,4,5].map(factorial);代碼會返回[1, 2, 6, 24, 120]
但是假設map中的函數為匿名函數,我們應該怎么寫?也就是三目運算符后的factorial()函數應該寫什么才能調用函數自身?這時候就要用到arguments.callee屬性。
[1,2,3,4,5].map(function (n) {return !(n > 1) ? 1 : arguments.callee(n - 1) * n;});運行結果一樣。使用rest參數(es6)
說明:es6中引入了rest參數,它表示一個未知數量的參數作為函數中的一個數組,不僅將額外的參數表示為數組,還解決了arguments對象的許多問題。
測試:
function test(...rest) {console.log(rest)}test(1, 2, 3)結果:
可見傳入的參數變成了數組類型,此時數組的方法可以對rest使用,比如pop()、push()、split()等等。
怎么判斷是數組類型的呢?
打印出的rest中有個__proto__屬性,這個屬性中包含很多數組方法,也就是指向了Array.prototype所指向的對象,prototype相關知識具體可以參考本人其他關于prototype的文章。
或者還是使用console.log(Object.prototype.toString.call(rest)),前邊這串代碼沒寫錯的話輸出的會是[Object Array]
將多余的參數轉為數組類型:
function test(num1, num2, ...rest) {console.log(num1)console.log(num2)console.log(rest)}test(1, 2, 3, 4)運行結果:
注:...rest必須寫在參數的最后邊,否則會報錯,想知道報什么錯的話建議自己試試,實踐是檢驗真理的唯一標準...
完結~~期待下次分享~~
總結
以上是生活随笔為你收集整理的对JavaScript内置对象arguments的一些见解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 征婚交友宣传文案30句
- 下一篇: 愿自己越来越好的说说238个