对象复制中,点语法与方括号语法赋值结果存在差异
为什么我的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
相关产品推荐
相关产品推荐

