js 赋值、浅拷贝、深拷贝

了解js的浅拷贝、深拷贝之前我们必须要了解js的数据类型以及他们在内存中的储存方式

1:基础类型

string、number、null、undefind、symbol

基础类型的值是直接存在堆当中,传的是值

2:引用类型

object

引用类型的值分两步份、一份是值得地址存在堆当中、另外一部分值是存在栈当中 

3:赋值

 1 var obj = { 
 2    name:"小刘",//str 类型
 3    age:1,//number 类型
 4    language:undefined,//undefined 类型
 5    weight:null,//null 类型
 6    hobby:[‘学习‘],// object 类型(数组)
 7    study:{ //object 类型
 8        math:89,
 9        english:98
10    }
11  } 
12  var obj1 = obj
13  obj1.name = "小华"
14  obj1.hobby[0] = ‘打游戏‘
15  obj1.weight = ‘90‘
16  console.log(obj)
17 //  {
18 //   name: ‘小华‘,
19 //   age: 1,
20 //   language: undefined,
21 //   weight: ‘90‘,
22 //   hobby: [ ‘打游戏‘ ],
23 //   study: { math: 89, english: 98 }
24 // }
25  console.log(obj1)
26 //  {
27 //   name: ‘小华‘,
28 //   age: 1,
29 //   language: undefined,
30 //   weight: ‘90‘,
31 //   hobby: [ ‘打游戏‘ ],
32 //   study: { math: 89, english: 98 }
33 // }

obj、obj1 一毛一样

4:浅拷贝

var obj = { 
   name:"小刘",//str 类型
   age:1,//number 类型
   language:undefined,//undefined 类型
   weight:null,//null 类型
   hobby:[‘学习‘],// object 类型(数组)
   study:{ //object 类型
       math:89,
       english:98
   }
 } 
 function copy(obj){
     var newObj = {}
     for(var key in obj){
        if(obj.hasOwnProperty(key)){//遍历自身属性、忽略继承属性
            newObj[key] = obj[key]
        }
     }
     return newObj
 }
 var obj1 = copy(obj)
 obj1.name = "小华"
 obj1.hobby[0] = ‘打游戏‘
 obj1.weight = ‘90‘
 console.log(obj)
//  {
//   name: ‘小刘‘,
//   age: 1,
//   language: undefined,
//   weight: null,
//   hobby: [ ‘打游戏‘ ],
//   study: { math: 89, english: 98 }
// }
 console.log(obj1)
//  {
//   name: ‘小华‘,
//   age: 1,
//   language: undefined,
//   weight: ‘90‘,
//   hobby: [ ‘打游戏‘ ],
//   study: { math: 89, english: 98 }
// }

从上面我们可以看到obj里面得name这个数据类型是基础类型得值改变了,但是hobby这个引用类型两者都变化了。

如果我们想要做到引用类型也做到完全复制,就要使用深拷贝了。

4:深拷贝

 1 var obj = { 
 2    name:"小刘",//str 类型
 3    age:1,//number 类型
 4    language:undefined,//undefined 类型
 5    weight:null,//null 类型
 6    hobby:[‘学习‘],// object 类型(数组)
 7    study:{ //object 类型
 8        math:89,
 9        english:98
10    }
11  } 
12  function deepCopy(obj){
13      return JSON.parse(JSON.stringify(obj))
14  }
15  var obj1 = deepCopy(obj)
16  obj1.name = "小华"
17  obj1.hobby[0] = ‘打游戏‘
18  obj1.weight = ‘90‘
19  console.log(obj)
20 // {
21 //   name: ‘小刘‘,
22 //   age: 1,
23 //   language: undefined,
24 //   weight: null,
25 //   hobby: [ ‘学习‘ ],
26 //   study: { math: 89, english: 98 }
27 // }
28  console.log(obj1)
29 // {
30 //   name: ‘小华‘,
31 //   age: 1,
32 //   weight: ‘90‘,
33 //   hobby: [ ‘打游戏‘ ],
34 //   study: { math: 89, english: 98 }
35 // }

 

js 赋值、浅拷贝、深拷贝

上一篇:通过feign上传文件[原]


下一篇:C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别