普通的浅克隆
for(let key in orgin) {} 会把原型链上的属性都克隆出来
let person = {name: 'Terence',age: 25,sex: 'male',height: 175,weight: 63,skill: ['html', 'css', 'js', 'node', 'webpack']}Object.prototype.num = 1let copyOne = {}function clone(target, orgin) {for (let key in orgin) {target[key] = orgin[key]}}clone(copyOne, person)console.log(copyOne, 'copyOne');console.log(person, 'person');
所以要把原型链上的剔除出来
hasOwnProperty
function clone(target, orgin) {for (let key in orgin) {orgin.hasOwnProperty(key) && (target[key] = orgin[key])}}
深克隆
Object.prototype.toString
Object.prototype.toString 在对象的时候是【object Object】 数组是 【object Array】
1.首先判断是不是 null
Object.prototype.toString
function deepClone(target, origin) {let toStr = Object.prototype.toStringlet arrType = '[object Array]'for (let key in origin) {if (origin.hasOwnProperty(key)) {console.log('key', key, toStr.call(origin[key]));if (typeof (origin[key]) === 'object' && origin[key] !== null) {// 引用值if (toStr.call(origin[key]) === arrType) {target[key] = []} else {target[key] = {}}deepClone(target[key], origin[key])} else {// 基础值target[key] = origin[key]}}}}
还有一种方法是使用JSON
通过把一个引用值变成一个基本类型,然后JSON转为对象,指针的指向和原来的不一样了,但是有个问题就是
JSON不能存储方法
let str = JSON.stringify(Object)let copyOne = JSON.parse(str)
