操作符
== 和 === 区别
解析
==
和 ===
等号的区别在于, ==
当比对的值类型不同时会发生类型转换。记住如下核心点
- 相同类型比较则规则同
===
- 不同基础类型之间的比较,最终会退化为数值比较(不考虑 Symbol)
- 基础类型同对象的比较会退化为,基础类型同,
ToPrimitive(对象)
的比较,ToPrimitive
则会执行如下操作- 先采用
valueOf
返回值 - 若无结果采用
toString
返回值
- 先采用
参看 ECMAScript == 规范 详细比对步骤如下,假设比对为 x == y
- x,y 类型相同则比较结果同
x === y
- x,y 为
null == undefined
或undefined == null
时返回 true - x 为 Number 类型,y 为字符串 结果同
x == ToNumber(y)
- x 为字符串,y 为 Number 类型,结果同
ToNumber(x) == y
- x 为 BigInt,y 为字符串,结果为
x == StringToBigInt(y)
- 如果 x 为字符串,y 为 BigInt,结果为
y == x
然后采用第五步进行比较 - 如果 x 为 Boolean,则采用
ToNumber(x) == y
比较 - 如果 y 为 Boolean 则转换为
x == ToNumber(y)
- 如果 x 为 String,Number,BigInt,Symbol,y 为对象
x == ToPrimitive(y)
- 如果 x 为对象,有 为 String,Number,BigInt,Symbol 则转换为
ToPrimitive(x) == y
- 如果 x 为 BigInt ,y 为 Number
- x 和 y 中任意值为 NaN 返回 false
- 比较两者数值相同返回 true 不同返回 false
typeof
操作符优先级
console.log(1 < 2 < 3)
console.log(3 > 2 > 1)
null 判断
typeof null
解析
连续赋值
(function () {
const a = b = 3
})()
console.log('a defined? ' + (typeof a !== 'undefined'))
console.log('b defined? ' + (typeof b !== 'undefined'))
Object.is 与全等运算符(===)有何区别
Object.is()
与全等运算符(===
)都用于比较两个值是否相等,但它们之间存在一些区别:
一、对特殊值的处理
NaN
的比较:
===
认为NaN
不等于任何值,包括它自身。Object.is()
认为NaN
只等于NaN
。- 例如:
console.log(NaN === NaN) // false
console.log(Object.is(NaN, NaN)) // true
-0
和+0
的比较:
===
认为-0
和+0
是相等的。Object.is()
可以区分-0
和+0
。- 例如:
console.log(+0 === -0) // true
console.log(Object.is(-0, +0)) // false
二、一般值的比较
- 对于其他值的比较,
Object.is()
和===
的行为类似:
- 比较两个数字、字符串、布尔值、对象等,如果它们的值和类型都相同,则认为它们相等。
- 例如:
console.log(5 === 5) // true
console.log(Object.is(5, 5)) // true
const obj1 = { a: 1 }
const obj2 = { a: 1 }
console.log(obj1 === obj1) // true
console.log(obj1 === obj2) // false
console.log(Object.is(obj1, obj1)) // true
console.log(Object.is(obj1, obj2)) // false