javascript中的对象如何赋值而不是修改地址?
阿神
阿神 2017-04-10 15:02:46
[JavaScript讨论组]

如题比如

<script type="text/javascript">
        a={
            q:1,
            w:2,
            e:3
        }
        b = a
        a.q='q'
        console.log(b.q)
</script>

如何让控制台输出的对象也是(我的意思是让赋值的时候不是修改b所指向的地址,而是将b的值赋给a)

{
    q:3,
    w:4,
    e:5,
}
阿神
阿神

闭关修行中......

全部回复(6)
怪我咯

JavaScript的变量分成引用类型和基本类型。对象是引用类型的值,所以对对象的操作实际是操作对象的引用而不是操作实际的对象。所以b = a其实另b指向了a同一份内存空间,因此a.q其实也改变了b的q,输出的应该是‘q’.

写了个函数,看看还不是你想要的:

var a = {
     q:1,
     w:2,
     e:3
}

function copyAndModify(oldObj, name, value) {
    var newObj = oldObj;
    newObj[name] = value;
    return newObj;
}
var b = copyAndModify(a, 'q', 'q');

console.log(b);
伊谢尔伦

DeepClone 是传统的做法,现在兴起的做法可以留意一下 Facebook 的 immutable.js,也有不少类似的。

高洛峰

有个笨办法是

var b = JSON.parse(JSON.stringify(a));

更靠谱的是_.clone_.cloneDeep

ringa_lee
function extend(to, from) {
  for (var key in from) {
    to[key] = from[key];
  }
  return to;
};

var a = {
  q:1,
  w:2,
  e:3
};
var b = {};
extend(b, a);
a.q = 'q';
console.log(b.q)
天蓬老师

提问有一句怎么没看懂,“我的意思是让赋值的时候不是修改b所指向的地址,而是将b的值赋给a”,难道不是要把a的值赋给b吗?

伊谢尔伦

百度一下深拷贝吧~~,感觉题主问的是这个

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号