ES6 判断是否为空对象及属性包含

举报
SHQ5785 发表于 2024/04/10 15:53:33 2024/04/10
【摘要】 一、前言前端业务逻辑处理阶段,对于接口响应中返回对象处理是十分常见的应用场景。 二、对象识别 2.1 ES6 Object.keys()Object.keys()是ES6中的新方法, 返回值是对象中属性名组成的数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。Object.keys(obj).length === 0 && obj.constructor ...

一、前言

前端业务逻辑处理阶段,对于接口响应中返回对象处理是十分常见的应用场景。

二、对象识别

2.1 ES6 Object.keys()

Object.keys()ES6中的新方法, 返回值是对象中属性名组成的数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

Object.keys(obj).length === 0 && obj.constructor === Object  // true表示为空对象,false为非空对象

缺点: 部分浏览器不支持,需要通过 babel 类插件转为 ES5。使用范例如下:

var data = {};

var arr = Object.keys(data);

alert(arr.length == 0);//true 即为空对象

var datas={a:1,b:2};

var aRR = Object.keys(datas);

console.log(aRR) -->   ['a','b']

2.2 将 json 对象转化为 json 字符串,再判断该字符串是否为"{}"

var data = {};
var b = (JSON.stringify(data) == "{}");
alert(b);//true

2.3 for in 循环判断

var obj = {};
var b = function() {
  for(var key in obj) {
    return false;
  }
 return true;
}
alert(b());//true

2.4 jquery isEmptyObject()

此方法是jquery将方法3 (for in)进行封装,使用时需要依赖jquery

var data = {};
var b = $.isEmptyObject(data);
alert(b);//true

2.5 Object.getOwnPropertyNames()

此方法是使用Object对象的getOwnPropertyNames方法,获取到对象中的属性名,存到一个数组中,返回数组对象,我们可以通过判断数组的length来判断此对象是否为空。

注意:此方法不兼容ie8,其余浏览器没有测试。

var data = {};
var arr = Object.getOwnPropertyNames(data);
alert(arr.length == 0);//true

三、属性识别

3.1 应用 !==

最简单的方法,就是使用“!==”进行判断,这种方法在工作中很常见,可以根据该方法可以判断继承来的属性。

let obj = { x: 1 };
obj.x !== undefined;   // true 有x属性
obj.y !== undefined;   // false 无y属性
obj.toString !== undefined;   // true 从Object继承toString属性

3.2 使用 in 运算符

in 的语法是: attr in obj , 同样,该表达式也返回一个布尔值。

let obj = { x: 1 };
'x' in obj;             // true
'y' in obj;             // false
'toString' in obj;      // true

in运算符语法很简单,效果跟undefined是相同的,与undefined不同的是,in可以区分存在但值为undefined的属性。

let obj = { x: undefined };
obj.x !== undefined;            // false
'x' in obj;                     // true

可以看出,如果属性的值为undefined的时候,使用 !== 的方法就不奏效了,所以在工作中需要注意一下这一块。

3.3 应用 hasOwnProperty()

应用对象的 hasOwnProperty() 方法也可以检测指定属性名是否在对象内,同样返回是布尔值, 当检测属性为自有属性(非继承)的时候返回true

let obj = { x: 1, abc: 2 };
let a = 'a';
let b = 'bc';
obj.hasOwnProperty('x');               // true 包含
obj.hasOwnProperty('y');               // false 不包含
obj.hasOwnProperty('toString');        // false 继承属性
obj.hasOwnProperty(a + b);             // true 判断的是属性abc

in 运算符和 hasOwnProperty() 的区别就在于 in 运算符可以判断来自继承的属性,而hasOwnProperty() 不能。针对这一点在工作中加以运用还是很有帮助的。

3.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 不可枚举

3.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

通过使用ES5提供的Object.defineProperty()方法为person对象增加了一个不可枚举的名为 test 的属性,它的值为 ‘testVal’。Object.keys()在获得了一个对象的可枚举属性之后,接下来的操作就变成了在数组中查找符合条件的元素。在上述代码中使用了数组内置的includes()方法,对于旧版浏览器可能需要改用 indexOf()等方法。

综上所述,判断对象是否存在某个属性的处理逻辑如下:

// true表示为空对象,false为非空对象
// 判断对象是否存在某属性
export function isPropExist(obj, key) {
  if (Object.keys(obj).length !== 0 && obj.constructor === Object) {
    return obj.hasOwnProperty(key);
  }
  return false;
}

四、拓展阅读

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。