You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象复制中,点语法与方括号语法赋值结果存在差异

为什么我的deepCopy2函数用点语法赋值无效,换成方括号就正常了?

这问题其实是JavaScript属性访问语法里的经典小坑,我给你掰扯明白:

你看你最初的代码里,target.prop = obj[prop]这行有个关键错误——JavaScript的点语法会把.后面的内容当成字面量字符串。也就是说,不管循环里prop的实际值是"username"还是"age",你每次都是在给target对象添加一个名叫"prop"的属性!后面的赋值还会覆盖前面的,最后你的target里只会剩下一个prop属性,完全没实现遍历拷贝的效果。

而改成方括号语法target[prop]就不一样了:方括号会对里面的表达式求值,把变量prop的实际值作为属性名。比如当prop是"username"时,target[prop]就等价于target["username"],这才是正确给target添加对应属性的方式。

给你贴出修改后的正确代码:

function deepCopy2(target, obj) {
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      if (typeof obj[prop] !== 'object') {
        target[prop] = obj[prop]; // 改用方括号语法
      } else {
        var embedded = {};
        deepCopy2(embedded, obj[prop]);
        target[prop] = embedded; // 这里同样改成方括号
      }
    }
  }
  return target;
}

最后再划个重点:

  • 点语法适合属性名是固定字面量的场景,比如user.name;
  • 当属性名是动态的(比如变量、字符串拼接结果),必须用方括号语法;
  • 你的循环里prop是动态变化的变量,所以只能用方括号才能完成正确的属性拷贝。

内容的提问来源于stack exchange,提问作者Matus Dubrava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:58:39