引用类型&对象拷贝

基本类型、引用类型

基本类型值(数值、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
引用类型值(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,由该位置保存对象。
注意基本类型和引用类型的区别:

var a = 1
var b = a
a = 2
b = 1//不改变b的值

var obj = {age : 100 }
var obj2 = obj
obj.age = 200
obj2.age = 200 //引用类型 对象的名称可以看作是指向它真实内容的地址

函数的参数传递

函数的参数传递

对象浅拷贝和深拷贝

浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。

  • 对于基本数据类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是:两个对象指向同一块内存地址,修改其中一个对象的属性,则另一个对象的属性也会改变。
  • 而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
//浅拷贝
  var obj = {
  age: 100,
  friend: {
    name: 'ruoyu',
    sex: 'male',
    child: {
      name: 'abc'
    }
  }
}
function shallowCopy(obj){
  var newObj ={}
  for(var key in obj){
    if(obj.hasOwnProperty(key)){
      newObj[key] = obj[key]
    }
  }
  return newObj
}

var obj2 = shallowCopy(obj)
//深拷贝
var obj = {
  age: 100,
  friend: {
    name: 'ruoyu',
    sex: 'male',
    child: {
      name: 'abc'
    }
  }
}

function deepCopy(obj){
  var newObj ={} //新开辟一片空间,名字叫做newObj 
  for(var key in obj){
    if(obj.hasOwnProperty(key)){
      if(typeof obj[key] === 'number' || typeof obj[key] === 'boolean' || typeof obj[key] === 'string' || obj[key] === undefined || obj[key] === null){
        newObj[key] = obj[key]
      }else{
        newObj[key] = deepCopy(obj[key])
      }
    }
  }
  return newObj
}

var obj3 = deepCopy(obj)  

你可能感兴趣的:(引用类型&对象拷贝)