變量賦值
先來幾個例子:
var a = "apple";
var b = a;
a = "banana";
b
按理說宗挥,b = a后,a是啥值b就應該跟著是啥值了~
但种蝶,b結果是"apple"属韧,還是一開始賦值時a的值。
var a = {name: "apple"};
var b = a;
a.name = "banana";
b.name
這回蛤吓,b又不爭氣的跟著a變了,b.name結果是"banana"
var a = {name: "apple"};
var b = a;
a = {name: "banana"};
b.name
這回b又堅持自己了糠赦,b.name結果是"apple"
var a = {count: 2};
var b = a.count;
a.count = 3;
b
同樣b的結果還是最開始的2
其實b很無辜会傲,這個要從ECMAScript的變量值類型說起~
類型共有兩種:
基本類型 (primitive values) - 包括Undefined, Null, Boolean, Number和String五種基本數(shù)據(jù)類型
引用類型 (reference values) - 保存在內存中的對象們,不能直接操作拙泽,只能通過保存在變量中的地址引用對其進行操作
現(xiàn)在回來看第一個例子
var a = "apple";
"apple"是String類型淌山,屬于基本類型,這時值是這樣儲存的:
var b = a;
這時a的值被copy了一份賦給了b:所以顾瞻,從此a和b井水不犯河水泼疑,各自怎么修改都不會影響對方了~
再來看第二個例子
var a = {name: "apple"};
{name: "apple"}是一個Object,屬于引用類型荷荤,賦值前后值是這樣存儲的:
所以當a.name = "banana";時退渗,修改的是大家共同指向的內存中的object的屬性值移稳,所以b.name的值也就跟著變了。
第三個例子中
var a = {name: "apple"};
var b = a;
a = {name: "banana"};
// {name: "banana"} 是內存中的一個新的Object了会油,
// a變量存儲的地址也是指向這個新的Object的了个粱,所以和b又無關了
b.name //還是"apple"
第4個例子
var a = {count: 2};
var b = a.count;
// a.count是Number類型,所以值被copy給b翻翩,
// 從此再怎么修改與b無關了
a.count = 3;
b //還是2
小總結都许,變量賦值時總是會copy一份的,如果是基本類型嫂冻,copy的就是實際的值胶征,如果是引用類型,copy的是指向Object的地址值桨仿,所以指向的還是同一個Object睛低。
變量比較
順手再來看看變量的比較~
var a = "apple";
var b = "apple";
a == b
這個沒問題,結果肯定是true蹬敲。
那這個呢暇昂?
var a = ["apple"];
var b = ["apple"];
a == b
雖然倆數(shù)組長一模一樣,結果還是false伴嗡。
其實原理還是一樣急波,對于基本類型,比較的就是實際的值瘪校,而對于引用類型(Array也是一種Object)澄暮,比較的是地址值,雖然兩個數(shù)組內容是一樣的阱扬,但它們在內存中是兩個Object泣懊,地址是不一樣,所以比較的結果是false麻惶。