在第一個示例中,可以理解獲取ienum2的更新值。num14
let num1 = 2;
num1 = 4;
let num2 = num1;
console.log(num1); // result 4
console.log(num2); // result 4
在第二個示例中,為什么不lastName獲取“firstName”的更新值,即“Henry”。
let firstName = "David";
let lastName = firstName;
firstName = "Henry";
console.log(firstName); // result Henry
console.log(lastName); // result David
是申報順序的問題嗎?
uj5u.com熱心網友回復:
不是宣告的順序,是賦值的順序。
num2 = num1; 將值從復制num1到num2。現在它們都包含相同的值。它們之間沒有持續的聯系,它們只是具有相同的價值。在您的第一個示例中,您在分配給 后立即查看值num2,因此您當然會看到相同的東西。
let lastName = firstName;也將值從復制firstName到lastName,并且它們之間也沒有持續的聯系,它們只包含相同的值。但是你在查看它們之前改變了值。firstName這只會改變 的值firstName,對 沒有任何影響lastName。
讓我們逐步看一下你的第二個例子:
宣告在進入代碼出現的范圍時被處理,創建變數(雖然沒有初始化它們;如果你試圖在不分配給它們的情況下使用它們,你會得到一個錯誤)。這給了我們這樣的記憶:
名字:<未初始化> 姓氏:<未初始化>
現在開始逐步執??行代碼:
執行初始化
firstName = "David"程式。現在我們有:名字:“大衛” 姓氏:<未初始化>
執行初始化
lastName = firstName程式。現在我們有:名字:“大衛” 姓氏:“大衛”
請注意,這兩個變數不以任何方式相互參考。它們只是具有相同的價值。
現在
firstName = "Henry"任務執行了,我們得到:名字:“亨利” 姓氏:“大衛”
該分配對沒有影響,
lastName因為變數之間沒有聯系。
您的示例都使用原語(在您的例子中是數字和字串;在正常情況下,字串是 JavaScript 中的原語,盡管在其他一些語言中它們是物件 [并且它們也可以在 JavaScript 中,這很不尋常])。在某些時候,有人會告訴你物件是不同的。他們錯了,這對物體來說是完全一樣的。只是存盤在變數中的值不是物件,它是對物件的參考,說明它在記憶體中的其他位置。將該參考想象成一個索引到記憶體塊中的數字。這不完全正確,但它是一個很好的心智模型。讓我們看看:
let a = {name: "Henry"};
let b = a;
console.log(a.name); // "Henry"
console.log(b.name); // "Henry"
a = {name: "David"};
console.log(a.name); // "David"
console.log(b.name); // "Henry"
這與您使用物件對基元所做的完全相同。讓我們來看看它:
宣告在進入范圍時處理:
一個:<未初始化> b: <未初始化>
現在開始逐步執??行代碼:
執行初始化
a = {name: "Henry"}程式。現在我們有:--------------------------------------- 一個:Ref45132---------------------------------->| (物件) | b: <未初始化> ?????????????? | 名稱:“亨利” | ---------------------------------------請注意 in 中的值
a不是實際物件,而是表示該物件在記憶體中其他地方的位置。(我將它顯示為Ref45132,但這只是為了讓我展示一些東西,你永遠無法真正觀察到 JavaScript 中參考的值)。執行初始化
b = a程式。現在我們有:一個:Ref45132------------------------------------------------------------------------------------------------------------------------------------------------------------------- | b: Ref45132---------------------------------------------------------- | | | vv --------------------------------------- | (物件) | --------------------------------------- | 名稱:“亨利” | ---------------------------------------這些變數不以任何方式相互參考,但它們都具有相同的值,并且該值表示物件所在的位置。所以它們都間接參考同一個物件。
第一個
console.log(a.name)和console.log(b.name)每個都被執行。由于變數參考同一個物件,因此無論我們使用哪個變數,我們都會得到相同的名稱。亨利 亨利
現在
a.name = {name: "David"};任務被執行了。這會改變 in 的值a(假設它從Ref45132to改變Ref91324),使其指向不同的 object,所以我們有:--------------------------------------- 一個:Ref91324------------------------------------------------------>| (物件) | --------------------------------------- b: Ref45132---------------------------------------------------------- | 名稱:“大衛” | | --------------------------------------- v --------------------------------------- | (物件) | --------------------------------------- | 名稱:“亨利” | ---------------------------------------第二個
console.log(a.name)和console.log(b.name)每個都被執行。由于變數參考不同的物件,并且物件具有不同的name屬性值,因此我們得到不同的名稱。大衛 亨利
接下來是人們感到困惑并想說它與物件不同的地方,讓我們看看在第一次記錄名稱后做一些不同的事情:
let a = {name: "Henry"};
let b = a;
console.log(a.name); // "Henry"
console.log(b.name); // "Henry"
a.name = "David"; // <=================== change is here
console.log(a.name); // "David"
console.log(b.name); // "David"
這與前面的示例非常不同a = {name: "David"}(并且與您的基元示例非常不同)并且您可以看到結果是不同的。所以發生了什么事?為什么改變改變了?和之間有聯系嗎?不,沒有。只是它們在其中具有相同的值,并且該值表示物件的位置,與變數無關。雖然我們正在使用獲取那個物件,但不是我們正在改變,而是我們正在改變的物件。由于是物件發生了變化,如果我們以另一種方式(例如,通過 )訪問物件,我們就會看到該變化。a.nameb.nameabaab
讓我們來看看它:
宣告在進入范圍時處理:
一個:<未初始化> b: <未初始化>
現在開始逐步執??行代碼:
執行初始化
a = {name: "Henry"}程式。現在我們有:--------------------------------------- 一個:Ref45132---------------------------------->| (物件) | b: <未初始化> ?????????????? | 名稱:“亨利” | ---------------------------------------請注意 in 中的值
a不是實際物件,而是表示該物件在記憶體中其他地方的位置。(我將它顯示為Ref45132,但這只是為了讓我展示一些東西,你永遠無法真正觀察到 JavaScript 中參考的值)。執行初始化
b = a程式。現在我們有:一個:Ref45132------------------------------------------------------------------------------------------------------------------------------------------------------------------- | b: Ref45132---------------------------------------------------------- | | | vv --------------------------------------- | (物件) | --------------------------------------- | 名稱:“亨利” | ---------------------------------------這些變數仍然不以任何方式相互參考,但它們都具有相同的值,并且該值表示物件所在的位置。所以它們都間接參考同一個物件。
第一個
console.log(a.name)和console.log(b.name)每個都被執行。它們都參考同一個物件,所以我們得到相同的名稱:亨利 亨利
現在
a.name = "David";任務被執行了。這改變了物件,它沒有改變a。a完全不受它的影響,原樣b。但是他們都參考的物件已更新,正如我們在這里看到的:一個:Ref45132------------------------------------------------------------------------------------------------------------------------------------------------------------------- | b: Ref45132---------------------------------------------------------- | | | vv --------------------------------------- | (物件) | --------------------------------------- | 名稱:“大衛” | ---------------------------------------因為它們都參考同一個物件,所以我們看到了相同的名稱:
大衛 大衛
區別在于a = {name: "David"}和a.name = "David"。前者創建一個新物件并更新中的值a以參考它。后者根本沒有改變a,它只是改變了a所指的物件。
uj5u.com熱心網友回復:
這是變數賦值(你標記了它)。
In let lastName = firstName,lastName不是任何型別的別名,firstName而是從另一個變數中獲取它的值(在您執行此指令時)firstName。之后,變數就有了自己的生命。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533727.html
