例:
var a=[1,2,3];
var b=[1,2,3];
var c=a;
var result=[a==b,a==c,a==a];
看到上述代码,你认为result的结果是什么?[true,true,true]?但是,令我们大跌眼镜的是result的结果为[false,true,true]。
这又是为什么呢?
因为javascript中对象的比较是引用的比较,而不是值的比较,所以a==c为真,a==b为假。也就是说,对象只和其本身是相等的,与其它任何对象都不相等。所以,a==a也为true。
接下来,我们来详细说说严格相等运算符===。
在执行严格相等运算(===)时,首先会计算操作符的值,然后比较这两个值(即使类型不一致也不会进行转换)。
(1).如果两操作数的类型不同,则不相等;
(2).操作数中只要出现NaN,则不相等;
(3).二者都为null或undefined,则相等;一方为null,一方为undefined,则不相等;
(4).操作数都为true或false时,则相等;
(5).操作数都为数字,且数值相等时,则相等;并且-0===0为true;
(6).操作数都为字符串,且各个位上的字符都相等时,字符串相等;
(7).两个引用指向同一个对象、函数或数组时,则相等。
相等运算符(==),它的比较并不严格,当操作数的类型一致时,它会按照严格相等的规则进行比较,但当操作数的类型不一致时,它会尝试进行类型转换。
(1).一个是null,一个是undefined时,则相等;
(2).一个值是字符串,一个值是数字时,会首先将字符串转换为数字,然后用转换之后的值进行比较;
(3).如果其中的一个操作数为true或false,则会将其先转换为1或0再比较;
(4).如果一个值为对象,另一个值为数字或是字符串,则会先将对象转换为原始值,再进行比较;
(5).其它不同类型之间的比较均为不相等。
那现在再看一个判断相等的结果:“true”==1,结果为true或false呢?
仔细想想,其实结果为false。字符型的true并不能转换为一个数字,所以结果就会返回一个NaN。