天天看點

JS的array.slice()和array.splice()的使用

JS中有兩個操作數組的函數:slice(start,end)和splice(start,length,insert_one,insert_two......),估計其意義大家都懂,簡單說一下:

  1. array.slice(start,end)函數是取array數組中指定的一些元素(slice也是字元串截取方法,本文不提及):根據數組下标start和end,兩個參數為取值的開始和結束下标,取出的值不包括end位置的值,生成一個新數組作為傳回值;這裡end可以為空,為空則取從start位置到數組結尾的元素,生成新數組。
  2. array.splice(start,length,insert_one......)函數則是直接在原數組進行删除、添加、替換元素的操作:start為數組删除元素的開始下标,length為從start位置開始array删除元素的個數,後面參數為删除之後array重新插入的資料内容,插入位置為删除位置,而非數組開頭或末尾,傳回值為array删除的元素組成的數組。顯而易見,splice函數可以用來對數組元素進行替換。由splice操作後的數組array,數組中内容如果已經改變,就再也找不回array在splice之前的模樣。

但是如果隻有這麼多東西,我就不在這裡講了,W3c比我講的好得多,進入正題。 例子: 在一次請求中,ajax傳回的資料中有一個array數組,想要提取array中的某幾個特殊位置的值做特殊使用,剩餘的值為同一個類型的值(假定剩餘幾個值用處相同,但與前面取得幾個特殊值用處不同),我們本可以使用splice()函數,剔除了該剔除的值做特殊使用,又剩下了能統一處理的元素,但是如果代碼中不隻一次的需要用到該array呢?處理一次過後就晚節不保了?再次使用array的時候已經是殘羹冷炙了? 你估計會說,擷取到array之後,定義一個變量,比如var temp = array;然後使用temp進行splice操作,這樣最後的array還是最初的模樣沒改變,嘗試一下之後就會發現,事實上,temp = array 這個過程,temp指向的是array的記憶體位址,對temp做的操作,即是對array做的操作。 如果不信,不妨試一下如下操作:

var array = [1,2,3,true,"guo",10,];
    var temp = array;
    var a = temp.splice(3,1,4);
    var b = temp.splice(4,1,5);
    console.log(temp);   //1,2,3,4,5,10
    console.log(array);  //1,2,3,4,5,10
           

這時候,如果你感覺到絕望,應該想到slice()函數,為了temp 和 array 不指向同一個位址,slice可以實作,如下:

var array = [1,2,3,true,"guo",10,];
    var temp = array.slice(0);
    var a = temp.splice(3,1,4);
    var b = temp.splice(4,1,5);
    console.log(temp);   //1,2,3,4,5,10
    console.log(array);  //1,2,3,true,"guo",10,
           

總結: 如果在記憶體空間建立一個數組var array = [7,8,9]之後,又建立了一個新的變量" var temp = array ",那麼實際上temp和array指向的是同一個位址,當使用" temp[0] = 0 " 這樣的指派語句之後,array[0]也随之改變,隻有通過"var  temp = [7,8,9] " 這樣的語句給temp指派,temp才會不與array指向同一位址,這時候,實際上是在記憶體空間重建立立了存儲7,8,9的空間,然後将temp指向該空間,才不與array指向同一空間,即使建立的temp 與 array數組元素相同。 但是很多情況下,我們的數組是一個獲得到的變量,需要多次使用,這是就需要“ var temp = array.slice(0) ”操作,達到建立記憶體空間,改變temp指向的目的。

拓展: 上述var temp = array.slice(0)的方法建立存儲空間存儲資料即為傳說中的“深拷貝”,var temp=array,temp指向array記憶體位址的複制則為“淺拷貝”。 深拷貝還有一個方法是使用JSON類的方法,該方法可是實作複雜資料結構的深拷貝,例如:

var data = {
        a:1,
        b:["2","3","4"],
        c:true
    };
var temp = JSON.parse(JSON.stringify(data));
temp.a = 111;
console.log(data);
console.log(temp);
           

繼續閱讀