runzhq / my_record

0 stars 0 forks source link

JS中的深拷贝 #6

Open runzhq opened 6 years ago

runzhq commented 6 years ago

浅拷贝:拷贝的是数组或者对象的引用 深拷贝:将原数组或者对象的值拷贝过来,是值而非引用 深拷贝中涉及的问题:拷贝深度 1、深拷贝数组(第一层) 遍历、slice()、concat() 但是,数组元素是对象或者数组时都会失效 2、深拷贝对象 遍历、Object.assign()、ES6扩展运算符 问题同上 3、深拷贝(所有层级,不含func\正则)
3.1 JSON.parse(JSON.stringify(old));

var array = [
  { number: 1 },
  { number: 2 },
  { number: 3 }
];
var copyArray = JSON.parse(JSON.stringify(array));
copyArray[0] = 'change';
console.log(array);
console.log(copyArray);

3.2递归

function deepCopy(obj) {
  if (typeof obj !== 'object'){
    return;
  }
  var newObj = obj.constructor === Array ? []:{};
  for(var i in obj){
    newObj[i] = typeof newObj[i] === 'object'? deepCopy(obj[i]):obj[i];
  }
  return newObj;
}

4、immutable 在改变新的数组(对象)的时候,不改变原数组(对象)

const { Map } = require('immutable')
const map1 = Map({ a: 1, b: 2, c: 3 })
const map2 = map1.set('b', 50)
map1.get('b') // 2
map2.get('b') // 50

小小的总结下:JSON、递归、immutable