引用类型与值类型的储存特征:
(1)内存逻辑结构(画图)
(2)赋值:值类型两个数据,引用类型是两个变量一个数据
var number = 123;
Var num2 = num;
*值类型赋值的存储特点,将变量内的数据全部拷贝一份,存储给新的变量
*‘var num = 123’表示变量中存储的数字是123
*然后将数据拷贝一份,就是将123拷贝一份,那么内存中有两个数组
*将拷贝数据赋值给‘num2’
*其特点是在内存中有两个数据副本
深拷贝与浅拷贝
深拷贝:如果拷贝的时候,将数据的所有结构都拷贝一份,那么数据在 内存中独立就是深拷贝,完全隔离
浅拷贝:如果拷贝的时候,只针对当前对象的属性进行拷贝,不考虑属 性是否为引用类型那么就是浅拷贝,存在共享
拷贝:复制一份,指将对象数据复制
在讨论深拷贝与浅拷贝的时候一定要保证对象的属性也是引用类型
操作DOM 时不能使用浅拷贝
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
<script>
var car = {name:'法拉利'};
var p = {name:'张三', age: 19, car: car};
//var pCopy = p; 这个不是拷贝,没有对对象做任何拷贝行为
//浅拷贝的代码实现
// var pCopy = {};
// pCopy.name = p.name;
// pCopy.age = p.age;
// pCopy.car = p.car;
//深拷贝的代码实现
// var pCopy = {};
// pCopy.name = p.name;
// pCopy.age = p.age;
// pCopy.car = {};
// pCopy.car.name = p.car. name;
//
//浅拷贝
// var p = {
// name: '张三',
// age: 19,
// gender: '男',
// copy: function (o) { //将当前对象拷贝一份
// //1.创建对象
// var temp = {};
// //2.复制属性,在 copy 中使用 this 表示当前对象
// for (var k in this) {
// temp[ k ] = this[ k ];
// }
// //3.返回对象
// return temp;
// //需要返回对象
// }
// };
//
//
// var p2 = p.copy();
//
//
// p.name = '李四';
// p.age = 20;
// p.genter = '女';
//
//
//
//
// var car = {name: '法拉利',
// deepCopy: function () {
// //假设copy已经写好
// //1.创建一个对象
// var temp = {};
// //2.拷贝属性,在判断如果是引用类型需要拷贝
// for (var k in this) {
// if (typeof this[ k ] === 'object') {
// temp[ k ] = this [ k ].deepCopy();
// }
// else {
// temp[ k ] = this [ k ];
// }
// }
// //3.返回对象
// return temp;
// }
// };
// var p = {name: '张三', car: car,
// deepCopy: function () {
// //1.创建一个对象
// var temp = {};
// //2.拷贝属性,在判断如果是引用类型需要拷贝
// for (var k in this ){
// if (typeof this[ k ] === 'object') {
// temp[ k ] = this[ k ].deepCopy();
// }
// else {
// temp[ k ] = this[ k ];
// }
// }
// //3.返回对象
// return temp;
// }
// }
//需要保证所有的对象中都有copy 方法那么就可以简化了
// 写一个deepCopy函数,每一个对象都用<对象>.deepCopy = deepCopy,来使得当前对象具有拷贝的方法,那么就可以实现深拷贝了
//深拷贝
var deepCopy = function () {
//1.创建一个对象
var temp = {};
//2.拷贝属性,在判断如果是引用类型需要拷贝
for (var k in this ){
if (typeof this[ k ] === 'object') {
temp[ k ] = this[ k ].deepCopy();
}
else {
temp[ k ] = this[ k ];//值类型直接拷贝
}
}
//3.返回对象
return temp;
}
var car = {name: '法拉利'};
var p = {name: '张三', age: 19, gender:'男',car: car };
//让所有的对象都有拷贝的方法
car.deepCopy = deepCopy;
p.deepCopy = deepCopy;
var newP = p.deepCopy();
p.name = '李四';
p.age = 20;
p.genter = '女';
p.car.name = '兰博基尼';
</script>
</html>