jq的原始碼中有很多連續賦值,類似這樣的:
var a = ;var b = a; // 持有a,以回查
a.x = a = ;
alert(a.x);// --> undefined
alert(b.x);// --> [object object]
網上有很多解釋了,這裡我做一下記錄而已,化繁為簡,比較容易理解的過程是這樣的:
給,分別起名個實際持有這兩個記憶體位址的虛擬物件名字,比如:obj1 -》,obj2-》
1)var a = ; //定義了乙個指標a指向記憶體中的,即a = obj1->
2)var b = a;//定義了b也指向了記憶體中的,即b = obj1->
3)a.x = ;//本質是obj1.x = ,即改變的是a和b所指向的物件
4)a = ;//a的指標指向了obj2,是乙個新的物件
現在的結果是:
a:a = obj2 = ;
b:b = obj1 =
簡單幾點摘抄:
1、求值順序:從左到右
2、運算子的結合性:右結合,但也是從左到右求值
主要解讀 a.x = a = ; 這句的執行順序
按照上面兩條的規則來看:
1)求值從左到右,那就是先給a.x賦值即a.x = expression
2)解讀一下此時的a.x指向誰,此時a指向obj1-》,即給obj1.x賦值變成了obj1.x = expression
3)左邊解析完了,進入「=」的右邊,是乙個表示式(a=),這裡為啥不是乙個光禿禿的a呢,即為啥不是這樣的順序a.x = a,主要根據第二條,右結合性,
會把a = 看成乙個整體解析(這時候a的指標指向了obj2),返回的是
4)賦值,obj1.x = obj2 = ,第3步在解析過程中已經把a的指標指向obj2了,因此a.x(obj2.x)根本沒有這個屬性,obj1才有
比較難理解的是第三步,明白幾點:首先不是先計算右邊的值(即不是先計算a = ),而是先解析左邊的規則(指標)a.x,解析成obj1.x之後,才開始到右邊,
JS 連續賦值運算
首先來看一段 1 2 3 var o o.b o alert o.b undefined 以上第二句 o.b o 是乙個連續賦值表示式。那麼在這個過程中究竟發生了什麼呢?在ecmascript 3rd 文件中有關於賦值表示式的解釋 the production assignmentexpressio...
JS基礎 連續賦值
問題 根據js引擎語法解析,會先去從左到右尋找有沒有未宣告的變數,如果有就把該變數提公升至作用域頂部並宣告該變數。那麼恭喜js引擎他找到a.x這個屬性沒有宣告,那麼他會在這個記憶體區宣告乙個x屬性等待賦值!語法解析完成後,開始進行運算 ps 賦值運算 首先將a變數的指標指向了乙個新的記憶體區,那麼a...
assign連續賦值
一些verilog書上說assign用在連續型賦值的 下面是功能相同但寫法不同的兩段 第一段a module assign test a clk,lhold,lholda input clk input lhold output lholda reg lholda always posedge cl...