天天看點

深入Array.prototype.slice()方法

"slice"英文是 片 的意思,顧名思義,slice方法是将數組切片,即傳回原數組的一部分

slice()

方法傳回一個新的數組對象,這一對象是一個由 begin 和 end 決定的原數組的淺拷貝(包括 begin,不包括end)。原始數組不會被改變。

var arr = [4,2,7,0,1,6]
   arr.slice(1,3)   //[2,7]
   arr.slice()      //[4,2,7,0,1,6]
   arr.slice(1)     //[2,7,0,1,6]
   arr.slice(1,10)  //[2,7,0,1,6]
   arr.slice(-2)    //[1,6]
   arr.slice(-3,-1) //[0,1] 
           

文法:

begin 可選

提取起始處的索引(從 0 開始),從該索引開始提取原數組元素。

如果該參數為負數,則表示從原數組中的倒數第幾個元素開始提   取,slice(-2) 表示提取原數組中的倒數第二個元素到最後一個元素(包含最後一個元素)。

如果省略 begin,則 slice 從索引 0 開始。

如果 begin 大于原數組的長度,則會傳回空數組。
           

end 可選

提取終止處的索引(從 0 開始),在該索引處結束提取原數組元素。slice 會提取原數組中索引從 begin 到 end 的所有元素(包含 begin,但不包含 end)。

slice(1,4) 會提取原數組中從第二個元素開始一直到第四個元素的所有元素 (索引為 1, 2, 3的元素)。

如果該參數為負數, 則它表示在原數組中的倒數第幾個元素結束抽取。 slice(-2,-1) 表示抽取了原數組中的倒數第二個元素到最後一個元素(不包含最後一個元素,也就是隻有倒數第二個元素)。

如果 end 被省略,則 slice 會一直提取到原數組末尾。

如果 end 大于數組的長度,slice 也會一直提取到原數組末尾。
           

傳回值

一個含有被提取元素的新數組。

注意:

slice()

方法不會改變原數組,

slice()

方法是淺拷貝,如果原數組中包含引用類型,那麼

slice

會拷貝這個對象引用到新的數組裡。兩個對象引用都引用了同一個對象。如果被引用的對象發生改變,則新的和原來的數組中的這個元素也會發生改變

var list = [{ name: "shi", age: 20 },[1, 2, 3], 60]
   
    var arr = list.slice()
    
    list[0].name = "xia"
    
    console.log(arr)   //[{ name: "xia", age: 20 },[1, 2, 3], 60]
           

Array.prototype.slice()

常用之處是用于将實參清單(

arguments

)轉為數組

由于

arguments

是類數組,不是真正的數組,不能調用數組的方法,是以需要使用

Array.prototype.slice.call(arguments)

将其轉換為數組

function demo(){
        var arr = Array.prototype.slice.call(arguments)
        console.log(arr)   //[1,2,3,4]
    }
    demo(1,2,3,4)