• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • Object.prototype.hasOwnProperty()

    hasOwnProperty()方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

    语法

    obj.hasOwnProperty(prop)
    

    参数

    prop
    要检测的属性的String字符串形式表示的名称,或者Symbol

    返回值

    用来判断某个对象是否含有指定的属性的布尔值Boolean

    描述

    所有继承了in运算符不同,该方法会忽略掉那些从原型链上继承到的属性。

    备注

    即使属性的值是nullundefined,只要属性存在,hasOwnProperty依旧会返回true

    o = new Object();
    o.propOne = null;
    o.hasOwnProperty('propOne'); // 返回 true
    o.propTwo = undefined;  
    o.hasOwnProperty('propTwo'); // 返回 true
    

    示例

    使用hasOwnProperty方法判断属性是否存在

    下面的例子检测了对象o是否含有自身属性prop

    o = new Object();
    o.hasOwnProperty('prop'); // 返回 false
    o.prop = 'exists';
    o.hasOwnProperty('prop'); // 返回 true
    delete o.prop;
    o.hasOwnProperty('prop'); // 返回 false
    

    自身属性与继承属性

    下面的例子演示了hasOwnProperty方法对待自身属性和继承属性的区别:

    o = new Object();
    o.prop = 'exists';
    o.hasOwnProperty('prop');             // 返回 true
    o.hasOwnProperty('toString');         // 返回 false
    o.hasOwnProperty('hasOwnProperty');   // 返回 false
    

    遍历一个对象的所有自身属性

    下面的例子演示了如何在遍历一个对象的所有属性时忽略掉继承属性,注意这里Object.getOwnPropertyNames())。

    var buz = {
      fog: 'stack'
    };
    
    for (var name in buz) {
      if (buz.hasOwnProperty(name)) {
        console.log('this is fog (' + 
          name + ') for sure. Value: ' + buz[name]);
      }
      else {
        console.log(name); // toString or something else
      }
    }
    

    使用hasOwnProperty作为属性名

    JavaScript 并没有保护hasOwnProperty这个属性名,因此,当某个对象可能自有一个占用该属性名的属性是,就需要使用外部的hasOwnProperty获得正确的结果:

    var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };
    
    foo.hasOwnProperty('bar'); // 始终返回 false
    
    // 如果担心这种情况,
    // 可以直接使用原型链上真正的 hasOwnProperty 方法
    ({}).hasOwnProperty.call(foo, 'bar'); // true
    
    // 也可以使用 Object 原型上的 hasOwnProperty 属性
    Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
    

    注意,只有在最后一种情况下,才不会新建任何对象。

    规范