鍍金池/ 問答/HTML/ 一個功能可以用尾遞歸實(shí)現(xiàn)是不是可以用循環(huán)實(shí)現(xiàn)的充要條件?

一個功能可以用尾遞歸實(shí)現(xiàn)是不是可以用循環(huán)實(shí)現(xiàn)的充要條件?

我想用js以循環(huán)或者尾遞歸的方式實(shí)現(xiàn)對字面量對象的深克隆,請問如何實(shí)現(xiàn)?

回答
編輯回答
咕嚕嚕

如果沒有必要的話,直接 JSON.parse(JSON.stringify(obj)) 最好了,下面的代碼,應(yīng)該是深克隆,包括數(shù)據(jù),訪問器,和Symbol 屬性,來源 MDN

var obj = {
  foo: 1,
  get bar() {
    return 2;
  }
};
// 下面這個函數(shù)會拷貝所有自有屬性的屬性描述符
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 默認(rèn)也會拷貝可枚舉的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 } }
2017年12月11日 16:55