转:js不同类型对象的比较规则
2014-07-22 12:56
281 查看
Type(x) | Type(y) | Result |
---|---|---|
type(x)==type(y) | x===y | |
otherwise... | false | |
null | undefined | true |
undefined | null | true |
Number | String | x==toNumber(y) |
String | Number | toNumber(x)==y |
Boolean | (any) | toNumber(x)==y |
(any) | Boolean | x==toNumber(y) |
String or Number | Object | x==toPrimitive(y) |
Object | String or Number | toPrimitive(x)==y |
~~~这就是通常说的js复杂的隐式类型转换! 经过这样一整理,似乎也不是很复杂
例子一:
[0]==ture;
首先会把ture进行toNumber,结果为1,式子及转化为 [0]==1
然后[0]会被toString(),结果为“0”,式子转化为“0”==1
接着“0”会被toNumber(),结果为0,式子转化为0==1
最后根据type(x)==type(y),式子转化为0===1
所以[0]==true会得到false
例子二:
“potato”==true;
首先true会被toNumber,结果为1,式子转化为“potato”==1
然后“potato”会被toNumber,结果为NaN,式子转化为NaN==1
根据typeof(x)==typeof(y),式子转化为NaN===1
所以“potato”==true会得到false
例子三:
object with valueOf
str = new Number(1);
str.toString = function(){return "2"};
str==1;
这里typeof str == "object",所以对str进行toPrimitive,这里会对str进行valueOf取值得到1
所以式子转化为1==1
所以str==1得到true
例子四:
object with toString
var obj = {
toString : function(){return "2"}
};
obj==1
这里typeof obj == "object",对obj进行toPrimitive,首先进行valueOf得到object,继续进行toString()得到“2”,式子专为"2"==1
对“2”进行toNumber得到2,式子转为2==1
所以obj==1得到false
例子5:
[]==[]
左右是不同的对象,所以false
![]==[]
首先![]==false,这里[]是一个即存在的对象,若将其强制专为bool类型,通过!![]得到ture,所以![]==false,此时式子专为false==[]
然后false专为0,式子专为0==[]
然后[]专为"",式子专为0==“”
然后""转为0,式子专为0==0
所以![]==[]得到true
例子6:
!{}=={}
首先!{}专为false,规则和5一样,式子转为false=={}
false专为0,式子转为0=={}
对{}进行toPrimitive得到"[object Object]",式子专为0=="[object Object]"
对"[object Object]"进行toNumber得到NaN,式子专为0==NaN
所以!{}=={}得到 false
相关文章推荐
- js中不同类型作比较的规律(布尔运算)
- Java相同类型的两个对象比较属性值,得到不同属性的名称和对应的值,附代码实例
- 【JS基础】类型转换——不同数据类型比较
- js比较两个数组对象,取出不同的值
- 不同类型对象的内存结构比较
- JS中不同类型的值比较问题
- js基本类型、对象的比较
- python 之 不同类型对象的内存占用、大小比较
- XPath中如何比较不同类型的对象
- java比较两段json不同工具类(两个同一类型的java对象比较也推荐转成JSON再进行比较)
- js中,关于不同类型比较,各种类型的转换原则
- js基本类型、对象的各自比较
- js基本类型、对象的各自比较
- Java为什么两个值相等的对象==比较返回false而两个值相等的不同类型的的基本数据类型返回true
- C语言不同类型变量与零值比较的规范写法
- 不同类型的浏览器调用不同的CSS(条件CSS与JS)
- js判断对象是否是某一类型
- js 比较yyyy-MM-dd文本日期类型是否在指定的天数内
- 缓存对象类型信息与使用GetType、typeof()的性能比较
- masterpage中服务器端控件命名规则和如何用控件名取得document中的对象,用js动态设置控件事件和属性