js筆試題之變量連續賦值題

先看一道筆試題:求打印結果

      var a = {s:"sss"};
      var b = a;
      a.x = a = {m:"mmm"};
      console.log(a.x);
      console.log(b.x);

先不說結果,說一下這個題的兩個考點

1.連續賦值的拆分

2.變量的類型以及它們的堆棧分配

下面就一一講一下這兩個點

1.連續賦值問題

       var a = {s:'55'};
       var b = a = 5;
       console.log(a);  //5
       console.log(b);  //5

上面的的例子可以看出連續賦值不是從左到右依次進行而是: 

       var a = {s:'55'};
       var b;
       b=5; a=5;  //等價於  b = a = 5;

2.變量的類型以及它們的堆棧分配

js的變量類型分兩類

值類型(基本類型):字符串(String)、數字(Number)、布爾(Boolean)、對空(Null)、未定義(Undefined)、Symbol

引用數據類型:對象(Object)、數組(Array)、函數(Function)

不同數據類型對應堆棧內存

基本類型:存放在棧內存中的簡單數據段,數據大小確定,內存空間大小可以分配。

引用類型:存放在堆內存中的對象,變量實際保存的是一個指針,這個指針指向另一個位置。每個空間大小不一樣,要根據情況開進行特定的分配。

知識點完了,接下來就是對題的解剖

第一步:根據知識點一進行連等變形

      var a = {s:"sss"};
      var b = a;
      a.x = {m:"mmm"};
      a = {m:"mmm"};
    //a.x = a = {m:"mmm"};
      console.log(a.x);
      console.log(b.x);

一變形就可以看出 a.x 的值爲 undefined;

第二步:根據題話堆棧圖

①先話這一部分的

      var a = {s:"sss"};
      var b = a;
      

 

②畫  a.x = {m:"mmm"}

 ③畫 a = {m:"mmm"}

執行完之後很清楚的看出

a的值爲{m:"mmm"}

b的值爲{m:"mmm",s:"sss"}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章