美文网首页
📎js深度拷贝

📎js深度拷贝

作者: 索隆萨克 | 来源:发表于2019-05-06 16:28 被阅读0次

    方法1 定义方法clone

    function clone(obj) {
      let copy;
      if (obj instanceof Array) {
        copy = [];
        let i = obj.length;
        while (i--) {
          copy[i] = clone(obj[i]);
        }
        return copy;
      } else if (obj instanceof Object) {
        copy = {};
        for (let k in obj) {
          copy[k] = clone(obj[k]);
        }
        return copy;
      } else {
        return obj;
      }
    }
    

    方法1缺点:无法拷贝函数

    方法2 使用 JSON.stringify 和 JSON.parse 方法

    var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]
    var new_arr = JSON.parse( JSON.stringify(arr));
    console.log(new_arr);   //  [ 'old', 1, true, [ 'old1', 'old2' ], { old: 1 } ]
    

    方法2缺点:同样无法拷贝函数

    方法3 定义deepClone函数

    function deepClone(source) {
      // 递归终止条件
      if (!source || typeof source !== 'object') {
        return source;
      }
      var targetObj = source instanceof Array ? [] : {};
      for (var key in source) {
        // 该方法会忽略掉那些从原型链上继承到的属性。
        if (source.hasOwnProperty(key)){
        // 避免死循环对象属性
          if(source[key] === source){
            console.warn(new Error('circular object'))
          }else if (source[key] && typeof source[key] === 'object') {  //数组 typeof的结果也是object
            targetObj[key] = deepClone(source[key]);
          } else {
            targetObj[key] = source[key];
          }
        }
      }
      return targetObj;
    }
    var object1 = {'year':12, arr: [1, 2, 3], obj: {key: 'value' }, func: function(){return 1;}};
    var object2 = [1,[2,[3,4,[5,6]]]]
    var newObj= deepClone(object1);
    var newObj2 = deepClone(object2)
    console.log(newObj)  // { year: 12,arr: [ 1, 2, 3 ],obj: { key: 'value' }, func: [Function: func] }
    console.log(newObj2) // [ 1, [ 2, [ 3, 4, [Array] ] ] ]
    

    相关文章

      网友评论

          本文标题:📎js深度拷贝

          本文链接:https://www.haomeiwen.com/subject/nildoqtx.html