天天看點

序列化和反序列化解決數組淺拷貝問題

先說解決方案,下面詳解:

JSON.parse(JSON.stringify(XXX));

數組指派想象中是這樣的:

Array1 = [,,,]; //[0, 1, 2, 3]
Array2 = Array1;    //[0, 1, 2, 3]
Array2[] = ;      // 1
Array2;             //[1, 1, 2, 3]
Array1;             //[0, 1, 2, 3]   錯誤
           

實際上是這樣的:

Array1 = [,,,]; //[0, 1, 2, 3]
Array2 = Array1;    //[0, 1, 2, 3]
Array2[] = ;      // 1
Array2;             //[1, 1, 2, 3]
Array1;             //[1, 1, 2, 3]   正确,但不是我們想要的
           

簡單友善通俗易懂的解決方案,當然解決方案不止這一種:

Array1 = [,,,];                         //[0, 1, 2, 3]
Array2 = JSON.parse(JSON.stringify(Array1));//[0, 1, 2, 3]
Array2[] = ;                              // 1
Array2;                                     //[1, 1, 2, 3]
Array1;                                     //[0, 1, 2, 3]
           

為什麼是這個樣子呢:

先說說數組,數組是一種引用資料類型,數組引用變量隻是一個引用,數組元素和數組變量在記憶體裡是分開存放的。對數組的存儲方式感冒的碼友們可以看這篇部落格:數組在記憶體中的存儲方式。這篇文章向我們講解了數組的存儲方式,還有棧記憶體和堆記憶體之分,個人感覺蠻好了解的。

序列化和反序列化:

JSON 對象有兩個方法: stringify( ) 和 parse( ) 。在最簡單的情況下,這兩個方法分别用于把 JavaScript 對象序列化為 JSON 字元串和把 JSON 字元串解析為原生 JavaScript 值。

如上例:

var Array1 = [,,,];             //[0, 1, 2, 3]
var str = JSON.stringify(Array1);   //"[0,1,2,3]"
var Array2 = JSON.parse(str);       //[0, 1, 2, 3]
Array2[] = ;                      //1
Array2;                             //[1, 1, 2, 3]
Array1;                             //[0, 1, 2, 3]
           

在這個例子中使用 JSON.stringify( ) 把一個 Array1 序列化為一個 JSON 字元串,然後将它儲存在變量 str 中。

結果中最終都是值為有效 JSON 資料類型的執行個體屬性,将 JSON 字元串 str 直接傳遞給 JSON.parse( ) 就可以得到相應的 JavaScript 值。

注意,雖然 Array2 與 Array1 具有相同的值,但它們是兩個獨立的、沒有任何關系的對象。

是以我們在 Array2[0] = 1中将 Array2 的第一個元素指派為1的時候,絲毫沒有影響到 Array1 的值。

成長路上的一些知識分享,如有錯誤,歡迎指正批評!O(∩_∩)O

繼續閱讀