JS中的枚举和不可枚举

一、枚举是什么

  • 枚举指对象的属性是否可以遍历出来,简单点说就是是否可以被列举出来。可枚举性决定了这个属性能否被for…in查找遍历到。
  • js中基本包装类型的原型属性是不可枚举的,比如:

基本包装类型:Boolean,Number和String,就是即是基本类型,也是引用类型。基本包装类型还可以像引用类型一样通过对象的方法访问它自带的一些方法,但是不能像引用类型那样自定义方法。

var num = new Number();
for(var pro in num) {
    console.log("num." + pro + " = " + num[pro]);
}

结果为空,因为Number中内置的属性是不可枚举的;

  • 判断一个属性是否可枚举,用Object.propertyIsEnumerable()来判断,但需要注意的一点是如果需要判断的属性在object的原型链上,不管它是否可枚举,Object.propertyIsEnumerable()都会返回false

propertyIsEnumerable() 方法返回一个布尔值,表示指定的属性是否可枚举。但是在原型链上propertyIsEnumerable不被考虑
hasOwnProperty()方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性

二、枚举性的作用

  • 属性的枚举性会影响以下三个函数的结果:

for…in

Object.keys()

JSON.stringify()
举例:

function enumer(){
      this.a = '我是对象本身就有的属性'
}
enumer.prototype.b = '我是通过对象原型挂载的属性'
let fn = new enumer()
Object.defineProperty(fn,'c',{
     value:'我是通过Object.defineProperty方法添加的可枚举属性',
     enumerable:true
})

1、 .for…in循环可以枚举(遍历)出对象本身具有的属性,通过Object.defineProperty()方法加的可枚举属性,或者通过原型对象绑定的可以枚举属性。

for(let pro in fn){
   console.log(pro)
}  
/*输出*/
//a
//b
//c

2、 Object.keys()方法可以枚举实例对象本身的属性和通过Object.defineProperty()添加的可枚举属性,即不会枚举原型链上的属性

console.log(Object.keys(fn))
/*输出*/
//['a','c']

3、JSON.stringify()方法只能序列化实例对象本身的属性和通过Object.defineProperty()添加的可枚举属性为JSON对象,即不会序化原型链上的属性

console.log(JSON.stringify(fn))
//{"a":"我是对象本身就有的属性","c":"我是通过Object.defineProperty方法添加的可枚举属性"}

为什么要加上实例二字呢?请看下面

image.png

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 木兰拿起昨天兰陵王送来缝补的衣服,贴到鼻子前闻了闻,有种清爽的香气,这对于军中男儿实在是难得。她为兰陵王缝补得格外...
    Magnolia木兰阅读 626评论 0赞 2
  • 分析文章来自《最悲哀的教育,是你在等孩子感谢,孩子在等你道歉》,作者一木,今天分析文章中所用素材与文章所要表达主题...
    西江欢阅读 471评论 0赞 0
  • 喜欢过,也只是喜欢,就算到哪里看到有他名字里的一个字眼,心里也会悸动。有开头结尾的故事才叫故事。可故事连个开头都没...
    听说疯帽喜欢爱丽丝阅读 217评论 0赞 0

友情链接更多精彩内容