js 在开发中遇到的一些小坑
- 不能用{} != {} 来判断一个对象是否为空
不能用{} != {} 来判断一个对象是否为空
相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性。在转换不同的数据类型时,相等操作符遵循下列基本规则:
- 如果有一个操作数是布尔值,则在比较相等性之前,将其转换为数值;
1==true // true'1'==true //true
- 如果一个操作数是字符串,另一个操作数是数值,在比较之前先将字符串转换为数值
'1'== 1 // true
1== '1' // true
- 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;
- 如果有一个操作数是 NaN,无论另一个操作数是什么,相等操作符都返回 false;
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果指向同一个对象,则相等操作符返回 true;
- 在比较相等性之前,不能将 null 和 undefined 转成其他值。
- 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))