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