JS小坑总结

博客指出不能用{}!= {}判断对象是否为空,介绍了相等操作符比较不同数据类型的规则,说明两个对象比较时需指向同一对象才相等,所以{} == {} 一定为false。还给出三种判断对象是否为空的方法,即使用for…in、JSON.stringify()、Object.keys(obj)。

js 在开发中遇到的一些小坑

不能用{} != {} 来判断一个对象是否为空

相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性。在转换不同的数据类型时,相等操作符遵循下列基本规则:

  1. 如果有一个操作数是布尔值,则在比较相等性之前,将其转换为数值;
 1==true // true
 '1'==true //true
  1. 如果一个操作数是字符串,另一个操作数是数值,在比较之前先将字符串转换为数值
'1'== 1 // true
1== '1' // true
  1. 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;
  2. 如果有一个操作数是 NaN,无论另一个操作数是什么,相等操作符都返回 false;
  3. 如果两个操作数都是对象,则比较它们是不是同一个对象。如果指向同一个对象,则相等操作符返回 true;
  4. 在比较相等性之前,不能将 null 和 undefined 转成其他值。
  5. null 和 undefined 是相等的。

依据上面的第五条,我们可以知道,两个对象的指向一个不同的,故无论如何 {} =={} 一定是 fasle.
那我们要如何去判断一个对象是否为空呢?
法一:使用 for…in

let a = { name: '222' };
let a = {};

function emptyObj(obj) {
    let result = true;
    for (var i in obj) {
        result = false
    }
    return result
}
console.log(emptyObj(a)) // fasle
console.log(emptyObj(b)) // true

方法二:使用JSON.stringify()

JSON 自带的 stringify() 方法,用于将 JavaScript 值转换为 JSON 字符串,通过判断给定的对象转换后的是否费‘{}’l来判断对象是否为空

let a = { name: '222' };
let b = {};


function emptyObj(obj) {
    return JSON.stringify(obj) === '{}'
}
console.log(emptyObj(a)) // fasle
console.log(emptyObj(b)) //true


方法三:使用Object.keys(obj)

ES6 新增的方法 Object.keys():Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。

如果我们的对象为空,他会返回一个空数组,如下:

let a = { name: '222' };
let b = {};


function emptyObj(obj) {
    return Object.keys(obj).length === 0
}
console.log(emptyObj(a))
console.log(emptyObj(b))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值