我對軟體世界還很陌生,但是當你有一個物件時,我讀過并體驗過:
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?
uj5u.com熱心網友回復:
您缺少一些基本知識,即參考的作業原理。
兩個物件
例如:console.log({ age: 42 } === { age: 42});=> 回傳false。
請注意,為了比較物件的參考,您應該使用===.
這兩個物件具有相同的值,但它們在記憶體中不是同一個物件。在您的示例中,您正在處理 的所有屬性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 中,只要有對它們的參考,所有變數都是“活動的”(在記憶體中)。當你在函式中定義一個變數時,這個變數在函式的作用域中是“活躍的”。在這個函式執行完成后,變數被釋放。
簡而言之,當所有參考都消失時,記憶體會自動釋放。(這稱為垃圾收集)。
uj5u.com熱心網友回復:
在這種情況下,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 的參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/328708.html
標籤:javascript 目的
下一篇:物件陣列
