JS函數裏的arguments

arguments的面貌

在javascript中全部的函數內部都包含了一個隱藏的變量叫arguments;
它存放着全部傳遞到這個函數中的參數;
那麼咱們打開實例看看arguments的輸出形式javascript


(function fn(){
    console.log(arguments)
})(1,2,3,4)

圖片描述

結果好像是相似數組的形式打印在控制檯,相信大多數人包括我看到這種輸出就會認爲arguments是一個數組,那麼既然是數組就能夠用數組的一些方法了吧,再看下一個例子;java


(function fn(){
    arguments.push(5)
    console.log(arguments)
})(1,2,3,4)

圖片描述

結果報錯了- -!;(在項目中我就是踩到了這個坑);
那咱們就會有一個疑惑了,既然是數組爲何不能用push方法呢,其餘的像pop,slice也不行麼,是的,都不行,雖然arguments也能經過下標的形式獲取到對應位置的參數,當本質上不算是真正的數組;數組


咱們經過instanceof打印看看它是否是Array的孩子app

(function fn(){
    console.log(arguments instanceof Array)
})()

圖片描述

果不其然真不是數組,那麼咱們就會聯想到它就是個對象了;
雖然它也能用for循環遍歷到裏面的參數,但把它轉爲真正的數組纔是更好的選擇;函數


轉化爲數組

轉化的方法有不少,對象冒充的方式傳遞給Array.prototype或遍歷push到空數組或傳遞給另外一個函數等等。。均可以完成,下面簡單介紹幾個轉化的方法,遍歷push到空數組的方法就不細講了;性能

spa

(function fn(){
    var arr = Array.prototype.slice.call(arguments)
    arr.push(5)
    console.log(arr)
})(1,2,3,4)

圖片描述

這種轉化方式比較慢,在性能很差的狀況下不推薦這種寫法;prototype

code

function fn() {
    fnArr.apply(null, arguments);
}
function fnArr(a,b,c,d) {
    ···
}

我的推薦這種作法;對象


總之方法不少,你們用本身習慣的就好;第一次寫文章,雖然寫的很少,純當練練手,只但願你們能在項目的過程中不要誤踩了arguments的坑,^ ^

相關文章
相關標籤/搜索