基本類型和引用類型
ECMAScript變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值。
基本數(shù)據(jù)類型有:undefined,null,boolean,string,number;這五種基本類型是按值訪問的,因?yàn)榭梢圆僮鞅4嬖谧兞恐械膶?shí)際的值。
引用類型為Object,引用類型的值是保存在內(nèi)存中的對(duì)象。
基本數(shù)據(jù)類型和引用類型的區(qū)別有以下幾種:
1、動(dòng)態(tài)的屬性
引用類型可以在上面保存或刪改需要的屬性,例如:
var obj = {}
obj.name = '小明'
console.log(obj.name) // '小明'
基礎(chǔ)數(shù)據(jù)類型就是一個(gè)單純的值,無(wú)法操作其屬性,例如:
var str = '小明'
str.age = 18
console.log(str.age) // undefined
注意,這里并不是沒有為str添加age屬性,而是JavaScript在為str添加屬性之后又馬上刪除了這個(gè)屬性(具體可以看高程的5.6節(jié)—基本包裝類型)
2、復(fù)制變量值
基本類型值在復(fù)制的時(shí)候,會(huì)在變量對(duì)象上直接創(chuàng)建一個(gè)新值,然把該值復(fù)制到為新變量分配的位置上,例如:
var a = 10
var b = a
a = 20
console.log(a) // 20
console.log(b) // 10
基本類型值被復(fù)制后,兩個(gè)值是獨(dú)立的,相互之間不會(huì)干擾

引用類型值在復(fù)制的時(shí)候,和基本類型值一樣,也是在變量對(duì)象上直接創(chuàng)建一個(gè)新值,然把該值復(fù)制到為新變量分配的位置上,但區(qū)別在于,引用類型值復(fù)制的并不是一個(gè)具體的值,而是一個(gè)指針,指向存儲(chǔ)在堆中的一個(gè)對(duì)象。所以在復(fù)制結(jié)束后,兩個(gè)變量的值實(shí)際上就是同一個(gè)東西。例如:
var obj = {name: '小明'}
var obj2 = obj
var obj3 = {name: '小明'}
console.log(obj2) // {name: '小明'}
console.log(obj === obj2) // true
console.log(obj === obj3) // false
1、在復(fù)制前,obj的值是一個(gè)內(nèi)存地址,指向內(nèi)存中存在的一個(gè)object;
2、使用obj2復(fù)制了obj之后,并不是新生成一個(gè)和obj一樣的對(duì)象,而是復(fù)制了obj的內(nèi)存地址,所以obj和obj2是指向同一塊內(nèi)存區(qū)域;
3、當(dāng)創(chuàng)建一個(gè)和obj內(nèi)容一樣的obj3的時(shí)候,javascript為obj3創(chuàng)建出一塊新的內(nèi)存區(qū)域,obj3就指向這個(gè)新的內(nèi)存區(qū)域;
