经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
JS判断对象属性是否存在的五种方案分享
来源:jb51  时间:2022/1/24 15:45:23  对本文有异议

背景

在这篇Accessible Object.prototype.hasOwnProperty() 提案中,提出了一个更简单的方法来检查对象时候具有特定的属性-

Object.hasOwn(),主要目标是用来替代Object.prototype.hasOwnProperty()。目前本提案已经进去第四阶段,预计2022年纳入标准。

随着Object.hasOwn()的加入,目前我们已经有了5个判断对象属性是否存在的方法!

检查属性是否存在

in

JavaScript的in操作符可以用来判断一个属性是否属于一个对象,也可以用来变量一个对象的属性

本文我们只讨论in的检查作用

in运算符检查对象是否具有给定名称的属性:

  1. > 'name' in {name: '搞前端的半夏'}
  2. true
  3. > 'name' in {}
  4. false

但是因为in会判断继承过来的属性!

  1. > 'toString' in {}
  2. true

那是因为{}继承了方法Object.prototype.toString()

Reflect.has()

Reflect是在ES2015新增的一个内置对象,提供了与Javascript对象交互的方法。

判断一个对象是否存在某个属性,和 in 运算符] 的功能完全相同。

用法:Reflect.has(obj, propName)

  1. Reflect.has({name:"搞前端的半夏"}, "name"); // true
  2. Reflect.has({name:"搞前端的半夏"}, "age"); // false
  3.  
  4. Reflect.has({name:"搞前端的半夏"}, "toString"); //true

hasOwnProperty

hasOwnProperty这个方法可以用来检测一个对象是否含有特定的自身属性,即是用来判断一个属性是定义在对象本身而不是继承自原型链的,

通过对象字面量或者构造函数法创建的对象都从Object.prototype继承了hasOwnProperty()。

构造函数法

  1. o = new Object();
  2. o.name = '搞前端的半夏';
  3. o.hasOwnProperty('name'); // 返回 true
  4. o.hasOwnProperty('toString'); // 返回 false
  5. o.hasOwnProperty('hasOwnProperty'); // 返回 false

对象字面量

  1. o={name:"搞前端的半夏"}
  2. o.hasOwnProperty('name'); // 返回 true
  3. o.hasOwnProperty('toString'); // 返回 false
  4. o.hasOwnProperty('hasOwnProperty'); // 返回 false

缺点

不支持create

但是下面这种情况:

  1. o = Object.create(null)
  2. o.hasOwnProperty('name'); // 返回 true

会直接报错:

  1. Uncaught TypeError: o.hasOwnProperty is not a function
  2. at <anonymous>:1:3

覆盖报错

如果一个对象有一个自己的名为 name 的属性'hasOwnProperty',那么该属性将被覆盖Object.prototype.hasOwnProperty并且我们无法访问它:

  1. o={hasOwnProperty:"搞前端的半夏"}
  2. o.hasOwnProperty('name');

直接报错

  1. VM123:3 Uncaught TypeError: o.hasOwnProperty is not a function
  2. at <anonymous>:3:3

Object.prototype.hasOwnProperty()

用法:Object.prototype.hasOwnProperty.call(obj, propName);,接受两个参数。请注意我们这里用到了call。改变this的指向。

Object.prototype.hasOwnProperty除了支持hasOwnProperty的相同用法,同时还解决了hasOwnProperty的两个缺点。

  1. o={hasOwnProperty:"搞前端的半夏"}
  2. Object.prototype.hasOwnProperty.call.hasOwnProperty(o,'name'); // 返回false

ES13(ES2022)Object.hasOwn()

Object.hasOwn(),目前来看就是替代Object.prototype.hasOwnProperty.call()。

如果用Object.prototype.hasOwnProperty.call() 来封装的话,代码如下:

  1. function hasOwn(obj, propName) {
  2. return Object.prototype.hasOwnProperty.call(obj, propName);
  3. }
  1. Object.hasOwn({name: '搞前端的半夏'}, 'name') // true
  2. Object.hasOwn({}, 'name') //false
  3. Object.hasOwn({}, 'toString') //false
  4. Object.hasOwn(Object.create(null), 'name') //false
  5. Object.hasOwn({hasOwnProperty: 'yes'}, 'name') //false
  6. Object.hasOwn({hasOwn: 'yes'}, 'name') //false

总结

到此这篇关于JS判断对象属性是否存在的五种方案的文章就介绍到这了,更多相关JS判断对象属性存在内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号