1、数据类型:
* 数据分为基本的数据类型(String, Number, boolean, Null, Undefined)和对象数据类型
- 基本数据类型:
特点: 存储的是该对象的实际数据
- 对象数据类型:
特点: 存储的是该对象在栈中引用,真实的数据存放在堆内存里
2、复制数据
- 基本数据类型存放的就是实际的数据,可直接复制
let number2 = 2;
let number1 = number2;
- 克隆数据:对象/数组
1、区别: 浅拷贝/深度拷贝
判断: 拷贝是否产生了新的数据还是拷贝的是数据的引用
知识点:对象数据存放的是对象在栈内存的引用,直接复制的是对象的引用
let obj = {username: 'kobe'}
let obj1 = obj; // obj1 复制了obj在栈内存的引用
2、常用的拷贝技术
1). arr.concat(): 数组浅拷贝
2). arr.slice(): 数组浅拷贝
3). JSON.parse(JSON.stringify(arr/obj)): 数组或对象深拷贝, 但不能处理函数数据
4). 浅拷贝包含函数数据的对象/数组
5). 深拷贝包含函数数据的对象/数组
//1.直接赋值 浅度复制
let obj1 = {uname:'kobe', 'sex':'boy'};
let obj2 = obj1;
//2.Object assign 浅度复制assign()第一个参数对象,操作obj3只会影响obj1
let obj1 = {uname:'kobe', 'sex':'boy'};
let obj2 = {age:18};
let obj3 = Object.assign(obj1,obj2);
obj3.uname="wada";
obj3.age=20;
obj3.sex="girl";
//3.Array.prototype.concat()//浅复制 ,
//4.Array.prototype.slice()//浅复制
//5.JSON.pase(JSON.stringify())//深度克隆(深度复制) 但是拷贝的数据里无法拷贝函数
实现深度克隆
//定义检测类型函数
function checkType(val){
return Object.prototype.toString.call(val).slice(8,-1);
}
//深度克隆函数
function clone(obj){
let result;//最终返回的结果
let type = checkType(obj);
if(type==="Object"){
result={}
}else if(type==="Array"){
result=[]
}else{
return obj;//如果不是对象或数组 则直接返回
}
//数组和对象都可以使用for in
for(let i in obj){
let type = checkType(obj[i]);
if(type==="Object" || type ==="Array"){
result[i] = clone(obj[i]);
}else{
result[i] = obj[i];
}
}
return result;
}
let arr = [1,2,3,{name:'kobe',age:18}];
let arr1 = clone(arr);
console.log(arr1);
arr1[3].name="wada";
console.log(arr,arr1);
网友评论