JS 擷取陣列(得到陣列片段)的方法有兩種,分別是使用 splice() 和 slice() 方法,簡單說明如下。
使用 splice() 擷取陣列
splice() 方法可以新增元素、刪除元素,也可以擷取陣列片段。刪除元素時,將返回被刪除的陣列片段,因此可以使用 splice() 方法擷取陣列片段。
由於 splice() 方法的功能多,引數複雜,使用時應該注意下面幾個問題。
1) splice() 方法的引數是可選的。如果不給它傳遞引數,則該方法不執行任何操作。如果給它傳遞一個引數,則該方法僅執行刪除操作,引數值指定刪除元素的起始下標,(包含該下標元素),splice() 方法將刪除後面所有元素。
-
如果指定兩個引數,則第 2 個引數值表示要刪除元素的個數。
-
如果指定三個或多個引數,則第 3 個以及後面所有引數都被視為插入的元素。
-
如果不執行刪除操作,第 2 個引數值應該設定為 0,但是不能夠空缺,否則該方法無效。
2) splice() 方法的刪除和插入操作是同時進行的,且是在原陣列基礎上執行操作。插入的元素將填充被刪除元素的位置,並根據插入元素個數適當調整插入點位置。而不是在刪除陣列之後重新計算插入點的位置。
3) splice() 方法執行的返回值是被刪除的子陣列。
var a = [1,2,3,4,5]; //定義陣列
var b = a.splice(2); //從第三個元素開始執行刪除
console.log(b); //被刪除的子陣列是[1,2]
如果沒有刪除元素,則返回的是一個空陣列。
var b = a.splice(2,0); //不執行刪除操作
console.log(b.constructor == Array); //返回true,說明是一個空陣列
4) 當第 1 個引數值大於 length 屬性值時,被視為在陣列尾部執行操作,因此刪除無效,但是可以在尾部插入多個指定元素。
var a = [1,2,3,4,5]; //定義陣列
var b = a.splice(6,2,2,3); //起始值大於length屬性值
console.log(a); //返回[1,2,3,4,5,2,3]
5) 引數取負值問題。如果第 1 個引數為負值,則按絕對值從陣列右側開始向左側定位。如果第 2 個引數為負值,則被視為 0。
var a = [1,2,3,4,5]; //定義陣列
var b = a.splice(-2,-2,2,3); //第一、二個引數都為負值
console.log(a); //返回[1,2,3,2,3,4,5]
使用 slice() 擷取陣列
slice() 方法與 splice() 方法功能相近,但是它僅能夠擷取陣列中指定區段的元素,並返回這個子陣列。該方法包含兩個引數,分別指定擷取子陣列的起始和結束位置的下標。
var a = [1,2,3,4,5]; //定義陣列
var b = a.slice(2,5); //擷取第三個元素到第六個元素前的所有元素
console.log(b); //返回[3,4,5]
使用該方法時,應該注意下面幾個問題。
1) 第 1 個引數指定起始下標位置,包括該值指定的元素;第 2 個引數指定結束位置,不包括指定的元素。
2) 該方法的引數可以自由設定。如果不傳遞引數,則不會執行任何操作;如果僅指定一個引數,則表示從該引數值指定的下標位置開始,擷取到陣列的尾部所有元素。
var b = a.slice(2); //擷取陣列中第三個元素,以及後面所有元素
console.log(b); //返回[3,4,5]
3) 當引數為負值時,表示按從右到左的順序進行定位,即倒數定位法,而不再按正數順序定位(從左到右),但取值順序依然是從左到右。
var b = a.slice(-4,-2); //擷取倒數第四個元素到倒數第二個元素前的元素
console.log(b); //返回[2,3]
如果起始下標值大於或等於結束下標值,將不執行任何操作。
var b = a.slice(-2,-4); //擷取倒數第二個元素到倒數第四個元素前的元素
console.log(b); //返回空集
上面範例說明陣列在擷取時,始終是按從左到右的順序執行操作,而不會是從右到左的反向操作。
4) 當起始引數值大於或等於 length 屬性值時,將不會執行任何操作,返回空陣列。而如果第二個引數值大於 length 屬性值時,將被視為 length屬性值。
var b = a.slice(3,10); //擷取第四個元素,直到後面所有元素
console.log(b); //返回[4,5]
5) slice() 方法將返回陣列的一部分(子陣列),但不會修改原陣列。而 splice() 方法是在原陣列基礎上進行擷取。如果希望在原陣列基礎上進行擷取操作,而不是擷取為新的陣列,這時候就只能夠使用 splice() 方法了。