js中相等、大小 不同类型之间是如何进行对比的。

上个小问题

[] > [] 
false
[] < []
false
[] == []
false // why?

再上个加强版

'6xxx' < '5xx'
false
'6xxx' > '5xx'
true
'6xxx' > 5
false// why?
'6xxx' < 5
false//why?

1. 相等判断,两个等号

数组是被构造函数Array “new”出来的对象(见:[].constructor),那么“==”判断对象相等,是需要判断他们的引用
所以:
    [] == []
    //false
    {} == {}
    //false
    var a = function(){ return '';}, 
        b = function(){ return '';};
    a == b
    //false
    new Number(10) == new Number(10)
    //false   
    null == null//why?
    //true
  • 特殊的对象null:

    typeof null => 'object',但由于null是个tongyi特殊的对象,不是由构造函数Object创建而来,所以null instanceof Object => false
    假设有null的构造函数 null = new Null();那么null == null(同个对象引用), new Null() != new Null()

    综上,[] == [] 为false

2. 大小判断

先上代码,再解释

    true > false/
    //true
    true < false
    //false

    [1] > 0
    //true
    [3] > [2]
    //true
    [1,3] > 0
    //false
    [1,3] < 0
    //false
    [1,3] > [2,4]
    //false
过程中有个隐式的转换
    布尔值、undefined、null使用Number()转为数值,
    如一方为数值,将非数值使用Number()转为数值
    双方都非Number,进行toString()后,进行字符串对比大小。 

上代码先:

//调用toString转换,
var StrObj = { toString : function(){ return '5xx' } },
    NumObj = { toString : function(){ return 5 } };
    [StrObj > 4,NumObj > 4] //既 ['5xx' > 4,5 > 4]
    //false,true
    [StrObj < 6,NumObj < 6]
    //false,true

'a' < 'b'//没有使用Number或parseInt,不然以NaN进行大小对比,字符串的对比似乎进行charCode对比?
//true
'ab' < 'aa'//  第一个字符相等,判断第二个字符
//false
'ab' < 'az'
//true

'5' < '5'// 以字符串的方式来对比了,
//false
'5a' < '5b'
//true

'6xx' > 5  
//false
'6xx' < 6
//false
'5xx' < '6xx'
//false
'5xx' > '6xx'
//false

所以回归开头的小例子,对比过程如下

    [] > [] //  ([]).toString() > ([]).toString()
    [] < [] // ([]).toString() < ([]).toString()
    [] == [] // new Array() == new Array()

'6xxx' < '5xx'//  字符串的对比,6大于5,所以不需要对比后面的了
'6xxx' > '5xx'// 
'6xxx' > 5// NaN 与 5
posted @ 2014-11-21 00:40  henry_li  阅读(336)  评论(0编辑  收藏  举报