比较两个变量是否相等时,有==和===两种方式。
==的工作模式是,判断两边的变量是否为同种类型,如果不是同种类型则需要转变类型,再比较是否相等。===的工作模式是,判断两种类型是否为同种类型,如果是同种类型判断是否相等,不是同种类型就认为不相等。举例说明:
var a = "42";
var b = 42;
a = 42; //true,先将a转换成数字42,再比较
也有人将==比作松散相等(值相等即可),将===比作绝对相等(类型和值都相等),===不多说什么,只阐述==。
一、声明规则
重要的是,当==两边类型不同时,转换规则是什么。我们都知道,通过typeof()判断变量类型可能返回六种形式:number,string,boolean,object,undefined
那么如果==两边类型不同,转换规则如下:一旦一边有数字则另一边试图转换为数字,一旦一边有数字则另一边试图转换为数字,凡事布尔都会转换成数字,,null和undefined另外讲。下面一点点将来
>代表转换成的意思
1 == "1"; //true "1">1
1 == new String("1"); //true obj>"1">1
1 == []; // false []>"">0,不相等
1 == [1]; //true,[1]>"1",>1
1 == [1,2]; //false [1,2]>"1,2">NaN,而NaN和谁都不相等
0 == [1,2]; //false
1 == true; //true true>1
0 == {}; // false {}>常规对象>NaN,和谁都不等
这里涉及到一个问题,字符串转数字时,常规数字字符串转成数字,非常规转成NaN,如:
Number("123"); // 123
Number("1,2"); // NaN
二、null和undefined
null == undefined ; // true,这个东西特殊,记住吧
三、关于是否一定要用===
一直认为===准确度高,效率也会高,然而会增加代码复杂度,例如: