對(duì)象
對(duì)象可以通過(guò)兩種形式定義: 聲明形式和構(gòu)造形式
聲明形式語(yǔ)法: var myObj = {key:value}
構(gòu)造形式語(yǔ)法: var myObj = new Object(); myObj.key = value;
類型: 語(yǔ)言類型有六種 : string number boolean null undefined object
內(nèi)置對(duì)象: String Number Boolean Object Function Array Date RegExp Error
var myObject = {
a:2
}
myObject.a; //2 屬性訪問(wèn)
myObject["a"] // 2 鍵訪問(wèn)
ES6 可計(jì)算屬性名
var prefix = "foo";
var myObject = {
[prefix + "bar"] : "hello",
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world
1.writable 決定是否可以修改屬性的值
var myObject = {};
Object.defineProperty(myObject,"a",{
value:2,
writable:false, // 不可寫!
configurable: true,
enumerable: true
});
myObject.a = 3;
myObject.a; // 2
2.configurable
只要屬性是可配置的,就可以使用defineProperty(..) 方法來(lái)修改描述屬性亚侠。
var myObject = {
a : 2
};
myObject.a = 3;
myObject.a; // 3
Object.defineProperty(myObject,"a",{
value: 4铐料,
writable:true,
configurable:false,// 不可配置
enumerable: ture
});
myObject.a; // 4
myObject.a = 5;
myObject.a; // 5
Object.defineProperty(myObject,"a",{
value: 6赏淌,
writable:true,
configurable:true,
enumerable: ture
}) // TypeError
configurable 修改成flash 是單向的泰佳,無(wú)法撤銷
delete只用來(lái)刪除對(duì)象的可刪除屬性。
var myObject = {
a:2
}徙歼;
myObject.a //2
delete myObject.a;
myObject.a // undefined
3.enumerable 控制的是屬性是否出現(xiàn)在對(duì)象的屬性枚舉中王暗。
1.對(duì)象常量,結(jié)合writable: false 和configurable: false 就可以創(chuàng)建一個(gè)真正的常量屬性
(不可修改殉簸,重定義或者刪除)闰集。
var myObject = {};
Object.defineProperty(myObject,"FAVORITE_NUMBER",{
value:42沽讹,
writable: false,
configurable: false
})
2.禁止擴(kuò)展
禁止一個(gè)對(duì)象添加新屬性并保留已有屬性,可以使用Object.preventExtensions(...)
var myObject = {
a:2
};
Object.preventExtensions(myObject);
myObject.b = 3;
myObject.a; // undefined
3.封存
Object.seal(...) 會(huì)創(chuàng)建一個(gè) “封存的對(duì)象”武鲁,這個(gè)方法實(shí)際上會(huì)在一個(gè)現(xiàn)有對(duì)象上調(diào)用
Object.preventExtensions(...) 并把所有屬性標(biāo)記為configurable:false.
4.凍結(jié)
Object.freeze(...) 會(huì)創(chuàng)建一個(gè)凍結(jié)對(duì)象爽雄,這個(gè)方法實(shí)際上是會(huì)在一個(gè)現(xiàn)有對(duì)象上調(diào)用
Object.seal(...) ,還可以深度凍結(jié)一個(gè)對(duì)象。
Getter和Setter
var myObject = {
// 給 a 定義一個(gè)getter
get a() {
return 2;
}
}
myObject.a = 3;
myObject.a; // 2
由于只定義了 a 的getter,所以對(duì)a 的值進(jìn)行設(shè)置時(shí)set 操作會(huì)忽略賦值操作沐鼠,不會(huì)拋出錯(cuò)誤挚瘟。
通常來(lái)講getter 和setter是成對(duì)出現(xiàn)的
var myObject = {
// 給 a 定義一個(gè)getter
get a() {
return this.a;
},
// 給 a 定義一個(gè)setter
set a(val) {
this.a = val * 2;
}
};
myObject.a = 2;
myObject.a; // 2
存在性
可以在不訪問(wèn)屬性的情況下判斷對(duì)象中是否存在這個(gè)屬性:
var myObject = {
a:2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOWnProper("a"); // true
myObject.hasOwnProperty("b"); // false
in 操作符會(huì)檢查屬性是否在對(duì)象及[[Prototype]]原型鏈中饲梭。
hasOwnProperty(...) 只會(huì)檢查屬性是否在myObject對(duì)象中乘盖。
判斷屬性是否可枚舉:
var myObject = {};
Object.defineProperty(
myObject,
"a",
// 讓a像普通屬性一樣可枚舉
{enumerable: true,value:2}
);
Object.defineProperty(
myObject,
"b",
// 讓b 不可枚舉
{enumerable: false,value:3}
)
myObject.propertyIsEnumberable("a"); // true
myObject.propertyIsEnumber("b"); // false
Object.keys(myObject); // ["a"]
Object.getOwnPropertyName(myObject); // ["a","b"]
propertyIsEnumerable(...) 會(huì)檢查給定的屬性名是否直接存在于對(duì)象中(而不是在原型鏈)并且滿足enumerable:true
Object.keys(...) 會(huì)返回一個(gè)數(shù)組,包含所有可枚舉屬性
Object.getOwnPropertyNames(...) 返回一個(gè)數(shù)組排拷,包含所有屬性侧漓,無(wú)論是否可枚舉
遍歷
for .. in 可以用來(lái)遍歷對(duì)象的可枚舉屬性列表
對(duì)于數(shù)值索引的數(shù)組來(lái)說(shuō),可以使用標(biāo)準(zhǔn)的for 循環(huán)
ES5 中新增的 forEach(..) every(...) some(..)
forEach(...) 會(huì)遍歷數(shù)組中所有值并忽略回調(diào)函數(shù)的的返回值监氢。
every(...) 會(huì)一直運(yùn)行到回調(diào)函數(shù)返回false
some(...) 會(huì)一直運(yùn)行到回調(diào)函數(shù)返回true
Es6 增加 for .. of 循環(huán)語(yǔ)法
var myArray = [ 1,2,3];
for(var v of myArray){
console.log(v)
}
普通的對(duì)象沒(méi)有@@iterator,可以給任何想遍歷的對(duì)象自定義
var myObject = {
a:2,
b:3
};
Object.defineProperty(myObject,Symbol.iterator,{
enumerable: false,
writable: false,
configurable: true,
value: function() {
var o = this;
var idx = 0;
var ks = Object.keys(o);
return {
next: function(){
value: o[ks[idx++]],
done:(idx > ks.length)
}
}
}
})
// 手動(dòng)遍歷myObject
var it = myObjectSymbol.iterator;
it.next(); // {value:2布蔗,done: false}
it.next(); // {value:3,done: false}
it.next(); // {undefined浪腐,done: true}
// 用 for..of 遍歷myObject
for(var v of myObject){
console.log(v)
} // 2 // 3