【问题标题】:Why can objects that are passed into a function be mutated but not reassigned in javascript? [duplicate]为什么传递给函数的对象可以被改变但不能在javascript中重新分配? [复制]
【发布时间】:2020-09-13 00:24:07
【问题描述】:

我是 Javascript 的初学者,需要澄清一下。我并不是真的想在这里取得任何特别的成就。只是对这种情况有点困惑。

当分配给对象的变量作为参数传递给函数时,我们可以永久地改变对象。但是,我们无法重新分配它并使更改生效。这是为什么呢?

这里是我的意思的一些示例代码:

示例 1 - 突变。

const house = {
  color1: 'white',
  color2: 'blue'
};

let paintIt = obj => {
  obj.color1 = 'gold'
};

paintIt(house);

house.color1 // Returns 'gold'

示例 2 - 重新分配。

let house = {
  color1: 'white',
  color2: 'blue'
};

let paintItReassignment = obj => {
  obj = {
    forSale : false,
    includesGarden : true
  }
  console.log(obj) // Prints {'forSale':false, 'includesGarden':true}
};

paintItReassigment(house) // The reassignment does not work
house // Still returns {color1:'white', color2:'blue'}

house = {
 forSale : false,
 includesGarden : true
}; // Regular reassignment still works

为什么当你修改对象属性(example1)时它会粘住,而当你重新分配它时(example2)却没有?

【问题讨论】:

    标签: javascript function object


    【解决方案1】:

    与其他一些编程语言(如 C)不同,JavaScript 混合使用传递引用和传递值系统进行函数调用。在函数中,您可以重新分配传递给它的对象的属性,但不能重新分配对象本身的变量。如果您希望重新分配对象变量,您始终可以执行以下操作:

    o = f(o);
    

    重新定义多个变量:

    var {a,b} = f(a,b)
    

    例如在哪里:

    function f(a,b){
        return {a:b,b:a};
    }
    

    关于这个话题的一些讨论可以在here找到。

    【讨论】:

    • 公平地说,这就像在 C 中将指针作为参数传递。如果分配给指针,则会覆盖引用,如果分配给指针的成员或取消引用的值,你改变了价值。这种按值传递引用的概念确实存在于 C 中,只是比 JavaScript 中更明确。
    • 如果ab 已经用letconst 声明,那么您的第二个示例也是非法的。
    • 我不确定比较是否真的公平。在 C 中,我们可以通过传递它的指针来重新分配变量,不是吗? const 变量不应该被改变。我想第二个示例的解决方法是传入一个“统一”对象,例如。 f({a,b}).
    • 我不清楚您认为比较“不公平”是什么。 “变量”是指参考价值还是基础价值?如果您的意思是引用,那么是的,这正是我所说的,并且函数调用处的指针引用不会通过直接分配给函数定义主体中的裸标识符来修改。
    • 你把比较搞错了。 JavaScript 总是使用按值传递(即使它们是引用值,即指向对象的指针)。另一方面,C 可以选择按值或按引用获取对象,而且您还可以对变量进行引用并传递它们。
    猜你喜欢
    • 2014-03-21
    • 2014-08-26
    • 2010-12-15
    • 1970-01-01
    • 2019-10-21
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多