咱們常常能夠看到這種寫法。數組
function test(){ //將參數轉爲一個數組 var args = Array.prototype.slice.apply(arguments); console.log(args) }
通常咱們網上看到解釋都是,對於js中的arguments來講,並非一個真正的數組,能夠叫它僞數組,經過Array.prototype.slice.apply方法,能夠將其轉化成數組,那讓咱們調用這個函數,看下函數中的參數數組。app
test(11,22); //[11,12]
一樣的,咱們能夠先輸出下函數內部的arguments。函數
console.log(arguments); //[11,12,callee:,length:2]
能夠看到,arguments確實不是一個純數組。那麼slice方法在將處理arguments並返回一個參數數組這個過程當中,具體作了什麼呢。讓咱們先了解下slice這個方法。
slice()方法返回一個從開始到結束(不包括結束)選擇的數組的一部分淺拷貝到一個新數組對象,且原始數組不會被修改。
語法prototype
array.slice(begin,end);
參數
begin 可選,從該索引出開始提取原數組中的元素(從0開始)。若是該參數爲負數,則表示從原數組中的倒數第幾個元素開始提取,slice(-2)表示提取原數組中的倒數第二個元素到最後一個元素(包含最後一個元素)。若是省略begin,則slice從索引0開始。
end 可選。從該索引處結束提取原數組元素(從0開始)。slice會提取原數組中索引從begin到end的全部元素(包含begin,但不包含end)。
slice(1,4)提取原數組中的第二個元素開始直到第四個元素的全部元素(索引爲1,2,3的元素)。
若是該參數爲負數,則表示在數組中的倒數第幾個元素結束抽取。slice(-2,-1)表示抽取了原數組中的倒數第二個元素到最後一個元素(不包含最後一個元素,也就是隻有倒數第二個元素)
另外:若是end被省略,則slice會一直提取到數組末尾。
若是end大於數組長度,slice也會一直提取到原數組末尾。
返回值
一個含有提取元素的新數組。
關於基本的slice的使用,我相信很容易理解也很容易使用。可是slice有兩個特殊的地方.slice不修改原數組,只會返回一個淺複製了原數組中的元素的一個新數組。原數組的元素會按照下述規則拷貝:
一、若是該元素是個對象引用(不是實際的對象),slice會拷貝這個對象引用到新的數組裏。兩個對象引用都引用了同一個對象。若是被引用的對象發生改變,則新的和原來的數組中這個元素也會發生改變。這個很好理解,看一個例子就明白。code
var aa_aa = {x:1}; var aa_arr = [1,2,aa_aa]; aa_aa.x = 2; console.log(aa_arr.slice(-1)); //[{x:2}]
二、對於字符串、數字及布爾值來講(不是String、Number或者Boolean對象),slice會拷貝這些值到新的數組裏。在別的數組裏修改這些字符串或數字或是布爾值,將不會影響另外一個數組。這個也很容易理解,可參考我以前的文章,對引用類型和基本類型的介紹。
若是向兩個數組任一個添加了新元素,則另外一個不會受到影響。
以上內容來自MDN關於slice方法的介紹。
那如今咱們知道,slice方法擁有將原數組中的元素淺複製到新數組中,並返回一個新數組的能力。那對於這裏的函數。首先,利用apply方法讓當前的函數內的arguments可使用slice方法,而後slice方法將arguments中的11和12兩個元素淺複製到新數組,並返回,這就實現了從arguments到數組的轉變對象
function test(){ //將參數轉爲一個數組 var args = Array.prototype.slice.apply(arguments); console.log(args) } test(11,12);