阿里的一道筆試題,錯誤率極高,但瞭解堆棧機制後,秒變送分題


阿里的一道筆試題,錯誤率極高,但瞭解堆棧機制後,秒變送分題



阿里19年一道JS填空題

題目是這樣的,輸出下列結果:

let a = {n:4};
let b=a;
a.x=a={n:2};
console.log(a.x);
console.log(b);

如果你能在30秒之內得出結果,且結果跟文章末尾結果一致,那不用浪費時間了,你基礎掌握很好,這種就屬於,會的很容易,不會的真難!

JS程序運行機制

1、我們知道瀏覽器要執行上面js代碼,需要提供一個運行環境,當然現在的高級語言,執行時候提供的運行環境也大同小異。無非在內存中開闢堆棧內存,並由一個主線程在內存中按進棧出棧方式順序執行代碼語句。


2、首先看棧內存:它有兩個作用,一是執行代碼,二就是存儲變量和基本類型值,那它就需要空間來存儲這2個值,棧內存大概的結構看下圖:


阿里的一道筆試題,錯誤率極高,但瞭解堆棧機制後,秒變送分題

3、分析過程

有了上面的圖,只要把代碼一行一行的代入進去,例如看第一個語句執行:

let a = {n:4};

分三步來理解:定義一個變量a,取值一個對象類型(n:4),然後把a和對象類型做一個關聯。對象類型不能在棧內存中存儲,只能新增一個堆內存,然後把它的堆內存地址存儲在值存儲空間中,可通過地址AAAA找到堆內存中的對象。


阿里的一道筆試題,錯誤率極高,但瞭解堆棧機制後,秒變送分題

看第二個語句:

let b=a;

定義一個變量b,使得b與a關聯,a的地址是AAAA,那麼讓b指向AAAA即可



阿里的一道筆試題,錯誤率極高,但瞭解堆棧機制後,秒變送分題

第三個語句:

a.x=a={n:2};

這裡要說明一下,連等運算,在高等語言中都是拆開計算,例如 a = b=3,拆成 a = 3;b= 3;

好那上述代碼就拆開成為:

a.x={n:2};
a={n:2};

看開頭的理解變量定義過程:因為a是已經定義好的,所以無需再定義,但是n:2是新的對象類型值,所以又開闢一個堆內存空間地址假設為BBBB,然後讓a.x關聯新對象類型n:2。(a .x)可理解是給a增加一個x的屬性。

最後把a指向新的對象BBBB(n:2),同時刪除原指向AAAA的關聯。最後關係如下圖:


阿里的一道筆試題,錯誤率極高,但瞭解堆棧機制後,秒變送分題

最終結果

有了上面的最終圖,是不是就很容易得出答案了

console.log(a.x);

此時a指向BBBB的對象,此對象並沒有x屬性

所以它的結果為

undefined

console.log(b);

此時b指向AAAA的對象,它最後有2個屬性,一個是n,一個是x,n的值不變還是4,x的值指向BBBB的對象,值為n:2,所以結果為:

{n:4,x:{n:2}}


你做對了嗎?阿里的題目還是一如既往的坑 ,但是通過畫圖並瞭解堆棧機制之後,還是很容易理清對象的關係。

如果本文對你有用,請加關注!後續會有更多的運維開發知識分享!


分享到:


相關文章: