通过引用复制对象是否有实际用途

Is there a practical use for copying an object by reference?

本文关键字:是否 引用 复制 对象      更新时间:2023-09-26

Javascript通过引用复制对象,而不是从字面上复制对象。例如:

var myObject = {};
var myCopy = myObject;
myObject.foo = "bar";
alert(myCopy.foo); //alerts "bar"

但是我真的很难想到这样做的实际原因,除了给开发人员一种使代码稍微更具可读性的方法(因为您可以为同一对象提供不同的名称)。

最有可能的事情是我没有抓住要点,所以谁能告诉我那个要点是什么?

写完后:

var myObject = {};

在内存的某个地方有一个对象,您可以通过名称myObject引用它。下面的赋值:

var myCopy = myObject;

…说myCopy现在指的是同一个物体,无论它在哪里。这与给函数提供参数时发生的事情是一样的:

function somefunc(localName) {
    // body
}
someFunc(myCopy);

现在有一个名为localName的变量,它是local to someFunc,它也指向内存中的同一个对象。

这是我们传递对象引用的基本方式,这样它就可以在不同的作用域中以不同的名称被引用。

我们可以将整个结构复制到内存中的新位置。没有什么能阻止设计师创造出这样一种语言。但它的效率较低——想想深度嵌套的对象——通常不是您想要做的。例如,如果一个函数修改了对象的一个属性,那么它需要返回整个对象,以使该更改在函数外部持久存在。调用者需要处理返回值,决定是否需要保留旧对象,或者新创建的稍微不同的副本是否可以覆盖它。

再次强调,这个设计方向在原则上没有错;

看情况;在您的情况下,它可能相当令人困惑,因为它没有真正的目的。但是,对于到对象的较长路径,将对象存储在单独的变量中可能是有利的,因为它需要为使用该对象的每个语句输入较少的类型,例如以下示例:

var style = document.getElementById("foo").style;
style.color = "red";
style.font = "sans-serif";
// ...

我的观点(仅此而已)是,通过引用(而不是复制)创建对象通常更有用,也是用户想要的。如果您将一个对象作为参数传递给一个方法,那么您(几乎总是)对该方法正在处理和修改的对象感兴趣,而不是处理一个副本(而不修改原始对象)。显然,在某些情况下,这是不正确的,这将是很好的选择,但我不记得曾经发现自己希望我可以只是传递一个对象副本给一个方法,我通常非常感激,我正在工作的东西是东西。