1 定義
(1)語(yǔ)法形式:
var obj = {
key:value
};
(3)構(gòu)造形式:
var obj = new Object();
obj.key = value;
2 js 的類(lèi)型
(1)string
(2)number
(3)boolean
(4) null
(5) undefined
(6) object
簡(jiǎn)單基本類(lèi)型:string ,number,boolean,null undefined .null有時(shí)會(huì)被當(dāng)做一種對(duì)象。typeof null``// “object”
.這是語(yǔ)言的一個(gè)bug余黎。(原理:不同的對(duì)象在底層都表示成二進(jìn)制,在js中如果前三位都是0览濒,則為object
類(lèi)型薯嗤,null的二進(jìn)制本身就是全部為0的,故顯示為object
)
函數(shù)就是對(duì)象的一個(gè)子類(lèi)型(即可調(diào)用的對(duì)象)界睁,數(shù)組也是對(duì)象中的一個(gè)子類(lèi)型宙攻。
js中的一些對(duì)象子類(lèi)型(內(nèi)置對(duì)象):
(1)String
(2)Number
(3 Boolean
(4) Object
(5) Function
(6) Array
(7) Data
(8) RegExp
(9) Error
var obj = "I love you,rose";
typeof obj;//string
var obj1 = new String("I love you ,rose");
typeof obj1;//"object"
obj1 instanceof String //true
在必要時(shí)js引擎會(huì)自動(dòng)把string字面量 轉(zhuǎn)換為String画舌,以便我們對(duì)其進(jìn)行其他的操作堕担。
var obj2 = " i a m";
obj2.length; //5
obj2.charAt(4);//"m“
對(duì)于Number,Boolean,引擎也會(huì)把字面量轉(zhuǎn)換成內(nèi)置對(duì)象來(lái)進(jìn)行操作,但是由于Object.Array,Function,RegExp他們都是對(duì)象骗炉,不是字面量照宝。‘
存貯在對(duì)象中的屬性只是一個(gè)指針句葵,它指向該屬性值厕鹃。調(diào)用時(shí)有兩中形式Object.key
或者Object[''key'']
;其中.
操作符需要讓屬性名滿(mǎn)足標(biāo)識(shí)符的規(guī)則,但是["..’']操作符可以使用任意Utf-8或者Unicode字符串作為屬性名乍丈。
在對(duì)象中屬性名一直都是字符串剂碴。使用typeof
操作符后也是以字符串的形式輸出的。如果進(jìn)行多于一次的typeof
操作轻专,都會(huì)變?yōu)?code>"strng".
typeof obj3//"object"
typeof typeof obj3//"string"
可計(jì)算屬性名:
es6:
var prefix = "foo";
var myObject = {
[prefix + "bar"]:"the girl is my friend",
[prefix +"baz"]:"the boy is my brother"
}
myObject.foobar;//"the girl is my friend"
myObject.foobaz;//"the boy is my brother"
可計(jì)算屬性名最常用的場(chǎng)景可能是ES6的Symbol忆矛。
數(shù)組
向數(shù)組添加屬性:
var arr1 = ["bat",1,"foo"];
arr1.bar = "bar";
arrq.length ;//3
arr1["3"] = "mioa";
arr1.length ;//4
從上面的代碼我們發(fā)現(xiàn)給數(shù)組直接添加屬性值時(shí),如果是字符串的屬性名请垛,則他的length
不會(huì)改變催训,如果是數(shù)字的屬性名時(shí),他會(huì)以為是數(shù)組的下標(biāo)宗收,從而添加長(zhǎng)度length
漫拭。
復(fù)制對(duì)象(面試)
屬性描述符
var myObject ={
a:2
};
Object.getOwnPropertyDescriptor(myObject,"a");
//{value: 2, writable: true, enumerable: true, configurable: true}
禁止對(duì)象拓展(添加不了新屬性):
var myObject = {
a:2
}
Object.perventExtensions(myObject);
myObject.b = 1 ;
myObject.b;//undefined
凍結(jié)對(duì)象(無(wú)法添加無(wú)法刪除屬性,除此之外還不能修改屬性的值):
var myObject = {
a:2
}
Object.freeze(myObject);
myObject.a = 5;
myObject.a //2
Getter&Setter
es5中可以使用getter 和setter部分改寫(xiě)默認(rèn)操作
var myObject ={
get a(){
return 2;
}
};
Object.defineProperty(
myObject,
"b",{
get :function(){return this.a*2},
enumerable:true
}
)
myObject.a//2
myObject.b//4
上面的代碼在給我們展示給對(duì)象myObject
中的屬性a
定義了一個(gè)getter
函數(shù)混稽,然后再設(shè)置了一個(gè)新屬性為b
,再給其設(shè)置getter函數(shù).
只使用一個(gè)(Getter或者是Setter)是理想的采驻,他們應(yīng)該成對(duì)存在:
var myObject3 = {
get a(){
return this._a_;
},
set a(val){
return this._a_ = val*2;
}
};
myObject3.a = 2;
myObject3.a //4
引擎先讀set再get
看對(duì)象是否存在該屬性的方法:
(1)in
操作符:
var obj = {
a:2
};
//false
("b" in obj);
(2) hasOwnproperty方法:
var obj = {
a:2
};
//true
obj.hasOwnProperty("a");
(3)很厲害的判定法:
Object.prototype.hasOwnProperty.call(obj,"a");
注意 in
操作符是可以檢查容器內(nèi)是否有某個(gè)值,但是它實(shí)際上是在檢查屬性名是否存在匈勋。
var arr3 = [1,2,3];
(3 in arr3);//false
出現(xiàn)上面這段代碼的原因如下:
對(duì)于數(shù)組來(lái)說(shuō):它的屬性名(也就是索引)是0礼旅,1,2洽洁,里面是沒(méi)有3的痘系。
所以它會(huì)報(bào)false.