對(duì)象在JS中有狹義對(duì)象和廣義對(duì)象
所謂的狹義對(duì)象 就是用{}這種字面量的形式定義的對(duì)象 它是一組屬性的無(wú)序集合
//狹義對(duì)象,就是一組值的封裝,除了4個(gè)值之外,什么都沒(méi)有
var obj = {
name: "小明",
age: "12",
sex: "男",
hobby: ['打球','看電視']
}
alert(obj.hobby[1]) //看電視
上面這個(gè)對(duì)象,表示一個(gè) 人 ,里面有4個(gè)屬性
比如我們現(xiàn)在不用對(duì)象 ,而是使用數(shù)組來(lái)存存儲(chǔ)一組剛才的值
var 0 =['小明',12,'男','['打球','看電視']']
alert(o[1]) //Uncaught SyntaxError: Unexpected number
數(shù)組只能存儲(chǔ)值 ,不能存儲(chǔ)健,換句話說(shuō),數(shù)組里的值 的 "語(yǔ)義"并不詳細(xì),對(duì)象除了能存儲(chǔ)值,還能存儲(chǔ)語(yǔ)義。
值 的語(yǔ)義,屬于上叫做keys,健
也就是說(shuō):對(duì)象就是一組值和語(yǔ)義的封裝
//廣義對(duì)象 是一個(gè)對(duì)象 ,但是你感覺(jué)它除了一組屬性還有別的東西
比如DOM元素是對(duì)象 ,但是和我們剛才說(shuō)的狹義對(duì)象”里面只有一組值 別的什么 都沒(méi)有“不同
// 下面這個(gè)O是一個(gè)DOM元素,它也是一個(gè)對(duì)象
var 0 = document.getElementById('box'); //得到一個(gè)DOM對(duì)象
alert(typeof o); //object
//下面給這個(gè)DOM元素添加屬性
o.name = "小 明";
o.age =12;
alert(o.age)
我們通過(guò)DOM方法得到了一個(gè)DOM對(duì)象,此時(shí)可以通過(guò)點(diǎn)語(yǔ)法來(lái)給這個(gè)對(duì)象添加屬性name,sex,hobboy屬性。此時(shí)可以通過(guò)o.name訪問(wèn)他的name屬性。此時(shí) ,你不能說(shuō)主穿上對(duì)象 只有name,age,hobby這三個(gè)屬性,別的什么 都沒(méi)有。因?yàn)檫@個(gè)o 畢竟是有一個(gè)HTML標(biāo)簽實(shí)體在頁(yè)面上
//數(shù)組也是對(duì)象
我們也可以通過(guò)點(diǎn)語(yǔ)法 給數(shù)組添加屬性
arr.name='小紅';
arr.age=12;
arr.hobby =['打架','抽煙','喝酒'];
alert(arr.sex);
說(shuō) 明數(shù)組有對(duì)象的一切特征,就是能夠添加屬性,但你不能說(shuō)這個(gè)數(shù)組此時(shí)只有name age hobby三個(gè)屬性
別的都沒(méi)有 ,畢竟他有一組數(shù)
函數(shù)也是對(duì)象 ,但是typeof運(yùn)算符檢測(cè)類(lèi)型 ,返回的結(jié)果 是function,不是object,這是系統(tǒng)規(guī)定,但是
function也是object
function fun(a,b){
alert(a+b)
}
//此時(shí)我們要證明這個(gè)fun也是一個(gè)對(duì)象,怎么證明 ,給他加屬性,如果能加上屬性就說(shuō)明是對(duì)象
alert(typeof fun); //function
fun.name ='小剛',
fun.age =34,
fun.hobby = ['lol','DOTA','cs']
alert(fun.name)
此時(shí)對(duì)象添加屬性成功,添加了三個(gè)屬性,但是你不能說(shuō)這個(gè)fun對(duì)象就只有三個(gè)屬性別的什么都沒(méi)有,因?yàn)樗吘?是一個(gè)函數(shù),能夠加圓括號(hào)執(zhí)行
再比如,正則表達(dá)式也是對(duì)象
var regexp = /\d/g;
alert(typeof regexp); //object
regexp.name ='小青';
alert(regexp.name);
添加屬性成功 但你不能說(shuō)它只有這幾個(gè)屬性 畢竟它是一個(gè)正則
也就是說(shuō) 系統(tǒng)內(nèi)置的所有引用類(lèi)型值 都是對(duì)象 ,他們都能添加自定義屬性 并且能夠訪問(wèn)這些屬性
比如
{}對(duì)象
function函數(shù)
array數(shù)組
regexp正則表達(dá)式
DOM元素
window ,document,Math,Date對(duì)象
Number,String內(nèi)置包裝構(gòu)造函數(shù)得到的值
但是這些對(duì)象除了一組屬性之外,還有其他的東西,比如數(shù)組還有一組值;比如函數(shù)還有一組語(yǔ)句,能夠圓括號(hào)執(zhí)行
什么不是對(duì)象,就是系統(tǒng)的基本類(lèi)型值
數(shù)字不能加屬性,因?yàn)閿?shù)字是基本類(lèi)型值,不是對(duì)象
var a =100;
a.name ='小強(qiáng)';
a.age =12;
alert(a.age); //undefined
//a不是一個(gè)對(duì)象 a是通過(guò)字面量增加的
var str ='你好';
str.haha=123;
alert(str.haha) //undefined
字符串不能加屬性,因?yàn)樽址腔绢?lèi)型值,不是對(duì)象。
那么到底有什么性質(zhì),我們就稱(chēng)它是對(duì)象呢?能夠添加屬性。特別的,微觀層面,只要這個(gè)東西存放在堆內(nèi)存中,就可以認(rèn)為是一個(gè)對(duì)象。