`propertyIsEnumerable()` 方法返回一个布尔值，表示指定的属性是否可枚举。

## 语法

    obj.propertyIsEnumerable(prop)

### 参数

`prop`
  需要测试的属性名。

### 返回值

  用来表示指定的属性名是否可枚举的`Boolean` 。

## 描述

每个对象都有一个`propertyIsEnumerable`方法。此方法可以确定对象中指定的属性是否可以被`for...in`循环枚举，但是通过原型链继承的属性除外。如果对象没有指定的属性，则此方法返回`false`。

## 例子

### `propertyIsEnumerable`方法的基本用法

下面的例子演示了`propertyIsEnumerable`方法在普通对象和数组上的基本用法:

    var o = {};
    var a = [];
    o.prop = 'is enumerable';
    a[0] = 'is enumerable';

    o.propertyIsEnumerable('prop');   //  返回 true
    a.propertyIsEnumerable(0);        // 返回 true

### 用户自定义对象和引擎内置对象

下面的例子演示了用户自定义对象和引擎内置对象上属性可枚举性的区别.

    var a = ['is enumerable'];

    a.propertyIsEnumerable(0);          // 返回 true
    a.propertyIsEnumerable('length');   // 返回 false

    Math.propertyIsEnumerable('random');   // 返回 false
    this.propertyIsEnumerable('Math');     // 返回 false

### 自身属性和继承属性

    var a = [];
    a.propertyIsEnumerable('constructor');         // 返回 false

    function firstConstructor() {
      this.property = 'is not enumerable';
    }

    firstConstructor.prototype.firstMethod = function() {};

    function secondConstructor() {
      this.method = function method() { return 'is enumerable'; };
    }

    secondConstructor.prototype = new firstConstructor;
    secondConstructor.prototype.constructor = secondConstructor;

    var o = new secondConstructor();
    o.arbitraryProperty = 'is enumerable';

    o.propertyIsEnumerable('arbitraryProperty');   // 返回 true
    o.propertyIsEnumerable('method');              // 返回 true
    o.propertyIsEnumerable('property');            // 返回 false

    o.property = 'is enumerable';

    o.propertyIsEnumerable('property');            // 返回 true

    // 这些返回fasle，是因为，在原型链上propertyIsEnumerable不被考虑
    // (尽管最后两个在for-in循环中可以被循环出来)。
    o.propertyIsEnumerable('prototype');   // 返回 false (根据 JS 1.8.1/FF3.6)
    o.propertyIsEnumerable('constructor'); // 返回 false
    o.propertyIsEnumerable('firstMethod'); // 返回 false

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript 3rd Edition (ECMA-262) | Standard | Initial definition
ECMAScript 5.1 (ECMA-262) Object.prototype.propertyIsEnumerable | Standard |
ECMAScript 2015 (6th Edition, ECMA-262) Object.prototype.propertyIsEnumerable | Standard |
ECMAScript Latest Draft (ECMA-262) Object.prototype.propertyIsEnumerable | Draft |

## 浏览器兼容

The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

| Desktop | Mobile | Server
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js
`propertyIsEnumerable` | Chrome Full support Yes | Edge Full support 12 | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes

### Legend

Full support
  Full support

## 相关链接

- Enumerability and ownership of properties
- `for...in`
- `Object.keys()`
- `Object.defineProperty()`