先说解决方案,下面详解:
JSON.parse(JSON.stringify(XXX));
数组赋值想象中是这样的:
Array1 = [0,1,2,3]; //[0, 1, 2, 3]
Array2 = Array1; //[0, 1, 2, 3]
Array2[0] = 1; // 1
Array2; //[1, 1, 2, 3]
Array1; //[0, 1, 2, 3] 错误
实际上是这样的:
Array1 = [0,1,2,3]; //[0, 1, 2, 3]
Array2 = Array1; //[0, 1, 2, 3]
Array2[0] = 1; // 1
Array2; //[1, 1, 2, 3]
Array1; //[1, 1, 2, 3] 正确,但不是我们想要的
简单方便通俗易懂的解决方案,当然解决方案不止这一种:
Array1 = [0,1,2,3]; //[0, 1, 2, 3]
Array2 = JSON.parse(JSON.stringify(Array1));//[0, 1, 2, 3]
Array2[0] = 1; // 1
Array2; //[1, 1, 2, 3]
Array1; //[0, 1, 2, 3]
为什么是这个样子呢:
先说说数组,数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的。对数组的存储方式感冒的码友们可以看这篇博客:数组在内存中的存储方式。这篇文章向我们讲解了数组的存储方式,还有栈内存和堆内存之分,个人感觉蛮好理解的。
序列化和反序列化:
JSON 对象有两个方法: stringify( ) 和 parse( ) 。在最简单的情况下,这两个方法分别用于把 JavaScript 对象序列化为 JSON 字符串和把 JSON 字符串解析为原生 JavaScript 值。
如上例:
var Array1 = [0,1,2,3]; //[0, 1, 2, 3]
var str = JSON.stringify(Array1); //"[0,1,2,3]"
var Array2 = JSON.parse(str); //[0, 1, 2, 3]
Array2[0] = 1; //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