mobile wallpaper 1
mobile wallpaper 2
mobile wallpaper 3
mobile wallpaper 4
408 字
1 分钟
JS判断对象是否存在属性及相关错误警告
2021-05-28

undefined#

自有属性和继承属性均可判断
缺点:当属性值为undefined时无法判断

const o = {
x: 1
};
o.x !== undefined; //true,自有属性存在
o.y !== undefined; //false
o.toString !== undefined; //true,是一个继承属性

in 关键字#

可以判断对象的自有属性继承来的属性是否存在。

const o = {
x: 1
};
"x" in o //true; 自有属性存在
"y" in o //false;
"toString" in o; //true,是一个继承属性

对象的hasOwnProperty()方法#

只能判断自有属性是否存在,对于继承属性会返回 false

const o = {
x: 1
};
o.hasOwnProperty("x");    //true,自有属性中有x
o.hasOwnProperty("y");    //false,自有属性中不存在y
o.hasOwnProperty("toString"); //false,这是一个继承属性,但不是自有属性

该属性Eslint环境中抛出警告问题#

参考

使用时会抛出如下警告

Do not access Object.prototype method hasOwnProperty from target object no-prototype-builtins

警告原因:新版本的 ESLint 使用了禁止直接调用 Object.prototypes 的内置属性开关,在 ESLint 配置文件中的 "extends": "eslint:recommended" 属性启用了此规则。

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

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

解决方法:为了避免这种细微的 bug,最好总是从 Object.prototype 调用这些方法。如下

o.hasOwnProperty("x"); // 不安全
Object.prototype.hasOwnProperty.call(o, "x"); // 安全

当然也可以直接关闭提示,但不建议这么做

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

JS判断对象是否存在属性及相关错误警告
https://marrydream.top/posts/web前端/js判断对象是否存在属性及相关错误警告/
作者
茉铃
发布于
2021-05-28
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录