JavaScript中==与===的区别详解

作者:函数茶馆

时间:2026-10-24

浏览:165

本文深入解析JavaScript中相等操作符==与全等操作符===的区别。===要求类型与值完全一致,不进行隐式转换;==在类型不同时执行隐式类型转换。重点讲解了boolean、string、number及对象的转换规则,并指出NaN与任何值(包括自身)比较均返回false,需使用!=进行特殊判断。

文章目录

前言

前言

在编写代码时,判断变量是否相等是常见需求。ECMAScript规范提供了两种相等操作符:“==”和“===”,二者均返回布尔值。通常,“==”被称为相等运算符,“===”被称为全等运算符。当比较的两个变量数据类型一致时,逻辑较为直观;但当类型不一致或涉及对象时,规则变得复杂。下文将分别阐述操作数类型不同时的运算结果。

全等操作符“===”

全等操作符“===”

全等运算符“===”的逻辑相对简单。执行比较时,首先检查操作符两侧的操作数数据类型是否一致。若类型不同,直接返回false;若类型相同,则进一步比较值。对于布尔值,两侧必须同为true或同为false才返回true,否则为false。对于数值,仅当大小完全相等时返回true。对于字符串,先比较长度length,若长度不同则返回false;若长度相同,则逐字符比较,只要有一位不同即返回false,全部相同才返回true。需注意,字符串比较不忽略空格,为确保安全,建议先去除空格并统一转换为大写或小写后再比较。null仅在null===null时返回true,其余情况均为false;undefined同理,仅undefined===undefined时返回true。例如:


true === 1    //false
"1" === 1    //false
 
//boolean的比较
true === true  //true
true === false  //false

//string的比较
"hello" === "helloworrld" //false
"hello" === "world" //false
"hello" === " hello" //false
"hello" === "hellO" //false
"hello" === "hello" //true

//number的比较
1 === 1  //true
1 === 1.0 //true
1 === 1.2 //false

//null和undefined的比较
undefined === undefined  //true
null === null       //true
undefined === null    //false,两者在"=="时才返回true

若对“===”比较的两个操作数均为非基本类型的对象,判断依据是这两个变量是否指向“同一个”对象。


var a,b,c;
a = b = {
	name : '柳轻侯',
	city : '南京'
};
c = {
	name : '柳轻侯',
	city : '南京'
};
a === b   //true
a === c   //false

两个对象即使属性名和值完全相同,也不视为全等。例如a和c均为Object实例,拥有相同的属性和值,但它们指向不同的内存实例,因此a === c为false。而a和b指向同一个对象实例,即它们是同一对象的不同引用,故a === b为true。“!==”与“===”的比较逻辑一致,此处不再赘述。

相等操作符“==”

相等操作符“==”

与全等运算符不同,当“==”比较的两个变量类型不同时,不会直接返回false,而是执行隐式的类型转换,将两个值转换为相同类型后再进行比较。这种转化的具体规则如下。

在转化不同数据类型时,相等和不等操作符遵循以下基本规则:

  • 若其中一个操作数是boolean值,比较前会先将该boolean值转换为number值,其中true转为1,false转为0;
  • 若其中一个操作数是string类型,另一个是number类型,比较前会先将string类型转换为number类型,再进行判断;
  • 在比较前,undefined和null不会转换为其他值进行比较;
  • 若其中一个操作数是对象,另一个是基本类型值,比较前会先将对象转换为基本类型值,随后依据前述规则进行后续比较;

两个操作数在比较时还遵循下列特定规则:

  • undefined和null是相等的,即:undefined == null;
  • 若有一个操作数是NaN,则返回false,即使两个操作数都是NaN,结果仍为false;
  • 若两个操作数均为对象,则比较规则与“===”相同,除非这两个操作数指向同一个对象,此时返回true,否则返回false;

此处需特别注意,NaN == NaN返回false。NaN意为“非数字”,表示该操作数是一个不确定的非数值,其值未知甚至无法用JavaScript语法表示。由于两个未知量无法确定具体值,因此不能说它们相等。既然不能使用“==”来比较,如何判定一个变量是否为NaN?可以采取反向思维,使用“!=”来判断变量是否不等于NaN。例如:


//如果需要判定一个变量是不是NaN,可以如下
//a是你需要判定的变量
if((typeof a === "number") && a != NaN ){  //此处需要注意,NaN也是number类型
	//TODO 
}

常见比较情况及其结果

常见比较情况及其结果


null == undefined  // true 
"NaN" == NaN    // false 
5 == NaN      // false 
NaN == NaN     // false 
NaN != NaN     // true 
false == 0     // true 
true == 1      // true 
true == 2      // false 
undefined == 0   // false 
null == 0      // false
"5" == 5      // true

典型例题解析

![] == [] //true

这是一道容易令人困惑的题目。按常规逻辑,对操作数取反后的值应与其原值相反,但事实上![] == []返回true。首先,![]的值为false,因为[]被视为数组实例(对象),而对象在布尔上下文中为真值,对其取反得到假值false。其次看等号右侧,[]是对象,转换为基本类型时,先调用valueOf方法,返回数组本身(非基本值),接着调用toString方法,返回空字符串“”。此时比较变为false == “”。根据规则,若操作数含boolean,将其转为数值,false转为0。问题进一步转化为0 == “”。当number与string比较时,string转为number,空字符串“”转为0。最终问题演变为0 == 0,结果显然为true。需注意,![]是将[]视为整体逻辑值直接取反,而非先转换基本值再取反。

小结

小结

“==”在比较不同类型值时会进行隐式类型转换,而“===”不进行转换。全等一定相等,但相等不一定全等,这是充分不必要条件。undefined和null相等但不全等,且在相等比较时不转化为其他类型值。NaN不等于NaN,判断变量是否为NaN应使用“!=”。对象与非对象比较时,先转为基本类型值,再依据上述规则进行比较。

参考资料

参考资料

《javascript高级程序设计》 《javascript权威指南》

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章