JS 連續賦值運算

2021-07-02 11:41:31 字數 1167 閱讀 7190

首先來看一段**:

1

2

3

var o = ;

o.b = o = ;

alert(o.b); // undefined

以上第二句 o.b = o = 是乙個連續賦值表示式。那麼在這個過程中究竟發生了什麼呢?

在ecmascript(3rd)文件中有關於賦值表示式的解釋:

the production assignmentexpression : lefthandsideexpression = assignmentexpression is evaluated as follows:

evaluate lefthandsideexpression.

evaluate assignmentexpression.

call getvalue(result(2)).

call putvalue(result(1), result(3)).

return result(3).

左側得出的是引用,右側呼叫getvalue取得的是確定值。

然後我們來分析 o.b = o = 這個表示式。假設 這個物件為 obg1, 這個物件為obg2,全域性為global。

上述表示式的解析過程如下:o.b = expression1,而 expression1 為另乙個賦值表示式 o = 。

首先解析 o.b = expression1,步驟如下:

先取得引用 (obj1, "b") 。

然後解析 expression1 。這個解析過程的步驟如下:

先取得引用 (global, "o") 。

求賦值表示式的值: obg2 。

取得步驟 b 中的結果: obg2 。

將步驟 c 的結果賦值給步驟 a 的結果,即把 obg2 賦值給 (global, "o") 。

返回步驟 c 的結果,即 obg2 。

取得步驟 2 中的結果: obg2 。

將步驟 3 的結果賦值給步驟1的結果,即把 obg2 賦值給 (obj1, "b") 。

返回步驟 3 的結果,即 obg2 。

結果即為:

obg1:

obg2:

我們常說賦值運算是從右至左,是指右邊先結合。如果理解為右邊先運算就會有誤解了,雖然右邊先賦值成功。

JS基礎 連續賦值

問題 根據js引擎語法解析,會先去從左到右尋找有沒有未宣告的變數,如果有就把該變數提公升至作用域頂部並宣告該變數。那麼恭喜js引擎他找到a.x這個屬性沒有宣告,那麼他會在這個記憶體區宣告乙個x屬性等待賦值!語法解析完成後,開始進行運算 ps 賦值運算 首先將a變數的指標指向了乙個新的記憶體區,那麼a...

js連續賦值 指標

jq的原始碼中有很多連續賦值,類似這樣的 var a var b a 持有a,以回查 a.x a alert a.x undefined alert b.x object object 網上有很多解釋了,這裡我做一下記錄而已,化繁為簡,比較容易理解的過程是這樣的 給,分別起名個實際持有這兩個記憶體位...

奇特的JavaScript連續賦值運算

一 引子 var a a.x a alert a.x undefined 以上第二句 a.x a 是乙個連續賦值表示式。這個連續賦值表示式在引擎內部究竟發生了什麼?是如何解釋的?二 猜想 猜想1 從左到右賦值,a.x 先賦值為,但隨後 a 賦值為 即 a 被重寫了,值為 新的 a 沒有 x屬性,因此...