扫码关注官方订阅号
比如有两个变量,两个都是数字,var a=1;然后把a的值赋给b,var b=a;怎么做到当a变化的时候,b也随着变化?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
这的确是一个有趣的问题. 闲来无事, 我就去实验了一下.首先, 因为要达到楼主说的方法, 那么就要想法设法把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 这样的操作的时候,等于是一个新的地址了,每个变量都是相互独立的。
其实这方面的理论我也不是太肯定,说的不对的话见谅。
值引用的变量是无法达到这样的效果的。如果是C语言这种,可以直接把a、b变量指向同一个内存地址,就可以达到你这样的效果。但是js是没有这样的功能的,只能通过对象来间接达到这样的效果,因为js的对象变量全部都是引用。
这是语言的局限性,做不到这样的要求。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
这的确是一个有趣的问题. 闲来无事, 我就去实验了一下.
首先, 因为要达到楼主说的方法, 那么就要想法设法把a, b弄成引用类型. 如果用一楼的方法的话, 那就离题啦. 那当然不是我想要的.
于是我先尝试了这个:
失败了! 虽然b的确是引用了a引用的对象, 二者也的确指向了同一个对象. 但是,当对a赋值时, a就自动被转换成了number类型. 不再是一个对象, 那就更谈不上更改b所指对象的值啦.
那么我们必须要想一个办法, 修改表示Number对象的数值的那一个属性的值, 如果这个属性[writable]为true,那么我们就可以通过直接改变这个属性的值, 来改变对象的值. 如果是false, 那么我们还可以试试用Object.defineProperty()方法(如果[configurable]不为false的话). 但是坑爹的就是, 这个方法也需要传入这个属性名做参数.
现在问题已经出来了, 只要我们能找到这个属性的名字, 到底是Number对象的哪一个属性, 表示了Number对象的数值. 且这个属性至少[configurable]不为false, 那么我们就可以达到楼主的目的. 但是很遗憾, 我翻遍了MDN关于Number对象属性的文档,还是没能找出这个属性到底是谁. 所以这个问题到底有没有答案呢? 或许只有真正的大神才知道. 至少我是不知道.
据我所知,值类型的变量是无法达到这种效果的。
但如果是这样的代码
因为这是引用类型的数据,x跟y都是指向同一个内存地址。
而值类型的在进行 y = x 这样的操作的时候,等于是一个新的地址了,每个变量都是相互独立的。
其实这方面的理论我也不是太肯定,说的不对的话见谅。
值引用的变量是无法达到这样的效果的。
如果是C语言这种,可以直接把a、b变量指向同一个内存地址,就可以达到你这样的效果。
但是js是没有这样的功能的,只能通过对象来间接达到这样的效果,因为js的对象变量全部都是引用。
这是语言的局限性,做不到这样的要求。