js判断对象是否包含某个属性(字段)

1、for…in…

let obj = {
	name: 'zs',
	age: '23',
	sex: 'man',
	weight: 120,
	height: 182
}
for(key in obj) {
	// key:键, obj[key]:值
	if(key == 'name') {
		console.log('有')
	} else {
		console.log('无')
	} // 有
	if(key == 'face') {
		console.log('有')
	} else {
		console.log('无')
	} // 无
}

2、使用undefined判断

let obj = {
	name: 'zs',
	age: '23',
	sex: 'man'
}
console.log(obj.name !== undefined) // true
console.log(obj.height !== undefined) // false

3、hasOwnProperty

let obj = {
	name: 'zs',
	age: '23',
	sex: 'man'
}
console.log(obj.hasOwnProperty('name')) // true
console.log(obj.hasOwnProperty('weight')) // false
console.log(obj.hasOwnProperty(name + sex)) // false

但是上面这样使用会报错

在这里插入图片描述
通过上述文字提示发现,不要从目标对象访问 Object 原型方法”

so 解决方法

用 call 改变指向调用

Object.prototype.hasOwnProperty.call(obj, 'key')

在ECMAScript 5.1中,新增了 Object.create,它支持使用指定的 [[Prototype]] 创建对象。Object.create(null) 是一种常见的模式,用于创建将用作映射的对象。当假定对象将包含来自Object.prototype 的属性时,这可能会导致错误。该规则防止直接从一个对象调用某些 Object.prototype 的方法。

此外,对象可以具有属性,这些属性可以将 Object.prototype 的内建函数隐藏,可能导致意外行为或拒绝服务安全漏洞。例如,web 服务器解析来自客户机的 JSON 输入并直接在结果对象上调用 hasOwnProperty 是不安全的,因为恶意客户机可能发送一个JSON值,如 {“hasOwnProperty”: 1},并导致服务器崩溃。

为了避免这种细微的 bug,最好总是从 Object.prototype 调用这些方法。例如,foo.hasOwnProperty(“name”) 应该替换为 Object.prototype.hasOwnProperty.call(foo, “name”)

4、propertyIsEnumerable

propertyIsEnumerable() 是hasOwnProperty() 的增强版,这个方法的用法与hasOwnProperty()相同,但当检测属性是自有属性(非继承)且这个属性是可枚举的,才会返回true。
那么什么是可枚举属性?通俗的讲就是可以通过for…in遍历出来的属性就是可枚举属性。通常由JS代码创建出来的属性都是可枚举的。

let obj = Object.create({x: 1});                   // 通过create()创建一个继承了X属性的对象obj
obj.propertyIsEnumerable('x');                     // false x是继承属性
obj.y = 1;                                         // 给obj添加一个自有可枚举属性y
obj.propertyIsEnumerable('y');                     // true
Object.prototype.propertyIsEnumerable('toString'); // false 不可枚举

5、Object.keys()

let obj = { x: 1 };
Object.defineProperty(obj, 'test', {
    value: 'testVal',
    enumerable: false,
    writable: true,
    configurable: true
});
let arr = Object.keys(obj);
arr.includes('x');  // true
arr.includes('test');  //false
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老电影故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值