先看一道筆試題:求打印結果
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"}