1. 程式人生 > 其它 >自然常數e的由來以及計算機為什麼是二進位制

自然常數e的由來以及計算機為什麼是二進位制

淺拷貝和深拷貝只針對引用型別

淺拷貝

淺拷貝:拷貝的是地址

如果是一層物件,不相互影響,如果出現多層物件拷貝還會相互影響

拷貝物件之後,裡面的屬性值簡單資料型別直接拷貝值

如果屬性值是引用資料型別則拷貝的是地址

總結:

如果是簡單資料型別拷貝值,引用資料型別拷貝的是地址 (簡單理解: 如果是單層物件,沒問題,如果有多層就有問題)

常見方法:

  1. 拷貝物件:Object.assgin() / 展開運算子 {...obj} 拷貝物件
  2. 拷貝陣列:Array.prototype.concat() 或者 [...arr]

直接賦值和淺拷貝區別:

直接賦值的方法,只要是物件,都會相互影響,因為是直接拷貝物件棧裡面的地址

淺拷貝:如果是一層物件,不相互影響,如果出現多層物件拷貝還會相互影響

// 淺拷貝:只拷貝最外面一層
const obj = {
  uname : '小明',
  age : 18,
  gender : 'man',
  color : ['red', 'green', 'yellow'],
  family : {
    mother : 'mama',
    father : 'baba'
  }
}
// const o = {}

// 基本型別,棧中存的是資料,拷貝的也是資料
// 引用資料型別,棧中存的是資料在記憶體中的地址,拷貝的也是地址

// 方法1:遍歷
// 有該屬性就修改屬性值,沒有該屬性就新增屬性
//// o['uname'] = obj['uname']
// for (const key in obj) {
//   o[key] = obj[key]  
// }

// 方法2:Object靜態方法:assign:將後面物件中的成員新增到前面物件(修改/新增)
// Object.assign(o,obj)

// 方法3:擴充套件運算子
const o = {...obj}


// 如果是簡單資料型別拷貝值,引用資料型別拷貝的是地址 
// (簡單理解: 如果是單層物件,沒問題,如果有多層就有問題)
o.age = 20
o.color[0] = 'pink'
o.family.mother = '媽媽'
console.log(o, obj)

深拷貝

深拷貝:拷貝的是物件,不是地址

常見方法

通過遞迴實現深拷貝

函式遞迴:

如果一個函式在內部可以呼叫其本身,那麼這個函式就是遞迴函式

簡單理解:函式內部自己呼叫自己, 這個函式就是遞迴函式

遞迴函式的作用和迴圈效果類似

由於遞迴很容易發生“棧溢位”錯誤(stack overflow),所以必須要加退出條件 return

let num = 1

function fn () {

  console.log(`第${num}次列印`)

  if(num >= 6) {
    return
  }

  num++

  fn()
}

fn()

遞迴實現深拷貝

const obj = {
  uname : '小明',
  age : 18,
  gender : 'man',
  color : ['red', 'green', 'yellow'],
  family : {
    mother : 'mama',
    father : 'baba'
  }
}

const o = {}

// 利用遞迴
function deepCopy (newObj, oldObj) {

  for (const key in oldObj) {
    //  oldObj[key] : 當前屬性對應的屬性值
    // 必須先檢視陣列,因為陣列屬於物件,物件不一定是陣列
    // 檢視原型鏈中是否包含陣列  
    if (oldObj[key] instanceof Array){
      // 如果oldObj[key] 是陣列,那麼newObj[key]也得是陣列
      newObj[key] = []
      deepCopy(newObj[key], oldObj[key])
      
    } else if (oldObj[key] instanceof Object){
      // 如果oldObj[key] 是物件,那麼newObj[key]也得是物件
      newObj[key] = {}
      deepCopy(newObj[key], oldObj[key])

    }
    else {
      // 如果oldObj[key] 是基本資料型別,直接賦值
      newObj[key] = oldObj[key]
    }
  }
}

deepCopy(o, obj)

o.age = 20
o.color[0] = 'pink'
o.family.mother = '媽媽'
conso

lodash/cloneDeep

利用js庫 lodash裡面的 _.cloneDeep()

語法:const o = _.cloneDeep(obj)

通過JSON.stringify()實現

利用JSON字串轉換

語法:const o = JSON.parse(JSON.stringify(obj))

<script src="./js/lodash.min.js"></script>
<script>
  const obj = {
    uname : '小明',
    age : 18,
    gender : 'man',
    color : ['red', 'green', 'yellow'],
    family : {
      mother : 'mama',
      father : 'baba'
    }
  }

  // 利用js庫 lodash裡面的 _.cloneDeep()
  // const o = _.cloneDeep(obj)

  //利用JSON字串轉換
  const o = JSON.parse(JSON.stringify (obj))

  o.age = 20
  o.color[0] = 'pink'
  o.family.mother = '媽媽'
  console.log(o, obj)//o,obj互不影響
</script>