作者:魏文庆
如果你只想知道==与===的区别,请直接看总结,当然我更希望您能耐心看完全文。
Javascript中用于相等比较的操作符有两个==和===。==我们通常称为“等于”,而===我们通常称为“严格等于”。本文将对==和===做详细说明。===相对简单,让我们从===开始。
===首先要求比较双方类型相同, 还要求比较双方值相等。 如果比较的双方是都是对象类型,只有指向同一个对象,才能严格相等。关于javascript的数据类型,请参见Javascirpt基本数据类型。
本节示例如下:
// 类型相同,值相同,才严格相等
1 === 1;
"jerry" === "jerry";
true === true;
null === null;
undefined === undefined;
// 类型相同且为对象类型,必须是指向同一个的对象才严格相等
{name:"jerry"} !== {name: "jerry"} // 两个不同的{name:"jerry"}对象
var a = {name:"jerry"};
var b = a;
a === b; // 指向同一个对象
// 类型不同,不严格相等
null !== undefined;
false !== 0;
1 !== "1";
==在进行比较时,如果比较的双方数据类型不同,通常会先转换成相同的类型再进行比较。如果比较的双方类型相同,这时与===相同:如果比较的双方是对象类型,只有指向同一个对象,才能相等;如果是其他类型,比较值是否相等。
比较的双方类型相同时,可以参考===,比较双方类型相同的例子,也可作为本节的例子。下面我们重点讨论比较双方类型不同的情况。
上文中提到比较双方数据类型不同,通常会先转换成相同的类型,哪些是异常呢?null和undefined。
null和undefined在比较的时候不会转换成其他类型。null只和undefined相等。
本节示例如下:
// null和undefined相等
null == undefined;
// null/undefined比较时不会做隐式类型转换
0 != null;
"undefined" != undefined;
null != false;
我们对上例中的0!=null
进行具体分析,如果比较之前进行隐式类型转换的话,null转换成Number型的结果为0, 值是相等的,但因为null/undefined在比较之前不会隐式类型转换,所以0!=null
。"undefined" != undefined
、 null != false
原因类似。
关于隐式类型转换到指定类型的结果,其实等价于调用指定类型的构造函数, 比如null隐式类型转换成Number型的结果等于Number(null)
, undefined转换成String型的结果等于String("undefined")
,详情请参见javascript类型转换。
比较的双方数据类型不同时,进行隐式类型转换时优先转换成Number型。
本节示例如下:
// 隐式类型转换优先转换成Number型
"99" == 99; // "99"转换成Number型为99
"" == 0; // ""转换成Number型为0
true == 1; // true转换成Number型为1
false == "0";
' \n\n\n' == false;
上例中false=="0"
比较难以理解,无论是"0"转换成Boolean型(结果为true),还是把false转换成String型(结果为"false"),值都是不相等的,为什么false=="0"
呢?我们只要记住优先转换成Number型原则, false转换成Number型,等于 Number(false)
,等于0, "0"转换成Number型,等于Number("0")
, 等于0, 值相等。' \n\n\n' == false
类似,Number(' \n\n\n')
等于0, Number(false)
等于0, 值相等。
比较的双方数据类型不同且有一方是Object类型, 先把Object类型转换成原始类型。我们知道基本只有String/Number/Boolean对象能转换成有意思的原始类型。我们在程序中不推荐使用String/Number/Boolean对象(直接使用原始值), 这部分内容就不展开了。
==和===的异同点:
易于记忆的==比较的原则: