该文章转载于:https://blog.csdn.net/jiang7701037/article/details/98738487?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162623663616780261920193%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162623663616780261920193&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-98738487.first_rank_v2_pc_rank_v29&utm_term=%E6%B5%85%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B7%B1%E6%8B%B7%E8%B4%9D&spm=1018.2226.3001.4187
**一.先了解基本类型和引用类型的区别
**一.了解内存
内存是储存数据的,不同数据要放到不同的区域中。
内存分为四个区域:
栈区 只可以存放局部变量的值 被调用函数的地址 形参
堆区 new出来得值
全局静态区 存放全局变量 静态变量
只读区 常量区存放常量 ,代码区存放程序的代码
**二.基本类型和引用类型在内存上存储的区别
以栈区和堆区举例说明:
1.局部变量age被定义并被赋值后,会取值存到栈区中,并将值起名为age,又由于给age赋了一个值,这个值是基本类型,所以值会直接存储在栈内;
2.定义局部变量arr,会在栈区申请内存空间把局部变量的值存进去,但是arr中的值不是基本类型而是引用类型(new出来的)。因此会在堆内存中存入arr的数据:【12,23,34】,再把堆的地址赋给arr(栈内)
**基本类型和引用类型的概念
1.基本类型:就是值类型,定义的变量所对应的内存区域存储的是值。例如:age变量所对应的内存存储的就是值250
2.引用类型:就是一个地址类型。 变量arr就是一个引用类型。arr所对应的内存中储存着地址,而真正的数据是在地址对应的内存区域中。
**三.基本类型和引用类型在赋值时的内存变化
**1、基本类型:
赋值就是拷贝
**2、引用类型:
举例说明:
如果给arr【0】进行赋值的话,也就是改变原来的值得话,arr1【0】的值也会被改变。因为arr和arr1保存着相同的地址,两个人引用的地址是共享的。
**四.深拷贝和浅拷贝
拷贝,实际意义上是赋值。把一个变量的值赋给另一个变量,就是把内容进行了拷贝。把一个对象的值赋给及另一个对象,这就叫拷贝。
**1、基本类:
Var a = 100;
Var b = a;
consle.log b;//100
如果要改变b的值得话,a的值不会被改变;
**2、引用类型:
引用类型赋值时,赋的值地址(就是引用类型变量在内存中保存的内容)
例如:
var arr1 = new Array(12,23,34);
var arr = arr1; 这就是一个最简单的的浅拷贝
如果arr的值改变,arr1的值也会改变的
这是因为两个变量用了相同的地址
这只是把arr1的地址拷贝了一份,给了arr,并没有把数据给arr。。
**3、用json对象的方式演示浅拷贝和深拷贝:
1.定义一个json对象(对象的属性也是对象)
var p = {
id:"007",
name:"刘德华",
age:"18"
book:"new array("三国演义","红楼梦",“水浒传”) //引用类型
}
2.进行浅拷贝
var p1 = {};
for(let key in p){
p1[key] = p[key];
}
p1.book[0] = "四国";
console.log(p1);
console.log(p);
p和p1book[0]的值都变成了四国。
3.进行深拷贝
var p2 = {};
for (let key in p){
p2[key] = [];
for(let i in p[key]){
p2[key][i] = p[key][i]
}else{
p2[key] = p[key];
}
}
p2.book[0] = "四国";
console.log(p);
console.log(p2);
只有p2.book[0]的值变成了四国;
4.深拷贝最终版
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)]
}else{
newObj[key] = obj(key);
}
}
return newObj;
}
ley p2 = copyObj(p);
p2.wife.name = "张三疯";
p2.wife.address.city = "香港"
console.log(p);
console.log(p2);
深拷贝_如果属性是数组等非键值的对象
//给数组对象增加一个方法,用来复制自己
Array.prototype.copyself = function(){
let arr = new Array();
for(let i in this){
arr[i] = this[i];
}
return arr;
}
var p (){
id:"oo7",
name:"刘德华",
books: new Array("三国演义","红楼梦","水浒传")
}
function copyObj(obj){
let newObj = {};
for(let key in obj ){
if(typeof newObj[key] == 'object'){
newObj[key] = obj[key].copyself();
}else{
newObj[key] = obj[key];
}
}
return newObj
}
var p1 = copyObj(p);
p1.books[0] = "四国";
console.log(p);
console.log(p1);