一、js的变量储存方式:栈(stack) 堆(heap)
栈:自动分配内存空间,系统自动释放,里面存放的是基本数据类型的值和引用类型的地址
堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值
基本类型:赋值 真正的值
引用类型:赋值 引用类型的地址
二 、深浅拷贝(引用类型)
1、浅拷贝 传的是地址 一个改都改
1、深拷贝 传的是值 只改变自己改变对象 另一个对象没有变化
深拷贝的三种方法
1、for循环
2、slience
3、concat
4、使用JSON.stringify()以及JSON.parse()
5、 递归 (自身调用自身)
var arr_2=[1,2,3]
var arr_3=[]
for(var i=0;i<arr_2.length;i++){
arr_3[i]=arr_2[i]
}
arr_3.push(4)
console.log(arr_2);
console.log(arr_3);
var arr_4=[1,2,3]
var arr_5=[]
arr_5=arr_4.slice(0)
arr_5.push(4)
console.log(arr_4);
console.log(arr_5);
var arr_6=[1,2,3]
var arr_7=arr_6.concat()
arr_7.shift()
console.log(arr_6);
console.log(arr_7);
var obj_1={
name:'name',
age:18
}
var obj_2={}
for(x in obj_1){
obj_2[x]=obj_1[x]
}
obj_2.name='name1'
console.log(obj_1);
console.log(obj_2);
四、如何进行深拷贝(四种方法)
1、使用JSON.stringify()以及JSON.parse()
let _tmp = JSON.stringify(obj);
let result = JSON.parse(_tmp);
var obj1 = {
a: 1,
b: 2,
c: 3
}
var objString = JSON.stringify(obj1);
var obj2 = JSON.parse(objString);
obj2.a = 5;
console.log(obj1.a);
console.log(obj2.a);
可以看到没有发生引用问题,修改obj2的数据,并不会对obj1造成任何影响
但是使用JSON.stringify()以及JSON.parse()它是不可以拷贝 undefined , function, RegExp 等等类型的
使用递归的方式实现数组、对象的深拷贝
function deepClone1(obj) {
var objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone1(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}