javascript - 函数通过调用自身来复制 JavaScript 中的对象,需要帮助理解逻辑

标签 javascript for-loop logic

我发现这段用于复制对象的 JavaScript 代码,该代码正在执行它应该执行的操作,但我不明白的是函数何时调用自身;为什么 newObject 在第一次迭代中不会丢失它的值,当函数调用自身并创建一个新的 newObject 时,它应该被覆盖?这是否意味着当函数调用自身时,它仍然保留在调用自身之前创建的第一个 newObject 的副本?

const o = {
  a: 'a',
  b: 'b',
  obj: {
    key: 'key',
  },
}

const o2 = o

o2.a = 'new value'

// o and o2 reference the same object
console.log(o.a)

// this shallow-copies o into o3
const o3 = Object.assign({}, o)

// deep copy
function deepCopy(obj) {
  // check if vals are objects
  // if so, copy that object (deep copy)
  // else return the value
  const keys = Object.keys(obj)

  const newObject = {}

  for (let i = 0; i < keys.length; i++) {
    const key = keys[i]
    if (typeof obj[key] === 'object') {
      newObject[key] = deepCopy(obj[key])
    } else {
      newObject[key] = obj[key]
    }
  }

  return newObject
}

const o4 = deepCopy(o)

o.obj.key = 'new key!'
console.log(o4.obj.key)

最佳答案

递归函数可能会令人困惑。一些放置得当的 console.log() 或在调试器中运行代码确实很有帮助。该函数为原始对象和对象中的每个子对象创建一个newObject。当递归展开时,它将父级中的属性设置为子级递归调用的结果。

您可以在此处的 console.logs 中查看效果:

const o = {
  a: 'a',
  b: 'b',
  obj: {
    key: 'key',
    deeper: {one: 1, two: 2}
  },
}


// deep copy
function deepCopy(obj) {
  console.log("deep copy of: ", obj)
  const keys = Object.keys(obj)

  const newObject = {}

  for (let i = 0; i < keys.length; i++) {
    const key = keys[i]
    if (typeof obj[key] === 'object') {
      console.log("setting child of", key, "to:")
      newObject[key] = deepCopy(obj[key])
    } else {
      newObject[key] = obj[key]
    }
  }

  return newObject
}

console.log("starting with")
const o4 = deepCopy(o)

deep copy of开头的每一行都表示在递归调用中新创建的newObject,但返回的唯一newObject是第一个 - 所有其他都设置为子级。

关于javascript - 函数通过调用自身来复制 JavaScript 中的对象,需要帮助理解逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56431619/

相关文章:

javascript - 如何获得两个时刻之间的日历周差?

javascript - 使用图片提交表单问题

javascript - 如何使用 javascript 将相对 href 属性转换为绝对路径?

sql - SSIS使用for循环容器不执行脚本任务和数据流任务

php - 无法使用PHP将所有数据插入MySQL

php - joomla mysql 日期数学逻辑

javascript - Canvas Transparency 创建永久残像

javascript - 在 angularjs 中处理 json 响应(来自 PHP 和 mysql)

javascript - 如何在 jQuery 中的两个 HTML 片段之间淡入淡出

javascript - 第一次单击时函数无法正确触发