为了账号安全,请及时绑定邮箱和手机立即绑定

一个功能可以用尾递归实现是不是可以用循环实现的充要条件?

一个功能可以用尾递归实现是不是可以用循环实现的充要条件?

守着星空守着你 2019-02-26 17:55:35
我想用js以循环或者尾递归的方式实现对字面量对象的深克隆,请问如何实现?
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

如果没有必要的话,直接 JSON.parse(JSON.stringify(obj)) 最好了,下面的代码,应该是深克隆,包括数据,访问器,和Symbol 属性,来源 MDN

var obj = {

  foo: 1,

  get bar() {

    return 2;

  }

};

// 下面这个函数会拷贝所有自有属性的属性描述符

function completeAssign(target, ...sources) {

  sources.forEach(source => {

    let descriptors = Object.keys(source).reduce((descriptors, key) => {

      descriptors[key] = Object.getOwnPropertyDescriptor(source, key);

      return descriptors;

    }, {});


    // Object.assign 默认也会拷贝可枚举的Symbols

    Object.getOwnPropertySymbols(source).forEach(sym => {

      let descriptor = Object.getOwnPropertyDescriptor(source, sym);

      if (descriptor.enumerable) {

        descriptors[sym] = descriptor;

      }

    });

    Object.defineProperties(target, descriptors);

  });

  return target;

}


var copy = completeAssign({}, obj);

console.log(copy);

// { foo:1, get bar() { return 2 } }


查看完整回答
反对 回复 2019-03-08
  • 1 回答
  • 0 关注
  • 479 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信