javascript - 关于js里面的传引用问题?
高洛峰
高洛峰 2017-04-11 11:37:24
[JavaScript讨论组]

比如有两个变量,两个都是数字,var a=1;然后把a的值赋给b,var b=a;
怎么做到当a变化的时候,b也随着变化?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
迷茫

这的确是一个有趣的问题. 闲来无事, 我就去实验了一下.
首先, 因为要达到楼主说的方法, 那么就要想法设法把a, b弄成引用类型. 如果用一楼的方法的话, 那就离题啦. 那当然不是我想要的.
于是我先尝试了这个:

        var a = new Number(1),
            b = a;
        alert(a === b);//true
        a = 2;
        alert(b);//1

失败了! 虽然b的确是引用了a引用的对象, 二者也的确指向了同一个对象. 但是,当对a赋值时, a就自动被转换成了number类型. 不再是一个对象, 那就更谈不上更改b所指对象的值啦.

        alert(typeof a);//number
        alert(typeof b);//object
        a.name = "tiny";
        b.name = "tiny";
        alert(a.name);//undefined
        alert(b.name);//tiny

那么我们必须要想一个办法, 修改表示Number对象的数值的那一个属性的值, 如果这个属性[writable]为true,那么我们就可以通过直接改变这个属性的值, 来改变对象的值. 如果是false, 那么我们还可以试试用Object.defineProperty()方法(如果[configurable]不为false的话). 但是坑爹的就是, 这个方法也需要传入这个属性名做参数.
现在问题已经出来了, 只要我们能找到这个属性的名字, 到底是Number对象的哪一个属性, 表示了Number对象的数值. 且这个属性至少[configurable]不为false, 那么我们就可以达到楼主的目的. 但是很遗憾, 我翻遍了MDN关于Number对象属性的文档,还是没能找出这个属性到底是谁. 所以这个问题到底有没有答案呢? 或许只有真正的大神才知道. 至少我是不知道.

阿神

据我所知,值类型的变量是无法达到这种效果的。

但如果是这样的代码

var x = { a : 1 }, y = x;
y.a = 2;
console.log(x.a); // 这里会输出 2

因为这是引用类型的数据,x跟y都是指向同一个内存地址。

而值类型的在进行 y = x 这样的操作的时候,等于是一个新的地址了,每个变量都是相互独立的。


其实这方面的理论我也不是太肯定,说的不对的话见谅。

ringa_lee

值引用的变量是无法达到这样的效果的。
如果是C语言这种,可以直接把a、b变量指向同一个内存地址,就可以达到你这样的效果。
但是js是没有这样的功能的,只能通过对象来间接达到这样的效果,因为js的对象变量全部都是引用。

巴扎黑

这是语言的局限性,做不到这样的要求。

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

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