js 實現對象深拷貝

/**
 * 深拷貝
 * @param {*} obj 需拷貝的對象
 * @returns 深拷貝後的對象
 */
function copyObj (obj) {
  // 對於原始類型和常見的非值,直接返回原來值
  if ([NaN, null].includes(obj)) return obj
  if (['number', 'string', 'boolean', 'null', 'undefined', 'function', 'symbol'].includes(typeof obj)) {
    return obj
  }

  const objCopy = Array.isArray(obj) ? [] : {}
  for (const key in obj) {
    objCopy[key] = typeof obj[key] === 'object' ? copyObj(obj[key]) : obj[key]
  }
  return objCopy
}
var obj1 = {
  name: 'zhangsan',
  age: 18,
  details: {
    like: ['打籃球', '唱歌'],
    sex: 1,
    tags: [18, 23]
  }
}

var r1 = copyObj(NaN) // NaN
console.log(r1)
var r1 = copyObj(null)
console.log(r1) // NaN
var r1 = copyObj(1)
console.log(r1) // NaN
var r1 = copyObj('test')
console.log(r1) // 'test'
var r1 = copyObj(true)
console.log(r1) // true
var r1 = copyObj(undefined)
console.log(r1) // undefined
var r1 = copyObj(() => { })
console.log(r1) // () => { }
var obj2 = copyObj(obj1)
console.log('obj2', obj2, `obj1 是否等於 obj2, ${obj1 === obj2}`)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章