JavaScript双等号(==)与三等号(===)的区别举例详解

作者:拾光时间:2026-10-31 21:29:54浏览:514

本文详细解析JavaScript中双等号(==)与三等号(===)的区别。双等号在类型不同时会自动进行隐式类型转换,属于宽松比较;而三等号要求类型与值均相同,属于严格比较。文章通过具体代码示例,对比了null、undefined、NaN及引用类型的处理差异,并建议在开发中优先使用三等号以避免意外结果。

前言:

双等号与三等号的区别是前端面试中的高频考点。许多资深前端开发者虽然对其有大致了解,但可能缺乏系统性的掌握。希望阅读完本文后,你能彻底理清这一知识点。

一.等于操作符(==)

使用双等号(==)进行比较时,JavaScript引擎首先检查两个操作数的类型是否一致。若类型相同,则直接比较值;若类型不同,则先将两个操作数转换为相同类型,再进行比较(特殊情况见后文)。

在类型转换过程中,JavaScript遵循以下规则:

1.如果比较的两个值类型相同,则直接返回比较结果。

console.log(1 == 1) //true

2.如果比较的两个值类型不同,则先将比较的两个值转换为相同的类型,然后再进行比较(一般情况,下面会讲特殊情况)。

(1)如果一个值是数字,另一个值是字符串,JS会尝试将字符串转换为数字,然后再进行比较。

console.log(1 == "1") //true

(2)Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型。

console.log(true == 1) //true
console.log(true == "1") //true

(3)两个值都是引用类型且类型相同,它们指向的是同一个内存地址的话,返回true。

console.log({} == {}) //false 虽然类型相同,但引用地址不同

const obj = {}
console.log(obj == obj) //true 引用地址相同

(4)如果一个值是引用类型,另一个值是原始类型,JS会尝试使用valueOf()或toString()方法将引用类型转换为原始类型的值,然后再进行比较。

console.log("[object Object]" == {}) // true, 对象和字符串比较,没有自定义valueOf方法,对象通过 toString 得到一个基本类型值

const obj = {
  valueOf: function () {
    return 1
  },
}
console.log(obj == 1) // true 对象和字符串比较,有自定义valueOf方法,调用valueOf方法

console.log("1,2,3" == [1, 2, 3]) // true, 数组和字符串比较,没有自定义valueOf方法 数组通过 toString 得到一个基本类型值

3.在特殊情况下,如果比较的两个值的类型不同,不会进行类型转换,直接进行比较。

(1)null == undefined比较结果是true。null、undefined和其他任何结果的比较值都为false,但是null和null,undefined和undefined为true。

console.log(null == undefined) //true

console.log(null == null) //true
console.log(null == "") //false
console.log(null == 0) //false
console.log(null == false) //false

console.log(undefined== undefined) //true
console.log(undefined == "") //false
console.log(undefined == 0) //false
console.log(undefined == false) //false

(2)NaN和其他任何类型比较是false(包括和它自己)

console.log(NaN == NaN) //false
console.log(NaN == undefined) //false

二.全等操作符(===)

1.如果比较的两个值类型不同,直接返回false。

console.log(1 === "1") //false

2.如果比较的两个值是数字,并且它们具有相同的值,返回true。

3.如果比较的两个值是字符串,并且它们具有相同的值,返回true。

4.如果比较的两个值是布尔值,并且它们具有相同的真值或假值,返回true。

5.如果比较的两个值是引用类型,它们指向的是同一个内存地址,返回true。

console.log({} === {}) //false 虽然类型,内容相同,但引用地址不同

const obj = {}
console.log(obj === obj) //true 引用地址相同

6.如果比较的两个值都是null或都是undefined,它们被视为相等的,返回true。

console.log(null === undefined) //false

console.log(null === null) //true
console.log(null === "") //false
console.log(null === 0) //false
console.log(null === false) //false

console.log(undefined=== undefined) //true
console.log(undefined === "") //false
console.log(undefined === 0) //false
console.log(undefined === false) //false

7.NaN和其他任何类型比较是false(包括和它自己)

console.log(NaN === NaN) //false
console.log(NaN === undefined) //false
console.log(NaN === 0) //false
console.log(NaN === null) //false
console.log(NaN === "") //false

三.区别:

1.双等号比较可能会进行类型转换,是宽松比较;而三等号不会进行类型转换,是严格比较

2.null和undefined的比较不同

双等号下null和undefined比较返回为true;而三等号下null和undefined比较返回为false

console.log(null == undefined) //true
console.log(null === undefined) //false

在实际开发中更推荐用三等号进行比较,能提高安全性,因为双等号比较可能会进行类型转换,可能会带来意外的结果。当然你能正确使用双等号的话,使用双等号也无所谓,能提高代码简洁性。(但是据我所知,蛮多喜欢用双等号的前端开发者多多少少容易出bug,小编之前帮一位同事改bug,发现几个bug都是由双等号引起的)

总结

到此这篇关于JavaScript双等号(==)与三等号(===)区别的文章就介绍到这了,更多相关js双等号和三等号区别内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

作者最新文章