先說解決方案,下面詳解:
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