【随笔】js中==和===区别
等于操作符:==
如果操作数相等,则返回 true
。在比较过程中,会先进行类型转换,再确定操作数是否相等。
比较过程:
- 相同操作类型,相同则进行操作数比较
- 不同操作类型,先进行数据类型转换
- 两个简单类型,字符串和布尔值都会转为数值,再比较
- 简单类型与引用类型,对象转化成其原始类型的值,再比较
- 两个引用类型,则比较是否指向同一对象
null
和undefined
相等- 存在
NaN
则返回false
布尔值和字符串,在与数值比较时,会转为数值进行比较
// true为布尔型,转为数值1
true == 1; // true
// "1"为字符串型,转为数值1
"1" == 1; // true
布尔值和字符串比较,两侧类型不同,布尔值会转为数值0/1,此时为数值 == 字符串
,两侧操作类型仍然不同,此时字符串会转为数值,进行 数值 === 数值
比较,操作数相同返回 true
// 转为 1 === 1
true == "1"; // true
// 转为 1 === 2
true == "2"; // false
// 对象属性一般为空(null) 或者为未定义(undefined)
null == undefined; // true
"undefined" == undefined; // false
NaN表示一个值不是数值类型,判断一个值非数值类型使用isNaN()
NaN == NaN; // false
isNaN(NaN); // true
两个对象,比较是否指向同一个对象
let obj1 = {
name:"xxx"};
let obj2 = {
name:"xxx"};
let obj2 = obj1;
obj1 == obj2; // false
obj1 == obj3; // true
全等操作符 ===
只有两个操作数在不转换的前提下相等才返回true
,要求类型相同,值相同。
比较过程:
- 如果类型不同,就一定不相等
- 如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)
- 如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。
- 如果两个值都是true,或是false,那么相等
- 如果两个值都引用同一个对象或是函数,那么相等,否则不相等
- 如果两个值都是null,或是undefined,那么相等
全等操作符不会进行类型转换
"1" === 1; // false,不相等,数据类型不同
1 === 1); // true,相等,数据类型相同值也相同
null
和undefined
与自身严格相等
null === null; // true
undefined === undefined; // true
小结
等于操作符 == 会经过类型转换后转为全等比较 === ,虽然容错性较高,但是 ===
全等更加准确和高效,一般的等于操作建议使用 ===
。
对象属性的比较,如果是判断null
或者undefined
,使用相等操作符==
更加简洁。
const obj = {
};
if(obj.x == null){
...
}
// 等同于
if(obj.x === null || obj.x === undefined){
...
}
参考文档:
https://vue3js.cn/interview/JavaScript/<mark>%20_</mark>=.html
https://www.cnblogs.com/nelson-hu/p/7922731.html