JS中可以把變量分成兩部分,基本類型和引用類型敞掘。
JavaScript值類型和引用類型有哪些
(1)值類型:數(shù)值叽掘、布爾值、null渐逃、undefined够掠。
(2)引用類型:對象民褂、數(shù)組茄菊、函數(shù)。
如何理解值類型和引用類型及舉例
我們可以用“連鎖店”和“連鎖店鑰匙”來理解赊堪,不知道以下比喻合不合適面殖,-。
(1)值類型理解:變量的交換等于在一個新的地方按照連鎖店的規(guī)范標(biāo)準(zhǔn)(統(tǒng)一店面理解為相同的變量內(nèi)容)新開一個分店哭廉,這樣新開的店與其它舊店互不相關(guān)脊僚、各自運營。
【值類型例子】
代碼如下:
function chainStore()
{
var store1='Nike China';
var store2=store1;
store1='Nike U.S.A.';
alert(store2); //Nike China
}
chainStore();
//把一個值類型(也可以叫基本類型)store2傳遞給另一個變量(賦值)時遵绰,其實是分配了一塊新的內(nèi)存空間辽幌,因此改變store1的值對store2沒有任何影響,因為它不像引用類型椿访,變量的交換其實是交換了指像同一個內(nèi)容的地址乌企。
(2)引用類型理解:變量的交換等于把現(xiàn)有一間店的鑰匙(變量引用地址)復(fù)制一把給了另外一個老板,此時兩個老板同時管理一間店成玫,兩個老板的行為都有可能對一間店的運營造成影響加酵。
【引用類型例子】
代碼如下:
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只進行了一次賦值哭当,理論上它的值已定猪腕,但后面通過改寫store1的值,發(fā)現(xiàn)store2的值也發(fā)生了改變钦勘,這正是引用類型的特征陋葡,也是我們要注意的地方。
引用類型值的一些問題:
1彻采、動態(tài)屬性腐缤。
JS中對象的屬性可以動態(tài)的添加并且賦值的朵栖,比如:
var obj = new Object();
obj.name = 'zjzhome';
console.log(obj.name) //zjzhome
但是基本類型不可以添加屬性,雖然這樣做不報錯柴梆。
2陨溅、復(fù)制值
引用類型復(fù)制和簡單類型不同,復(fù)制完成后新值和之前的值都是引用的同一個對象绍在,所以之前的值改變门扇,也會影響復(fù)制后的值,看個例子:
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
看了上面的例子可能會覺得對象是按引用傳遞的,我們把例子修改一下:
function setName(obj) {
obj.name = 'zjzhome';
obj = new Object();
obj.name = 'zjz'
}
var person = new Object()
setName(person)
console.log(person.name) // zjzhome
person的值并沒有因為obj的修改而改變溜宽,說明不是按引用傳遞的吉拳。如果是按引用傳遞的,obj和person指向同一個對象适揉,當(dāng)obj改變留攒,person也會改變。
4嫉嘀、類型檢測
typeof用于檢測簡單類型炼邀,對于對象,我們更想知道的是什么類型的對象剪侮。所以引進了instanceof操作符拭宁。
person instanceof Object 這樣來檢測person是不是Object。
person instanceof Array 這樣來檢測person是不是Array瓣俯。