1 writable(可写)
如果要writable:false一致的话,setter被调用时应该抛出应该TypeError错误
2 configurable(可配置)
把configurable修改成false是单向操作,无法撤销,而且还会禁止删除属性。
例外:configurable:false还是可以把writable由true为false,反之不行。
3 enumerable(可枚举)
控制属性是否出现在对象的属性枚举中,例如for..in循环
4 不变性
- 对象常量:设置writable:false和configurable:false
- 禁止扩展:Object.prevent.Extensions() 禁止对象添加新属性并且保留已有属性
- 密封:Object.seal() 相当于先调用Object.prevent.Extensions() 再把现有属性标记为configurable:false
- 冻结: Object.freeze() 相当于先调用Object.seal() 再把现有属性标记为writable:false
5 in操作符会检查属性是否在对象及其[[Prototype]]原型链中。注意:in操作符检查的是属性名是否存在
4 in [2,4,6] //false
hasOwnProperty()只会检查属性是否在当前对象中,不会检查[[Prototype]]原型链。
通过Object.create(null)创建的对象不会连接到Object.prototype,因此没有hasOwnProperty方法。
6 propertyIsEnumerable检查给定的属性名是否直接存在于对象中(而不是在原型链上)并且满足enumerable:true
Object.keys()返回一个数组,包含所有可枚举属性
Object.getOwnPropertyNames()返回一个数组,包含所有属性,无论是否可枚举
var obj={};
Object.defineProperty(
obj,
"a",
{enumerable:true,value:2}
);
Object.defineProperty(
obj,
"b",
{enumerable:false,value:3}
);
console.log(obj.propertyIsEnumerable("a"));//true
console.log(obj.propertyIsEnumerable("b"));//false
console.log(Object.keys(obj));// ["a"]
console.log(Object.getOwnPropertyNames(obj));// ["a","b"]
7 遍历
forEach()遍历数组所有值并忽略回调函数返回值。
every()会一直运行直到回调函数返回false。
some()会一直运行直到回调函数返回true。
for..in遍历对象无法直接获取属性值,实际上遍历的是对象中所有可枚举属性,需要手动获取属性值,而且顺序不确定。
for..of 直接遍历值
var arr=[2,3];
for(var v of arr){
console.log(v);//2;3
}
for(var v in arr){
console.log("属性:"+v+"值:"+arr[v]);// 属性:0值:2;属性:1值:3
}