你不知道的JavaScript之对象(二)

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
}

猜你喜欢

转载自blog.csdn.net/qq_22182279/article/details/80547764