一、基本数据类型和引用数据类型
基本数据类型的变量保存的是一个值
引用数据类型的变量保存的是一个指针(地址),指向另一个位置。
二、深拷贝和浅拷贝
深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
var a = 10;
var b = a;
a = 100;
console.log(b);
浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个
var a = [10,20,30];
var b = a;
a[0] = 100;
console.log(b);
常见问法:如何将引用数据类型进行深拷贝?
1、针对于数组,如何实现深拷贝?可以使用slice和concat方法,还可以使用ES6的展开运算符
const Arr = ["one", "two", "three"];
const fxArr = Arr.slice(0);
fxArr[1] = 'love'
console.log(Arr);
-----------------------------------------------------------------------
const Arr = ["one", "two", "three"];
const fxArr = Arr.concat(0);
fxArr[1] = 'love'
console.log(Arr);
------------------------------------------------
const Arr = ["one", "two", "three"];
const fxArr = [...Arr]
fxArr[1] = 'love'
console.log(Arr);
2、针对于对象,如何实现深拷贝呢?可以使用以下几种方案?
----------------------对象一个一个赋值----------------------------------
let obj1 = {
name:"ruirui",
age:18
}
let obj2 = {}
obj2.name = obj1.name;
obj2.age = obj1.age;
obj2.name = 'shasha'
console.log(obj1);
-----------------------------ES6扩展运算符---------------------------
let obj1 = {
name:"ruirui",
age:18
}
let obj2 = {...obj1}
--------------------------对象遍历赋值------------------------------
var p = {
"id":"007",
"name":"刘德华"
}
var p2 = {};
for (let key in p) {
p2[key] = p[key];
}
p2.name = '王瑞'
console.log(p);
3、上面属于一层,如果含有多层,对象遍历赋值只能外层对象是深拷贝的,内层对象是浅拷贝
let p = {
"id":"007",
"name":"刘德华",
"books":newArray("三国演义", "红楼梦", "水浒传")//这是引用类型
}
let p2 = {};
for (let key in p) {
p2[key] = p[key];
}
p2.name = "瑞瑞"
p2.books[0] = "瑞瑞自创";
console.log(p);
发现实现不了:下面提供一种递归的思路来进行解决
var p = {
"id":"007",
"name":"刘德华",
"wife": {
"id":"008",
"name":"刘德的妻子",
"address": {
"city":"北京",
"area":"海淀区"
}
}
}
//写函数
function copyObj(obj) {
let newObj = {};
for (let key in obj) {
if (typeof obj[key] == 'object') {
newObj[key] = copyObj(obj[key]);//如:key是wife,引用类型,那就递归
} else {
newObj[key] = obj[key];//基本类型,直接赋值
}
}
return newObj;
}
let pNew = copyObj(p);
pNew.wife.name = "张三疯";
pNew.wife.address.city = "香港";
console.log(pNew);
console.log(p);