属性的可枚举性与不可枚举性

咱们到MDN上搜索属性的可枚举性和全部权javascript

可枚举属性是指内部可枚举标志(enumerable)设置为true的属性,天然不可枚举属性便是enumerablefalsehtml

咱们看下JavaScript基本类型和基本类型包裹对象java

基本类型是指非对象且无方法的数据。
JavaScript有6种基本类型:string,number,boolean,null,undefined,symbol
除了null和undefined外,全部基本类型值都有包裹这个基本类型值的等价对象:
String Boolean Number Symbol
JavaScript有7种不一样类型的值数组

  • 六种 原型 数据类型this

    • Boolean
    • String
    • Number
    • null
    • undefined
    • Symbol
  • Object对象

还有一个概念就是字面量,有如下字面量prototype

  • 数组字面量(Array)
  • 布尔字面量 (Boolean)
  • 浮点数字面量 (Float)
  • 整数 (Int)
  • 对象字面量 (Object)
  • RegExp
  • 字符串字面量 (String)

好了好了扯远了,为何说这些呢,抛出问题,以上属性是否可枚举呢?code

下面来看一个例子:htm

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..inObject.keys仍是有区别的,区别就在于使用for...in还会遍历出对象从原型链上继承来的可枚举属性对象

经过Object.defineProperty定义的属性,该标志值默认是false, 因此不可枚举,经过for..inObject.keys()都遍历不到。继承

判断可枚举属性与不可枚举属性方法
propertyIsEnumerable(): 方法返回一个布尔值,表示指定的自身属性是否可枚举。(不包括原型链继承的属性)

区别如下方法:

使用 for...in迭代,遍历出自身以及原型链上的可枚举的属性,经过hasOwnProperty进行筛选能遍历出自身可枚举属性
而使用Object.keys直接遍历出的自身可枚举属性组成的数组
使用getOwnPropertyNames能够访问自身可枚举属性与不可枚举属性

另外,还有大漠的文章参考,对于以上几个方法介绍的很详细。对象属性的枚举

相关文章
相关标签/搜索