JavaScript 連等賦值
JavaScript賦值運算是最為簡單的操作之一。
甚至可以說,即便最為基礎薄弱的學習者,對此操作的應用也是充滿信心。
程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼let webName="螞蟻部落";
上述程式碼宣告變數webName,並賦值"螞蟻部落"。
毫無疑問,上面的賦值操作極其簡單,再來看如下程式碼:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let oneObj={webName:"螞蟻部落"}; let twoObj=oneObj; oneObj.ant=oneObj={webName:"百度"}; // 列印結果 console.log(oneObj.ant); console.log(twoObj.ant);
程式碼執行效果截圖如下:
上述程式碼是一個連等賦值,列印結果很多朋友可能無法理解。
很多看似簡單的操作,其中也牽涉著很多重要的知識,下面分佈進行分析。
一.左值與右值:
看如下形式賦值語句:
[JavaScript] 純文字檢視 複製程式碼A=B
上面是一個賦值表示式,兩個運算元也是表示式,但是有區別:
(1).A必須是左值。
(2).B可以是任意表示式。
左值強調的是引用地址,也就是儲存資料的記憶體地址,右值強調的是資料值,也就是將要被儲存的資料。
賦值運算,首先會計算左側運算元,然後再計算右側運算元:
(1).首先計算運算元A,得到一個引用地址refA。
(2).然後計算運算元B,得到一個值valB。
(3).最後將值valB儲存到refA引用指向的地址,並返回值valB。
更多關於左值與右值內容參閱JavaScript 左值與右值一章節。
二.連等賦值結合性:
看如下賦值語句結構:
[JavaScript] 純文字檢視 複製程式碼表示式一=表示式二=表示式三=表示式四
連等賦值遵循右結合規則,上面連等賦值等同於:
[JavaScript] 純文字檢視 複製程式碼表示式一=(表示式二=(表示式三=表示式四))
從整體來看,表示式一與運算子右側所有內容形成一個大的賦值語句,右側又可以分解為小的賦值語句。
又由於,對單個賦值語句,首先計算左側運算數,然後再計算右側運算數,那麼上述連等賦值計算順序如下:
(1).計算表示式一,得到ref1。
(2).計算表示式二,得到ref2。
(3).計算表示式三,得到ref3。
(4).計算表示式四,得到val4。
三.程式碼分析如下:
經過上面的知識準備,下面再來分析文章開頭提出的問題。
[JavaScript] 純文字檢視 複製程式碼let oneObj={webName:"螞蟻部落"}; let twoObj=oneObj; oneObj.ant=oneObj={webName:"百度"};
為了闡述方便,分別給兩個物件直接量取別名mayi與baidu。
程式碼分析如下:
(1).前兩條語句很簡單,oneObj與twoObj指向同一個物件。
(2).下面分析第三條語句,它等同於oneObj.ant=(oneObj={webName:"百度"})。
(3).首先計算oneObj.ant,為oneOb所指向的物件新增一個屬性ant,物件mayi變為{webName:"螞蟻部落",ant:undefined},並得到oneObj.ant地址。
(4).然後將物件baidu賦值給oneObj,這時oneObj變為{webName:"百度"},並返回物件baidu,再將baidu賦值給oneObj.ant(不要以為這裡的oneObj指向賦值後的新物件{webName:"百度"},它依然指向最初的物件mayi,因為對它求值在oneObj={webName:"百度"}之前),那麼mayi物件變為{webName:"螞蟻部落",ant:{webName:"百度"}},twoObj指向此物件,所以twoObj.ant的值為{webName:"百度"}。
相關文章
- JavaScript 等號 = 賦值運算子JavaScript賦值
- Verilog連續賦值、過程賦值、過程連續賦值總結賦值
- JavaScript 物件解構賦值JavaScript物件賦值
- JavaScript 字串解構賦值JavaScript字串賦值
- JavaScript陣列解構賦值JavaScript陣列賦值
- JavaScript解構賦值的用途JavaScript賦值
- 教你認識Verilog 連續賦值賦值
- JavaScript函式引數解構賦值JavaScript函式賦值
- Javascript 解構賦值,將屬性/值從物件/陣列中取出,賦值給其他變數JavaScript賦值物件陣列變數
- Javascript學習筆記——4.11 賦值表示式JavaScript筆記賦值
- Python 賦值與運算子和連線符Python賦值
- JavaScript 同時宣告多個變數並賦值JavaScript變數賦值
- JavaScript 解構賦值小括號的應用JavaScript賦值
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- 變數的賦值 指標間接賦值變數賦值指標
- 常被新手忽略的值賦值和引用賦值(偏redux向)賦值Redux
- JavaScript的記憶體空間、賦值和深淺拷貝JavaScript記憶體賦值
- 解構賦值賦值
- 從 ECMA 規範解析 JavaScript 預設的取值和賦值行為JavaScript賦值
- C++,繼承,基類和派生類指標間賦值等知識C++繼承指標賦值
- JS解構賦值JS賦值
- 物件賦值轉換物件賦值
- php 自增賦值PHP賦值
- 理解Golang多重賦值Golang賦值
- jquery取值和賦值(包含部分是原生js的取值和賦值)jQuery賦值JS
- vue scrollTop 無法賦值Vue賦值
- vector訪問與賦值賦值
- python的賦值傳遞Python賦值
- 使用反射為特性賦值反射賦值
- 運算子-賦值運算子賦值
- (12)非阻塞賦值與阻塞賦值區別(以簡單例子說明)賦值單例
- 陣列未被賦值時其值為多少?陣列賦值
- JavaScript 左值與右值JavaScript
- ES6學習-4 解構賦值(1)陣列的解構賦值賦值陣列
- 【jquery】select下拉框賦值jQuery賦值
- jQuery radio的取值與賦值jQuery賦值
- es6-解構賦值賦值
- js 利用||和&&賦值小技巧JS賦值