JavaScript函数传参疑问:修改对象属性后类实例属性未同步?
问题解答:为什么修改y.Value后test1的y属性没变化?
嘿,这是个JavaScript新手很容易踩的坑,我来帮你把逻辑理清楚~
你遇到的核心问题是JavaScript中基本类型和引用类型的传递方式不同:
- 像数字、字符串、布尔值这类基本类型,是按值传递的——也就是说,当你把它们作为参数传递时,实际上是把值复制了一份,函数/构造函数拿到的是这个副本,和原变量没有关联。
- 而对象、数组这类引用类型,是按引用传递的——传递的是指向内存中对象的引用,函数/构造函数拿到的和原变量指向同一个对象,修改对象的属性时,原对象和副本都会看到变化。
回到你的代码:
var Test = class Test { constructor(var_x, var_y) { this.x = var_x; this.y = var_y; } }; var y = {Value: 2}; var test1 = new Test(0, y.Value); // 这里传递的是y.Value的数值2(基本类型) y.Value +=2; // 修改的是y对象里的Value属性,和test1.y无关 console.log(test1); // 输出(0,2)
当你调用new Test(0, y.Value)时,y.Value的当前值是2,这个数值被复制了一份传给构造函数的var_y参数,然后test1.y就保存了这个复制的2。之后修改y.Value只是改变了y对象里的属性值,和test1.y已经没有任何关系了,所以它还是2。
如果想要实现修改y.Value后test1的对应值也跟着变,你需要传递整个y对象(引用类型),而不是它的Value属性,比如:
var Test = class Test { constructor(var_x, var_obj) { this.x = var_x; this.obj = var_obj; // 保存对象的引用 } }; var y = {Value: 2}; var test1 = new Test(0, y); y.Value +=2; console.log(test1.obj.Value); // 现在会输出4
这时候test1.obj和y指向同一个对象,所以修改y.Value时,test1.obj.Value也会同步变化。
内容的提问来源于stack exchange,提问作者Letchi
相关产品推荐
相关产品推荐

