关于js里面的传引用问题?

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

阅读 2.6k
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 这样的操作的时候,等于是一个新的地址了,每个变量都是相互独立的。


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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题