我们到MDN上搜索属性的可枚举性和所有权
可枚举属性是指内部可枚举标志(enumerable
)设置为true
的属性,自然不可枚举属性即是enumerable
为false
我们看下JavaScript基本类型和基本类型包裹对象
基本类型
是指非对象且无方法的数据。JavaScript
有6种基本类型:string,number,boolean,null,undefined,symbol
除了null和undefined
外,所有基本类型值都有包裹这个基本类型值的等价对象
:String
Boolean
Number
Symbol
JavaScript
有7种不同类型的值
-
六种
原型
数据类型- Boolean
- String
- Number
- null
- undefined
- Symbol
-
Object
对象
还有一个概念就是字面量
,有以下字面量
- 数组字面量(Array)
- 布尔字面量 (Boolean)
- 浮点数字面量 (Float)
- 整数 (Int)
- 对象字面量 (Object)
- RegExp
- 字符串字面量 (String)
好了好了扯远了,为什么说这些呢,抛出问题,以上属性是否可枚举呢?
下面来看一个例子:
function Person() {
this.name = 'fyflying'
}
Person.prototype = {
hobby: 'coding'
}
var person = new Person()
Object.defineProperty(person, 'sex', {
value: 'female'
})
for (var item in person) {
console.log(item + ':' + person[item])
}
/**
name:fyflying
hobby:coding
**/
Object.keys(person)
// ["name"]
JSON.stringify(person)
//"{"name":"fyflying"}"
可以看到除了sex
属性其他都遍历到了,而且使用for..in
与Object.keys
还是有区别的,区别就在于使用for...in
还会遍历出对象从原型链上继承来的可枚举属性
通过Object.defineProperty
定义的属性,该标志值默认是false
, 所以不可枚举,通过for..in
和 Object.keys()
都遍历不到。
判断可枚举属性与不可枚举属性方法:propertyIsEnumerable()
: 方法返回一个布尔值,表示指定的自身属性是否可枚举。(不包括原型链继承的属性)
区别以下方法:
使用 for...in
迭代,遍历出自身以及原型链上的可枚举的属性,通过hasOwnProperty
进行筛选能遍历出自身可枚举属性
而使用Object.keys
直接遍历出的自身可枚举属性组成的数组
使用getOwnPropertyNames
可以访问自身可枚举属性与不可枚举属性
另外,还有大漠的文章参考,对于以上几个方法介绍的很详细。对象属性的枚举
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。