11

我们到MDN上搜索属性的可枚举性和所有权

可枚举属性是指内部可枚举标志(enumerable)设置为true的属性,自然不可枚举属性即是enumerablefalse

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

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

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

区别以下方法:

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

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


ShiRouMi
438 声望7 粉丝

Go write some code | 学而不思则罔,思而不学则殆