好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Javascript中判断对象是否具有属性的5种方法分享

前言

最近闲下来打算把8月的更文活动搞一搞了,之前很长一段时间没有连续更文主要是工作时间有点吃紧的缘故。所以这一有时间就来继续写文章了。这次要分享的主题是关于提升 js 编码效率的方法。

在实际工作中,在写业务代码时经常需要判断一个对象是否具有某种属性,这是业务代码中出现频率很高的判断逻辑。在此之前不管你掌握了多少种判断方法,如果你耐心地看完这篇文章你至少能学会 5 种方法,这会让你在以后的工作中游刃有余。

话不多说,直接给你展示判断对象是否具有属性的 5 种方法,请往下看→

5种方法

1. Reflect.has()方法

Reflect.has() 方法用于检查一个对象是否拥有某个属性中。

如下:

Reflect.has({x: 0}, "x"); // true
Reflect.has({x: 0}, "y"); // false

执行结果如下:

如果该属性存在于原型链中,也会返回 true 。

如下:

Reflect.has({x: 0}, "toString");

执行结果如下:

2. in操作符

in 运算符用于检查对象是否包含某个属性,如果包含就返回 true ,否则返回  false 。它的作用和 Reflect.has() 方法相同。

const obj = {p: 1};
'p' in obj; // true
'toString' in obj; // true

执行结果如下:

所以,从上可以看出 in 操作符和 Reflect.has() 方法有一个共同的问题,那就是 如果属性来自对象的原型,它会返回 true 。那如何解决这个问题呢?请接着往下看→

3. Object.prototype.hasOwnPerporty()方法

针对 in 操作符和 Reflect.has() 方法上面的出现的问题,就可以使用对象的 hasOwnProperty() 方法来判断,判断 'toString' 是否为对象自身的属性。

如下:

const obj = {p: 1}; 
console.log(obj.hasOwnProperty('toString')); // false 

执行结果如下:

hasOwnProperty() 方法返回一个布尔值,指示对象是否具有指定具有指定的属性(而不是继承它)。它可以正确地区分对象本身的属性和其原型的属性。

但是这种判断方法也有问题,那就是如果对象是使用 Object.create(null) 方式创建的,那么就不能使用 hasOwnProperty() 方法进行判断了。

如下:

var obj = Object.create(null);
obj.p = 1;
obj.hasOwnProperty('p'); // 报错

执行结果如下:

还有就是如果将 hasOwnProperty() 作为对象的一个属性,这样也无法使用 hasOwnProperty() 方法判断属性是否来自原型链了。如下:

var obj = {
    p: 1,
    hasOwnProperty: function () {
        return false;
    }
}
obj.hasOwnProperty('p'); // 始终返回false

执行结果如下:

造成这种问题的原因是由于 javascript 没有将 hasOwnProperty 作为一个敏感词,所以这样就可以为对象声明一个 hasOwnProperty 的属性,从而导致上述问题。

那如果要解决这个问题,该如何操作呢?那还得接着往下看→

4. Object.prototype.hasOwnPerporty.call()方法

如果要解决上面的问题,就需要使用原型链上真正的 hasOwnProperty 方法了。

如下:

即使用 Object.prototype.hasOwnPerporty.call() 方法可以解决上面的问题,也可以这样来写。如下:

Object.prototype.hasOwnPerporty.call(obj, 'p'); // true
或
({}).hasOwnProperty.call(obj, 'p'); // true

5. Object.hasOwn()方法

Object.hasOwn() 方法是 ES2022 新提出的,用于替代 Object.prototype.hasOwnProperty() 的方法。根据 MDN文档 中的介绍:如果指定的对象具有作为其自身属性的指定属性,则 hasOwn() 方法返回 true ;如果该属性是继承的或不存在,则该方法返回 false 。

使用方法如下:

const object1 = {prop: 'exists'};

console.log(Object.hasOwn(object1, 'prop')); // true
console.log(Object.hasOwn(object1, 'toString'));// false

其他示例如下:

const example = {};
Object.hasOwn(example, 'prop');   // false - 'prop' has not been defined

example.prop = 'exists';
Object.hasOwn(example, 'prop');   // true - 'prop' has been defined

example.prop = null;
Object.hasOwn(example, 'prop');   // true - own property exists with value of null

example.prop = undefined;
Object.hasOwn(example, 'prop');  // true - own property exists with value of undefined

Object.hasOwn() 与 Object.hasOwnPeoperty() 的区别:因为实例的 hasOwnProperty 方法是从 Object 的原型上拿到的,如果使用 Object.create(null) 的方式创建一个对象那么就拿不到 hasOwnProperty 这个方法,而 hasOwn 作为 Object 的静态方法是可以直接通过 Object 来进行调用。

如下:

const obj1 = Object.create(null);
obj1.name = '111';
console.log(obj1.hasOwnProperty('name')); // 报错

const obj2 = Object.create(null);
obj2.name = '222';
console.log(Object.hasOwn(obj2, 'name')); // true

const obj3 = {
    p: 1,
    hasOwnProperty: function () {
        return false
    }
}
console.log(Object.hasOwn(obj3, 'p')); // true

从上面的代码结果可以看到, Object.hasOwn() 方法是可以解决上面所有出现的问题的。但是它是 ES2022 提出的,所以还得看看它的兼容性。

如下:

可以看到,浏览器对它的支持还是挺友好的,所以大家是可以放心用的。

到此这篇关于Javascript中判断对象是否具有属性的5种方法分享的文章就介绍到这了,更多相关Javascript判断对象方法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

查看更多关于Javascript中判断对象是否具有属性的5种方法分享的详细内容...

  阅读:46次