```js 基础篇 难度 ★ //浅拷贝 请写出下列代码的输出结果,为什么? //1. var a = 2 ; var a_copy = a ; a_copy = 3; console.log(a);//? //2.数组1 var arr = [1,2,3,4]; var arr_copy = arr ; arr_copy.push(5); console.log(arr);//? //3.数组2 var arr = [1,2,3,4]; var arr_copy = arr ; arr_copy = [1,2,3,4,5]; console.log(arr);//? console.log(arr_copy);//? //4.对象1 var obj = { name:'sunshine', age:18 }; var obj_copy = obj ; obj_copy.name = '过客'; console.log(obj.name);//? //5.对象2 var obj = { name:'sunshine', age:18 }; var obj_copy = obj ; obj_copy = { name:'过客', age:18 }; console.log(obj.name);//? console.log(obj_copy.name);//? ```
Activity
[-]第16期(5月23号)浅克隆[/-][+]第16期(2019-5-23)浅克隆[/+][-]第16期(2019-5-23)浅克隆[/-][+]第16期(2019-5-23):浅克隆[/+]wingmeng commentedon May 23, 2019
这道题涉及 javascript 的数据类型,主要分两类:
基本数据类型是直接按值存放在内存中的简单数据段,可以直接保存变量中的实际值,所以第 1 题控制台输出 2,a 是基本数据类型。
引用数据类型是存放在内存中的对象,其变量其实是一个指针,保存了指向内存对象的引用地址,所以第 2 题的
arr变量其实只是将引用地址复制了一份给了arr_copy变量,实际上它们共同指向同一个[1,2,3,4]内存对象,所以arr_copypush 了一项,是对[1,2,3,4]的修改,因此arr变量的值也跟着变为了[1,2,3,4,5],第 4 题也是同样的道理。第 3 题和第 5 题有所不同,虽然是引用数据类型,但代码中对 copy 的变量进行了重新赋值,相当于在内存中创建并指向了一个新的内存对象,因此对 copy 变量的修改不会影响到原先变量的值。
总结一下答案:
2[1,2,3,4,5][1,2,3,4]和[1,2,3,4,5]过客sunshine和过客