首先js分基本类型和引用类型
基本类型:Number,String,Boolean,Null,undefined
引用类型:函数,对象,数组
let a = 1 let b = a a = 2
基本类型key,value存储在栈内存中,当b=a时,会开辟新的内存,修改a不会影响b
let a = [1, 2, 3, 4] let b = a a[0] = 2
引用类型key存储在栈内存中,value存储在堆内存中,但是会有一个引用的地址指向堆内存中的值,修改a会影响b
浅拷贝的实现方式
简单粗暴的赋值
let simpleClone = (obj) => { let cloneObj = {} for (let i in obj) { cloneObj[i] = obj[i] } return cloneObj } let obj = { name: 'susan', age: 20, gameCharacters: { name: 'apple', age: 1 }, arr: [1, 2, 3], say () { console.log(`my name is: ${this.name}`) } } let obj2 = simpleClone(obj)
es6提供了Object.assign
let obj2 = Object.assign({}, obj)
深拷贝的方法
利用递归实现
let deepClone = (source, target) => { target = target || {} for (let k in source) { if (typeof source[k] === 'object') { target[k] = source[k].constructor === Array ? [] : {} deepClone(source[k], target[k]) } else { target[k] = source[k] } } return target }
转成json然后转换回来
JSON.parse(JSON.stringify(obj))
使用jquery的$.extend()方法
使用lodash的cloneDeep方法
浙公网安备 33010602011771号