標籤:建立 cti console esc 數組 遍曆 對象 symbol 沒有
對象的屬性有屬性描述符的對象,即使沒有直接給出。
var obj = { name: ‘objcet‘};
Objcet.getOwnpropertyDescriptor(obj, "name"); // 為:{value: "objcet", configurable: true, writable: true, enumerable: true}
//直接給出
Object.defineProperty(obj, "tool", {
value: "tool"
});
Objcet.getOwnpropertyDescriptor(obj, "tool"); // 為:{value: "tool", configurable: false, writable: false, enumerable: false}
這裡預設含有一個對象描述符對象。且各項預設為true。我們可以對其進行多項操作。若我直接給出呢?這是若不在對象中明確給出,那麼就會預設為false。
問題是這四個值重要嗎?
value可以直接修改值,writable決定是否可以寫入,enumerable決定for in 語句、Objcet.keys()、o.propertyIsEnumerable(),configurable決定是否可以刪除屬性值以及是否可以配置。
問題2:淺複製下不會對原有的描述符的屬性進行複製,也就是說其中的值預設為true。
訪問器屬性:它們與value、writable是衝突的,只能給出一種形式。
var obj = { get value () { return this._value; }, set value (v) { this._value = v; }};
//這是的value是不可枚舉、不可配置的。_value是可以枚舉配置的。
枚舉
for...in 語句會以[[prototype]]鏈的方式枚舉但枚舉的是屬性名稱。
var arr = [1, 2, 3];for (var i in arr) { console.log(i);}
//值為:"0"、"1"、"2"
另:Object.keys()、Objcet.getOwnPropertyNames()不會尋找原型鏈。
遍曆:
數組內建@@iterator從而可以遍曆得到值,對於一個對象可以認為建立@@iteraror來與for of 語句搭配使用。下面是一個例子。
var random = { [Symbol.iterator]: function () { return { next: function () { return { value: Math.random() }; } }; }};
關於對象的一些問題