Object.is() 与比较操作符 “===”、“==” 的区别?
使用双等号(==)进行相等判断时,如果两边的类型不一致,则会进 行强制类型转化后再进行比较。
使用三等号(===)进行相等判断时,如果两边的类型不一致时,不 会做强制类型准换,直接返回 false。
使用 Object.is 来进行相等判断时,一般情况下和三等号的判断相 同,它处理了一些特殊的情况,比如 -0 和 +0 不再相等,两个 NaN是相等的。
如何判断一个对象是空对象?
可以使用JSON.stringify和Object.keys()来判断。
if(JSON.stringify(obj)==="{}"){
console.log('空对象')}
if(Object.keys(obj).length===0) {
console.log('空对象')
}
如何判断一个数组?
判断是否是数组
let arr = []console.log(Array.isArray(arr))//true
判断是否是空数组
let arr = []console.log(arr.length ===0)
思考:[]==[],[]===[],为什么==和===的结果是一致的?
console.log([]===[])//fasle
console.log([]==[])//false
思考:[]==[],[]==![]
console.log([]===[])//fasle
console.log([]==![])//true
[]==[]: 在js中比较对象比较采用的是引用的比较,在[]==[]中,用字面量创建了两个数组对象,比较两端对象类型一致后,再用===进行比较,比较两个数组对象的引用的结果自然是false。 []==![]: 比较前得先知道js的隐式转换规则: 如果有一端为布尔值,则在比较相等之前先将其转换(false为0,而true为1); 如果一端是字符串,另一端是数值,在比较相等性之前先将字符串转换为数值 如果一端是对象,另一端不是,则将对象转换为基本类型值,再进行上两条的判断。 特别的null和undefined不能转换成任何值,在取反时两个都为true。 *在[]==![]比较中,!的优先级高,先进行![],由于js的隐式转换规则,又因为![]是布尔型,所以![]转换为0。在一端为引用类型,另一端不是时,先将引用类型转换为String类型,再转成Number类型进行比较,所以[]先转换为“”空字符串,在转换为0。相当于0==0,因此是true。
思考:{} == !{}的结果为false?
[] == ![]执行结果为true,为何同样为引用类型的{} == !{}就为false?,这是因为[]和{}的toString()方法不同。
在对象上调用toString方法,此时是通过继承Object.prototype得到的。此时返回值格式为字符串 [object Constructor]。 Constructor指的是构造函数。如果是对象,Constructor = Object, 如果是数组,Constructor = Array。
在数组上调用toString方法,此时是通过继承Array.prototype得到的。此时在数组原型上重写了toSring方法,覆盖了对象上的toString方法,在数组原型上的toString方法在不传递参数的情况下,会将数组以逗号的形式转换为字符串,实现与join()或者join(',')相同。不仅是数组,正则和函数也重写了toString。
分析{} == !{}得出以下思路:
- 隐式调用
Boolean转型函数,对{}转换成Boolean值,再对结果取反。此时比较{} == false。 - 隐式调用
Number转型函数,将false转换为数值0,此时比较{} == 0。 - 调用
valueOf方法和toString方法,此时{}.toString()为[object Object],比较[object Object] == 0。 - 最后返回
false。