1.數(shù)據(jù)類型分為七種,Number半醉,String疚俱,Boolean,Object缩多,Undefined呆奕,Null,symbol(ES6);除了Object以外衬吆,其余都是基本類型的值梁钾。Object為復合類型的值。因為它是以上數(shù)據(jù)類型的集合咆槽。
這是一個Object:{a:1,b:'字符串',c:null,d:undefined,e:fun(),f:[].g:{}}陈轿,由此可見,它可以包含所有的數(shù)據(jù)類型作為它的屬性秦忿,而基本類型的值是單一的麦射。
2.Object與其他類型的值的存儲方式是不一樣的,我們知道JS的內(nèi)存分為代碼區(qū)和數(shù)據(jù)區(qū)灯谣,數(shù)據(jù)區(qū)又分?Stack(棧)和Heap(堆)潜秋。
基本類型的值,他們會存儲在棧中胎许,Object則會存儲在堆中峻呛。如果你聲明一個變量罗售,你把基本類型的值賦值給它,如果調(diào)用這個變量钩述,那么就會去Stack中尋找這個值寨躁。如果你賦值變量一個Object,你調(diào)用這個變量的時候牙勘,在stack中是找不到這個Object的职恳,你只會找到這個Object的地址,這個地址指向這個Object的位置方面,最終會在Heap中找到這個Object放钦。
3.由于存儲方式不一樣,會有深拷貝與淺拷貝的區(qū)別恭金。
深拷貝:基本類型的值操禀,賦值的時候就是深拷貝,比如:
? ? var a = 1;
? ? var b = a;//b=1
? ? b = 2;//a的值還是1
以上可見横腿,變量b的重新賦值颓屑,并沒有改變a的值,這就是一個深拷貝蔑水,因為在Stack中邢锯,每個變量的值與這個變量都是一一對應的,并不會出現(xiàn)兩個變量共享一個值的的事情搀别,所以上面的操作是覆蓋了Stack中變量b的值丹擎,所以對a沒影響。
淺拷貝:對下例Object屬性的覆蓋歇父,就是一個淺拷貝:
? ??var a = {name: 'wang'}
????var b = a
????b.name = 'b'
????a.name === 'b' // true
以上可見蒂培,改變對象b的name屬性,對象a的name屬性也隨之而變榜苫,這就是一個淺拷貝护戳。我們一步步看,首先聲明對象a垂睬,a的值并不是存在棧中媳荒,存在棧中的是一個地址,這個地址指向這個存儲在堆中的對象驹饺。然后把a賦值給了變量b钳枕,這時候其實是把a在棧中的那個地址拷貝給了b,這個時候a赏壹,b存在棧中的地址都指向同一個存儲在堆中的對象鱼炒,這個對象是唯一的,所以給b.name重新賦值之后蝌借,a,name的值也就跟著發(fā)生了改變昔瞧。