如果我返回一个对象,它是一个引用或不是?



我对软件世界很陌生,但我读过并有过这样的经历:

const obj1 = {key1: "val1", key2: "val2"};
// and then do this =>
const obj2 = obj1;
// obj2 isn't a new object but a reference to object 1
// which you can demonstrate with 
console.log(obj1);
obj2.key1 = "value3";
console.log(obj1);
// now key1 of object 1 has changed

但是我有点想知道在下面的情况下会发生什么。

const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
function getUrlParams(_urlParams) {
let retObj = new Object();
_urlParams.forEach(function(value, key) {
retObj[key] = value;
});
return retObj;
}
const urlArgs = getUrlParams(urlParams);

我真的想不出一种方法来测试urlArgs现在是否是对retObj的引用。我怀疑这是因为retObj是在函数内部定义的,当函数完成时不应该再存在。但是根据我对javascript的了解,我不太确定。

看了一些评论后,是否有办法测试

urlArgs === retObj;
// If urlArgs and retObj are both referencing the same object?

你缺少一些基本的知识,参考文献是如何工作的

两个物体

示例:console.log({ age: 42 } === { age: 42});=>returnfalse.

注意,为了比较对象的引用,你应该使用===

两个对象具有相同的值,但它们在内存中不是同一个对象。在您的示例中,您正在处理urlParams的所有属性,两个对象都将"看起来"。相同,但在内存中的位置将不完全相同。

相同的对象示例:

const person1 = { age: 42 }; // Creating a new object in memory, and pointing "person1" to it
const person2 = person1; // creating another point to the same object.
console.log(person1 === person3); // ==> returns true

你可以看到,当创建一个像这样的对象时:const person1 = { age: 42};做两件事,创建一个对象和对它的引用。下一行const person2 = person1;只创建一个对相同内存位置的新引用。

这就是为什么,当改变一个引用的age时,将反映在另一个引用(相同的内存)

原语

另一件需要理解的重要事情是,原语(数字、布尔值、字符串、符号和bigint)是而不是引用。
const a = 42;
const b = a; // this is a COPY, not a reference

释放内存

在Javascript中,所有变量都是"活的"(在内存中)只要有对它们的引用。当你在函数中定义一个变量时,这个变量是"活的"。在函数的作用域中。该函数执行完成后,变量被释放。

简而言之,当所有引用都消失时,内存将自动释放。(这叫做垃圾回收)。

在这个场景中,retObj更像一个类,因为它是一个对象制造工厂。每次传入参数时,您都在用retObj工厂构建一个完全不同的对象,并且在函数完成运行后,retObj将从内存中删除。

如果您将retObj移出getUrlParams函数,就像这样

const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
let retObj = new Object();
function getUrlParams(_urlParams) {
_urlParams.forEach(function(value, key) {
retObj[key] = value;
});
return retObj;
}
const urlArgs = getUrlParams(urlParams);

你可以使用它,但在这一点上,它将是全局级的,任何对数据的更改都会向上/向下传播,因为retObj将在内存中有一个专用空间,使urlArg成为对retObj的引用。

相关内容

  • 没有找到相关文章

最新更新