普通的浅克隆
    for(let key in orgin) {} 会把原型链上的属性都克隆出来

    1. let person = {
    2. name: 'Terence',
    3. age: 25,
    4. sex: 'male',
    5. height: 175,
    6. weight: 63,
    7. skill: ['html', 'css', 'js', 'node', 'webpack']
    8. }
    9. Object.prototype.num = 1
    10. let copyOne = {}
    11. function clone(target, orgin) {
    12. for (let key in orgin) {
    13. target[key] = orgin[key]
    14. }
    15. }
    16. clone(copyOne, person)
    17. console.log(copyOne, 'copyOne');
    18. console.log(person, 'person');

    所以要把原型链上的剔除出来
    hasOwnProperty

    1. function clone(target, orgin) {
    2. for (let key in orgin) {
    3. orgin.hasOwnProperty(key) && (target[key] = orgin[key])
    4. }
    5. }

    深克隆
    Object.prototype.toString
    Object.prototype.toString 在对象的时候是【object Object】 数组是 【object Array】
    1.首先判断是不是 null

    1. Object.prototype.toString
    1. function deepClone(target, origin) {
    2. let toStr = Object.prototype.toString
    3. let arrType = '[object Array]'
    4. for (let key in origin) {
    5. if (origin.hasOwnProperty(key)) {
    6. console.log('key', key, toStr.call(origin[key]));
    7. if (typeof (origin[key]) === 'object' && origin[key] !== null) {
    8. // 引用值
    9. if (toStr.call(origin[key]) === arrType) {
    10. target[key] = []
    11. } else {
    12. target[key] = {}
    13. }
    14. deepClone(target[key], origin[key])
    15. } else {
    16. // 基础值
    17. target[key] = origin[key]
    18. }
    19. }
    20. }
    21. }

    还有一种方法是使用JSON
    通过把一个引用值变成一个基本类型,然后JSON转为对象,指针的指向和原来的不一样了,但是有个问题就是
    JSON不能存储方法

    1. let str = JSON.stringify(Object)
    2. let copyOne = JSON.parse(str)