JS 中賦值語句的秘密

2021-09-11 15:40:22 字數 2545 閱讀 1175

今天再學習ts的列舉型別的時候,對ts解釋成js後的**有疑問。帶著疑問,一步步追根溯源,最終有了這篇文章。

這是一段簡單的ts**解析成js**的例子。

左邊是ts**,簡單的宣告乙個列舉型別。 右邊是解析出來的js**。

direction[direction["up"] = 1] = "up";

direction[direction["down"] = 2] = "down";

direction[direction["left"] = 3] = "left";

direction[direction["right"] = 4] = "right";

複製**

這幾句**,引起了我的注意。 因為,這四句**中,有8個賦值操作。

賦值操作1:direction["up"] = 1

賦值操作2:direction[1] = "up"

賦值操作3:direction["down"] = 2

賦值操作4:direction[2] = "down"

賦值操作5:direction["left"] = 3

賦值操作6:direction[3] = "left"

賦值操作7:direction["right"] = 4

賦值操作8:direction[4] = "right"

為什麼會有direction[1] = "up"這類賦值呢?

經查閱資料發現,原來每個賦值語句都有返回值的(叫返回值可能不太準確,先這麼叫著吧...?)

具體是這樣的:

可以看到,宣告變數的時候,返回值是undefined,aaa=2的時候,返回值是2.

所以賦值的時候,是有返回值。並且這個返回值是賦值號=右邊的值。如下圖:

所以,上面的ts解析出來的js**就可以讀懂了。

direction[direction["up"] = 1] = "up"

// 相當於

direction["up"] = 1

direction[1] = "up"

複製**

b = a = 10

複製**

以前的認知(可能是學過c和c++的原因,留下了印象。),賦值語句是從右往左執行的。 上面的語句是預設是 10賦值給a,a賦值給b。很簡單,我們知道a的值是10b的值也是10但是,因為a = 10有返回值(10),所以b的值是從a來的還是從這個(10)來的呢?

我們來看乙個例子:

var a = 

a.myname = a =

console.log(a) //

console.log(a.myname) // undefined

複製**

按我們正常的理解,連續賦值語句,從右往左賦值,那麼應該是a =, a.myname = a。所以,輸出的結果應該都是,但是,事與願違,並不是這個結果。

這是怎麼回事啊?

於是做了以下測試:

var a = 

var b = a

b.name = '你好'

console.log(a.name) // 你好

console.log(b.name) // 你好

複製**

上述**解析:

再看乙個例子:

var a = 

var b = a

b =

console.log(a.name) // hotao

console.log(b.name) // 你好

複製**

當執行b=給b賦了乙個新的記憶體位址(a2),所以,變數a和變數b已經指向不同的位址,他們兩個現在毫無瓜葛了。

我們再反過來看一下連續賦值的問題:

var a = 

var b = a

a.myname = a =

console.log(a) //

console.log(a.myname) // undefined

console.log(b) // }

console.log(b.myname) //

複製**

**解析:

Python變數賦值的秘密

在python中,我們令乙個變數等於另外乙個變數時,並不是把值傳遞給它,而是直接把指向的位址更改了。我們想要檢視乙個變數在記憶體中的位址,可以通過id 變數 來檢視。我們通過乙個小例子來看看這個有趣的過程。x 12 y 13 id x 1865402384 id y 1865402416 x y i...

Python變數賦值的秘密

在python中,我們令乙個變數等於另外乙個變數時,並不是把值傳遞給它,而是直接把指向的位址更改了。我們想要檢視乙個變數在記憶體中的位址,可以通過id 變數 來檢視。我們通過乙個小例子來看看這個有趣的過程。x 12 y 13 id x 1865402384 id y 1865402416 x y i...

Python變數賦值的秘密分享

在python中,我們令乙個變數等於另外乙個變數時,並不是把值傳遞給它,而是直接把指向的位址更改了。我們想要檢視乙個變數在記憶體中的位址,可以通過id 變數 來檢視。我們通過乙個小例子來看看這個有趣的過程。x 12 程式設計客棧y 13 id x id y x y id x id y 首先給x變數賦...