JS中可以把變量分成兩部分,基本類型和引用類型。
JavaScript值類型和引用類型有哪些
(1)值類型:數(shù)值、布爾值、null、undefined。
(2)引用類型:對(duì)象、數(shù)組、函數(shù)。
如何理解值類型和引用類型及舉例
我們可以用“連鎖店”和“連鎖店鑰匙”來理解,不知道以下比喻合不合適,-。
(1)值類型理解:變量的交換等于在一個(gè)新的地方按照連鎖店的規(guī)范標(biāo)準(zhǔn)(統(tǒng)一店面理解為相同的變量?jī)?nèi)容)新開一個(gè)分店,這樣新開的店與其它舊店互不相關(guān)、各自運(yùn)營(yíng)。
【值類型例子】
代碼如下:
function chainStore()
{
var store1='Nike China';
var store2=store1;
store1='Nike U.S.A.';
alert(store2); //Nike China
}
chainStore();
//把一個(gè)值類型(也可以叫基本類型)store2傳遞給另一個(gè)變量(賦值)時(shí),其實(shí)是分配了一塊新的內(nèi)存空間,因此改變store1的值對(duì)store2沒有任何影響,因?yàn)樗幌褚妙愋?,變量的交換其實(shí)是交換了指像同一個(gè)內(nèi)容的地址。
(2)引用類型理解:變量的交換等于把現(xiàn)有一間店的鑰匙(變量引用地址)復(fù)制一把給了另外一個(gè)老板,此時(shí)兩個(gè)老板同時(shí)管理一間店,兩個(gè)老板的行為都有可能對(duì)一間店的運(yùn)營(yíng)造成影響。
【引用類型例子】
代碼如下:
function chainStore()
{
var store1=['Nike China'];
var store2=store1;
alert(store2[0]); //Nike China
store1[0]='Nike U.S.A.';
alert(store2[0]); //Nike U.S.A.
}
chainStore();
//在上面的代碼中,store2只進(jìn)行了一次賦值,理論上它的值已定,但后面通過改寫store1的值,發(fā)現(xiàn)store2的值也發(fā)生了改變,這正是引用類型的特征,也是我們要注意的地方。
引用類型值的一些問題:
1、動(dòng)態(tài)屬性。
JS中對(duì)象的屬性可以動(dòng)態(tài)的添加并且賦值的,比如:
var obj = new Object();
obj.name = 'zjzhome';
console.log(obj.name) //zjzhome
但是基本類型不可以添加屬性,雖然這樣做不報(bào)錯(cuò)。
2、復(fù)制值
引用類型復(fù)制和簡(jiǎn)單類型不同,復(fù)制完成后新值和之前的值都是引用的同一個(gè)對(duì)象,所以之前的值改變,也會(huì)影響復(fù)制后的值,看個(gè)例子:
var obj1 = new Object()
obj1.name = 'zjzhome'
var obj2 = obj1
console.log(obj2.name); //zjzhome
obj1.name = 'zjz'
console.log(obj2.name) //zjz

3、函數(shù)傳參
JS中所有函數(shù)傳參都是按值傳遞的。
function setName(obj) {
obj.name = 'zjzhome'
}
var person = new Object()
setName(person)
console.log(person.name) //zjzhome
看了上面的例子可能會(huì)覺得對(duì)象是按引用傳遞的,我們把例子修改一下:
function setName(obj) {
obj.name = 'zjzhome';
obj = new Object();
obj.name = 'zjz'
}
var person = new Object()
setName(person)
console.log(person.name) // zjzhome
person的值并沒有因?yàn)閛bj的修改而改變,說明不是按引用傳遞的。如果是按引用傳遞的,obj和person指向同一個(gè)對(duì)象,當(dāng)obj改變,person也會(huì)改變。
4、類型檢測(cè)
typeof用于檢測(cè)簡(jiǎn)單類型,對(duì)于對(duì)象,我們更想知道的是什么類型的對(duì)象。所以引進(jìn)了instanceof操作符。
person instanceof Object 這樣來檢測(cè)person是不是Object。
person instanceof Array 這樣來檢測(cè)person是不是Array。