网站首页 » 前端开发 » JavaScript » 判断对象是否含有某个属性
上一篇:
下一篇:

判断对象是否含有某个属性

前言

这其实没什么好说的,本文章只作记录。各位看官可以作选择性阅读。

hasOwnProperty() 方法

const obj = {
    name:"前端技术",
    age:"3年2月20日"
}
console.log(obj.hasOwnProperty("name")); // true

不管对象的属性是否可枚举,hasOwnProperty() 方法都能检测到。

注意:

如果我们使用的话,有一种情况是不可用的,就是当我们像下面通过 Object.create(null,{……}) 这样定义一个对象及其属性时,是不可以使用 hasOwnProperty() 这个方法的,因为 hasOwnProperty() 是挂在 Object 对象下的方法,而我们通过 Object.create(null,{……}) 创建了一个绝对纯净的对象(不继承任何对象包括对象的老祖先 Object),所以超纯净的对象也自然而然地没能从老祖宗 Object 中继承下来。

const obj = Object.create(null,{
  name:{
    value:"前端技术",
    enumerable:true
  },
  age:{
    value:"3年2月20日",
    enumerable:true
  }
});
console.log(obj.hasOwnProperty("name")); // Uncaught TypeError: obj.hasOwnProperty is not a function

in 关键字

用法:”name” in obj

const obj = {
    name:"前端技术",
    age:"3年2月20日"
}
console.log("name" in obj); // true

不过用 in 运算符的时候需要注意的是,对于继承的属性(不管是可枚举的还是不可枚举的) in 都不会放过的,如果继承属性中有要查找的属性,那么通过 in 运算符也会返回 true

const obj = {
    name:'前端技术',
    domain:'http://yunkus.com',
    age:'3年2月20日'
};
const subObj = Object.create(obj,{
   type:{
       value: "前端技术",
       enumerable: false
   },
   owner:{
       value: "朝夕熊",
       enumerable: true
   }
});
console.log("type" in subObj); // true
console.log("owner" in subObj); // true

in 虽然不起眼,但它却有一个特殊的超能力,那就是通过Object.create(null,{……}) 创建的绝对纯净的对象,可以用 in 运算符来判断。

所以,在这里我们不难看出,in 比 hasOwnProperty() 强。如果代码不总是在你的控制范围之内,如果需要判断一个对象是否含有某个属性,你不妨优先考虑 in 运算符。

但是在用的时候我们还得根据实践情况进行选择。毕竟 hasOwnProperty() 也有它自己的优势:只会检测对象自身的属性,而不会云检测继承的属性。

JSON.stringify() 方法

除了上面的方法外,肯定还有其它的方法,比如:通过正则来匹配要查找的属性名,就像下面这样:

const obj = {
    name:'前端技术',
    domain:'http://yunkus.com',
    age:'3年2月20日'
};
const subObj = Object.create(obj,{
   type:{
       value: "前端技术",
       enumerable: true
   },
   owner:{
       value: "朝夕熊",
       enumerable: true
   }
});
const jsonStr = JSON.stringify(obj);
console.log(jsonStr); // {"name":"前端技术","domain":"http://yunkus.com","age":"3年2月20日"}
console.log(jsonStr.search(/"name":/g)); // 1

这种方法虽然相对来说麻烦了一点,但它却具备了上面两种方法的优点,可查看自身属性,通过 Object.create(null,{……}) 创建了一个绝对纯净的对象它也可以很好的完成查找任务。

但是它又有一个缺点,对象自身的所有属性必需是可枚举的,如果含有不可枚举的对象,JSON.stringify() 方法会自动过滤掉,即生成的字符串中不含有这个属性及其对应的值。比如:

const obj = Object.create(null,{
  name:{
    value:"前端技术",
    enumerable:true
  },
  age:{
    value:"3年2月20日",
    enumerable:false
  }
});
console.log(obj); // {name: "前端技术", age: "3年2月20日"}
var jsonStr = JSON.stringify(obj);
console.log(jsonStr); // {"name":"前端技术"}

不过一般情况下,在我们平时的实际开发中,定义的对象属性都是可枚举的。除非我们像上面那样显式地声明属性不可枚举。

  • 微信扫一扫,赏我

  • 支付宝扫一扫,赏我

声明

原创文章,不经本站同意,不得以任何形式转载,如有不便,请多多包涵!

本文永久链接:http://yunkus.com/whether-property-in-object/

Leave a Reply

Your email address will not be published. Required fields are marked *

评论 END