==和===的区别
2017-10-09 本文已影响7人
胡思乱想的Alice
a==b a===b
-
当a和b的类型相同时,==和===的作用是一样的
比较类型为数值、字符串和布尔值时,值相同则返回true
比较类型为对象、数组和函数时,引用地址相同则返回true -
当a和b的类型不同时,a===b直接返回false,a==b则会发生类型转换
类型转换的规则
2.1 比较对象为数值、字符串和布尔值时,会直接转换为数值进行比较
比如说'0'==0 false==0 true==1 '0'==false
2.2 对象与原始数值比较时,对象会转换为原始类型的值再进行比较
Q:对象转换为原始类型的规则 valueOf和toString
[http://www.cnblogs.com/ecalf/archive/2012/11/29/2793921.html]
对于对象型参与 算术运算和 "==" 运算, 不等于比较元算(> 、<、>=、<=),自动发生数据类型转换,先调用 valueOf ,如果 valueOf 不能返回标量(number、string、boolean) 和 undefined、 null , 将继续调用 toString, 如果仍然返回对象型数据,报错。
obj={x:1}
b==1 //false
b.valueOf() //{x: 1}
b.toString() //"[object Object]"
b={x:1,toString:function(){return '1'}}
b==1 //true
![](https://img.haomeiwen.com/i867750/43a6db93789df4dc.png)
Date 类型的例外: 在 + 和 == 运算中,优先 toString ,这应该是规范对该数据类型的特殊对待。
在界面输出中, 比如 alert() 和 document.write() ,将优先调用 toString,如果过得不到 标量 或 undefined、null ,再尝试 valueOf ,如果仍然返回对象则报错。
此处应该注意的是当发生等于运算时,首先比较类型,类型不同的情况下再进行类型转换。但是在发生大于小于运算时,是直接转换为数值进行比较的。
更正:在javascript字符串运算符的比较中,遵循一种名为“字典系”的排列算法。当数字以字符串的形式比较,会转换为ASCII码,然后从首位开始逐位比较,若不等则直接返回布尔值,若相等则继续比较下一位。
所以"13">"3"为false,"35">"3"为true
Number(null) //0
Number(undefined) //NaN
所以undefined 与任何其他数据(包括 null)进行大于、小于比较都是 false
[1]==[1] //false [1]>=[1] //true null==0 //false null>=0 //true
- null==undefined //true
null===undefined //false