如何判断对象中是否存在某个属性

引言

对象在我们开发中使用的非常多,在使用场景中,我们也会遇到很多需要判断对象中是否存在某个属性的情况,判断方法当然比较多,就看当前的场景适用哪种方法,下面是分享的几种方法

(key为需要判断的属性,obj为当前对象)


1.判断obj.key是否等于undefined

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    }
}
console.log(obj.c);//输出undefined

 但是这样写有个弊端,就是如果obj中存在这个变量,但是变量的值就是undefined,就无法准确判断了

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    },
    c: undefined
}
console.log(obj.c);//同样输出undefined

2.判断key是否在Object.keys(obj)的数组中

Object.keys() 返回一个数组,其元素是字符串,对应于直接在对象上找到的可枚举的字符串键属性名。

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    },
}
console.log(Object.keys(obj).includes('c'));//输出false

这里需要注意一点,通过 Object.keys() 返回的数组,是当前对象上可枚举的属性值

 那么什么叫做可枚举?

我们可以通过Object.defineProperty给对象添加属性,添加属性时,可以选择参数

第一个参数是要添加的对象,第二个参数是要添加的属性名,第三个参数是对象,其中的value是添加的属性对应的值,enumerable就是是否可枚举,这里注意,我们添加的是不可枚举的,所以直接打印obj,是不会打印出c这个属性的

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    },
}
Object.defineProperty(obj, "c", {
    value: '我是添加的非枚举属性的c',
    enumerable: false
})
console.log(obj.c);//输出‘我是添加的非枚举属性的c’

 所以我们添加完之后,去输出一下

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    },
}
Object.defineProperty(obj, "c", {
    value: '我是添加的非枚举属性的c',
    enumerable: false
})
console.log(Object.keys(obj).includes('c'));//输出false

相反,我们将可枚举改成true

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    },
}
Object.defineProperty(obj, "c", {
    value: '我是添加的非枚举属性的c',
    enumerable: true
})
console.log(Object.keys(obj).includes('c'));//输出true

3.使用Object.prototype.hasOwnProperty(key)

hasOwnProperty() 方法返回一个布尔值,表示对象所有的自有属性(包括枚举和非枚举,并且不是从原型链继承来的属性)中是否具有指定的属性。

hasOwnProperty,因为有own,所以很好理解,返回的就是完全自有的属性值

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    },
}
Object.defineProperty(obj, "c", {
    value: '我是添加的非枚举属性的c',
    enumerable: false
})
console.log(obj.hasOwnProperty('c'));//输出true

4.使用in关键字

如果指定的属性在指定的对象或其原型链中,则 in 运算符返回 true,他会判断指定属性,是否存在当前对象或其原型链中

我们首先输出一下当前对象的属性

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    },
}
Object.defineProperty(obj, "c", {
    value: '我是添加的非枚举属性的c',
    enumerable: false
})
console.log("c" in obj);//输出true

我们现在obj的原型链上添加一个属性, 再来使用in关键字输出一下原型链上的属性是否存在

let obj = {
    a: "a",
    b: function () {
        console.log("b");
    },
}
Object.defineProperty(obj, "c", {
    value: '我是添加的非枚举属性的c',
    enumerable: false
})
obj.__proto__ .aaa= "我是aaa"
console.log("aaa" in obj);//输出true

本次的分享就到这,请大家用发财的小手点点赞🙋‍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值