Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数通过调用自身复制JavaScript中的对象,需要帮助理解逻辑_Javascript_For Loop_Logic - Fatal编程技术网

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

函数通过调用自身复制JavaScript中的对象,需要帮助理解逻辑,javascript,for-loop,logic,Javascript,For Loop,Logic,我发现了这个用于复制对象的JavaScript代码,代码正在做它应该做的事情,但我不理解的是函数何时调用自身;为什么newObject在第一次迭代中没有丢失它的值,当函数调用自己并创建一个新的newObject时,它应该被覆盖?这是否意味着当函数调用自身时,它仍然保留在调用自身之前创建的第一个newObject的副本 const o = { a: 'a', b: 'b', obj: { key: 'key', }, } const o2 = o o2.a = 'new

我发现了这个用于复制对象的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)
const o={
a:‘a’,
b:‘b’,
obj:{
键:“键”,
},
}
常数o2=o
o2.a=‘新值’
//o和o2引用同一个对象
控制台日志(o.a)
//这个浅色的o复制成o3
常量o3=对象。赋值({},o)
//深度复制
功能复制(obj){
//检查VAL是否为对象
//如果是,复制该对象(深度复制)
//否则返回值
常量键=对象键(obj)
const newObject={}
for(设i=0;i
递归函数可能会令人困惑。一些位置合适的
console.log()
s或在调试器中运行代码确实有帮助。该函数为原始对象和对象中的每个子对象生成一个
newObject
。当递归展开时,它将父对象中的属性设置为子对象上递归调用的结果

您可以在这里的console.logs中看到效果:

const o={
a:‘a’,
b:‘b’,
obj:{
键:“键”,
更深:{1:1,2:2}
},
}
//深度复制
功能复制(obj){
console.log(“的深度副本:”,obj)
常量键=对象键(obj)
const newObject={}
for(设i=0;iconst o4=deepCopy(o)
递归函数可能会令人困惑。一些位置合适的
console.log()
s或在调试器中运行代码确实有帮助。该函数为原始对象和对象中的每个子对象生成一个
newObject
。当递归展开时,它将父对象中的属性设置为子对象上递归调用的结果

您可以在这里的console.logs中看到效果:

const o={
a:‘a’,
b:‘b’,
obj:{
键:“键”,
更深:{1:1,2:2}
},
}
//深度复制
功能复制(obj){
console.log(“的深度副本:”,obj)
常量键=对象键(obj)
const newObject={}
for(设i=0;iconst o4=deepCopy(o)
newObject是分配给“父”newObject的属性的值,因此可以得到一个嵌套对象。对函数的每次调用(包括递归调用)都会为局部变量创建一个新的上下文。新的递归函数调用有自己的私有
newObject
,与调用它的函数中的值不同。newObject是分配给“父”newObject属性的值,因此您得到一个嵌套对象。对函数的每次调用(包括递归调用)都会为局部变量创建一个新上下文。新的递归函数调用有自己的私有
newObject
,与调用它的函数中的值不同。“递归函数可能会混淆。”++“递归函数可能会混淆。”++