美文网首页
js 判断对象上是否存在某个属性

js 判断对象上是否存在某个属性

作者: 源大侠 | 来源:发表于2023-05-07 09:39 被阅读0次

    让我们来看看最常用的几种方法。

    1. 真值检查

    有一个很简单的方法,就是简单的检查房产是否真实。

    const myObj = {
      a: 1,
      b: 'some string',
      c: [0],
      d: {a: 0},
      e: undefined,
      f: null,
      g: '',
      h: NaN,
      i: {},
      j: [],
      deleted: 'value'
    };
    
    delete myObj.deleted;
    
    console.log(!!myObj['a']); // 1, true
    console.log(!!myObj['b']); // 'some string', true
    console.log(!!myObj['c']); // [0], true
    console.log(!!myObj['d']); // {a: 0}, true
    console.log(!!myObj['e']); // undefined, false
    console.log(!!myObj['f']); // null, false
    console.log(!!myObj['g']); // '', false
    console.log(!!myObj['h']); // NaN, false
    console.log(!!myObj['i']); // {}, true
    console.log(!!myObj['j']); // [], true
    console.log(!!myObj['deleted']); // false
    

    正如你所看到的,这导致了几个假值的问题,所以使用这种方法时要非常小心。

    2. in 操作符

    如果一个属性存在于一个对象或其原型链上,in操作符返回true。

    const myObj = {
      someProperty: 'someValue',
      someUndefinedProp: undefined,
      deleted: 'value'
    };
    
    delete myObj.deleted;
    
    console.log('someProperty' in myObj); // true
    console.log('someUndefinedProp' in myObj); // true
    console.log('toString' in myObj); // true (inherited)
    console.log('deleted' in myObj); // false
    

    in操作符不会受到假值问题的影响。然而,它也会对原型链上的属性返回true。这可能正是我们想要的,如果我们不需要对原型链上对属性进行判断,可以使用下面这种方法。

    3. hasOwnProperty()

    hasOwnProperty()继承自Object.HasOwnProperty()。和in操作符一样,它检查对象上是否存在一个属性,但不考虑原型链。

    const myObj = {
      someProperty: 'someValue',
      someUndefinedProp: undefined,
      deleted: 'value'
    };
    
    delete myObj.deleted;
    
    console.log(myObj.hasOwnProperty('someProperty')); // true
    console.log(myObj.hasOwnProperty('someUndefinedProp')); // true
    console.log(myObj.hasOwnProperty('toString')); // false
    console.log(myObj.hasOwnProperty('deleted')); // false
    

    不过要注意的一点是,并不是每个对象都继承自Object。

    const cleanObj = Object.create(null);
    cleanObj.someProp = 'someValue';
    // TypeError: cleanObj.hasOwnProperty is not a function
    console.log(cleanObj.hasOwnProperty('someProp'));
    

    如果遇到这种罕见的情况,还可以按以下方式使用。

    const cleanObj = Object.create(null);
    cleanObj.someProp = 'someValue';
    console.log(({}).hasOwnProperty.call(cleanObj,'someProp')); // true
    

    总之
    这三种方法都有其适合使用的场景,重要的是需要我们要熟悉它们的区别,这样才能选择最好的一种,以便让我们的代码能够按照期望运行。

    相关文章

      网友评论

          本文标题:js 判断对象上是否存在某个属性

          本文链接:https://www.haomeiwen.com/subject/nouhsdtx.html