内存
- 内存:栈内存 和 堆内存
1:只要声明一个变量;就会在【栈】中占一个内存
2; 基本类型的的VAR 在栈中;直接提供在变量上
3:引用类型的数值;数据存在堆中;同时提供给栈一个【地址】;指向堆中的数据
4:堆中有多个数据;就有多个【地址】
5: 栈中的变量;如果多个变量指向【同一个地址】,获取到的是【同一个堆内存中数据】
任何一个变量发生变化都会影响到【其它的变量】
拷贝
- 深拷贝:抄袭者;当抄袭者者数据改变时;不会改变被抄袭者中的内容同时,当被被抄袭中中数据发生改变时;也不会影响到抄袭者中数据。说明抄袭者可以自食其力
- 浅拷贝 拷贝后;抄袭者和被抄袭者相互影响
深拷贝引用类型数据
- 数据:定义新的数组或者对象;将被拷贝的数据;
- 遍历;添加到新数组中
深拷贝方法封装
// 深拷贝数据组方法
function deepArr(arr) {
var arrCopy = []
for (var i = 0, len = arr.length; i < len; i++) {
arrCopy.push(arr[i])
}
return arrCopy;
}
// 深拷贝对象
function deepObject(obj) {
var objCopy = {};
for (x in obj) {
objCopy[x] = obj[x];
}
return objCopy;
}
// 深拷贝引用类型数据
function deepData(data) {
if (data.constructor.name === 'Array') { // 为数组
var arrCopy = []
for (var i = 0, len = data.length; i < len; i++) {
arrCopy.push(data[i])
}
return arrCopy;
} else { // 为对象
var objCopy = {};
for (x in data) {
objCopy[x] = data[x];
}
return objCopy;
}
}
对象实现深拷贝:
/**
* 引用类型数据原理
* 在堆中多存一个数据,让这个数据
*/
var obj = {
name: 'nn',
age: 11
}
var copyObj = {};
for (x in obj) {
copyObj[x] = obj[x];
}
copyObj.dec = '哈哈';
console.log(obj);
console.log(copyObj);
数组实现深拷贝:
/**
* 数组深拷贝
* 1:声明一个空数组,在堆中新存一个数据
* 2:遍历另一个数组,获取到每一个数据
* 3:将获取到的数据,添加到空数组中,完成拷贝
* 因为arr与copyArr变量,存的是不同的指针,所以改变不受影响
*/
var arr = [1,2,3,4];
var copyArr = [];
for(var i = 0 ; i < arr.length ; i++){
copyArr.push(arr[i]);
}
copyArr.push('哈哈');
console.log(arr);
console.log(copyArr);