JavaScript 对象
对象的属性有属性描述符的对象,即使没有直接给出。
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。
1、这四个值重要吗? 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()
};
}
};
}
};