【问题标题】:Are variables/objects passed by value and why can't I change object's property with variable in javascript? [duplicate]变量/对象是按值传递的,为什么我不能在 javascript 中用变量更改对象的属性? [复制]
【发布时间】:2016-08-20 07:06:05
【问题描述】:

假设我有一个对象:

var obj = {
        len: 4,
        bred: 5
    }

现在假设我将这个对象分配给变量x 作为var x = obj;。据我了解,它会创建obj 的副本并将该副本分配给x — 即按值传递。现在,如果我更改 x 的属性,那么它也会更改 obj 对象的该属性。例如

x.len = 99

然后obj.lenx.len 都变成99。另一方面考虑这种情况:

var r = 2, s = 3, t = 4; 
s = r;
s = 88;

现在r 被按值传递给ss 的一个副本r 被提供给s。所以将s 更改为88 不会改变r 变量的原始值。在控制台中输入r 仍然会给出2

问题 1:如果变量(包括对象)在 JavaScript 中按值传递,那么为什么更改 x.len 也会更改原来的 obj.len

另一个问题是我无法在分配给变量时更改对象的属性。考虑这种情况:

var obj2 = {
        len: 4,
        bred: 5
    }
var x2;
x2 = obj.len;

现在在控制台中输入x2 只会返回4。但是,如果我尝试更改 x2 的值,例如 x2 = 77;,则不会更改 obj2.len

问题2:为什么我不能用变量改变对象的属性?

【问题讨论】:

标签: javascript html object pass-by-reference pass-by-value


【解决方案1】:

一切都是按值传递的,但是当您创建一个对象时,您会获得对该对象的引用。

// Create an object. Assign a reference to that object to `obj`
var obj = {
    len: 4,
    bred: 5
};
// Copy the value of `obj` to `x`. Now `x` is also a reference to that object.
var x = obj;

xobj 的属性的任何更改现在都将修改同一个对象,因为它们会通过相同引用的副本。


var obj2 = {
    len: 4,
    bred: 5
}
var x2;
x2 = obj.len;

len 是一个数字,而不是一个对象,所以这个值不是一个引用。所以当你复制它时,你会得到一个数字的副本(而不是对对象的引用的副本)。

【讨论】:

    【解决方案2】:

    原始类型(字符串、数字、布尔值、null、未定义和符号)按值传递;对象也是按值传递的,但传递的值是它们的引用。

    据我了解,它会创建 obj 的副本并将该副本分配给 x ——即按值传递。

    不,x 被分配了对 obj 的引用值的副本。 x 然后指向obj。通过任一引用进行的修改将修改同一个对象。

    另一方面,obj.len 包含一个原语,因此其自身的值被复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-11
      • 2013-06-25
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多