引用数据类型的赋值分为两种类型:浅拷贝和深拷贝。
浅拷贝:直接赋值,赋值的是内存地址,赋值之后 两个变量使用的相同内容,一个操作,另一个也会改变。
深拷贝:只赋值引用数据类型中的数值,而不是赋值地址,数据赋值后二者互不相干。
示例程序如下:
var arr1 = [1,2,3,4,5,6];
// 浅拷贝
// arr1 变量中存储的是数组的内存地址
// 将arr1存储的内存地址,赋值给arr2,两个变量存储的是相同的内存地址
var arr2 = arr1;
// 输出arr2
console.log(arr2);
// 改变arr1中的数据
arr1[0] = ‘北京’;
// arr1与arr2中的数据都改变
console.log(arr1)
console.log(arr2);
// 深拷贝
// arr1[1]中存储的是数据,将数据赋值给arr3
var arr3 = arr1[1];
// 输出 arr3
console.log(arr3);
// arr1中赋值给arr3的数据进行改变
arr1[1] = ‘你好’;
// arr1中的数据改变
console.log(arr1);
// arr3中的数据没有改变
console.log(arr3);
// 如果想要获得数组中的全部数据,则通过循环遍历的方式赋值
程序运行结果如下:
可以看到16行为arr2的输出,20、21行为数据改变后的arr1、arr2的输出,可以看到arr1、arr2中的数据都被改变。这是浅拷贝的规则。
26行为arr3的输出,30、32行为数据改变后的arr1、arr3的输出,可以看到arr1被改变,而arr3的数据并未被改变。这是深拷贝的规则。