JavaScript的基本类型进行大小比较时,能直接比较大小的,除了<number>、<string>、<boolean>外,还有有如下几个:
- null === null
- undefined === undefined
- NaN != NaN
- object / function != object / function (下面的研究会说明)
研究<object>对象的大小比较。
请看下面的代码
var a = {data: [20, 20], value: 20};
var b = {data: [10, 30], value: 10};
a > b; // false
a < b; // false
a.valueOf = function () {
return this.value; // 20
};
b.valueOf = function () {
return this.value; // 10
};
a > b; // true
a < b; // false
上面代码说明,比较两个object时,会先调用object的valueOf方法,再对其结果进行比较。
再看下面的代码:
a.valueOf = function () {
return this.data; // [20, 20]
};
b.valueOf = function () {
return this.data; // [10, 30]
};
a > b; // false
a < b; // false
a.toString = function () {
return this.value; // 20
};
b.toString = function () {
return this.value; // 10
};
a > b; // true
a < b; // false
a.valueOf = function () {
return 10; // 10
};
b.valueOf = function () {
return 30; // 30
};
a > b; // false
a < b; // true
上面代码说明当调用valueOf方法无法比较其大小时,会调用object的toString方法,再对其结果进行比较。
再看下面代码:
a.valueOf = function () {
return 10; // 10
};
b.valueOf = function () {
return 10; // 10
};
a == b; // false
a > b; // false
a < b; // false
上面代码说明object永远不等于object(object != object)。
总结:
-
object != object
两个对象永远不可能相等。
注:引用同一个对象的两个变量,是全相等的,即
var a = {};
var b = a;
a === b; // true
{} != {}; // true
-
object.valueOf()
当比较两个object大小时,会调用object的valueOf方法,如果结果能直接直接比较大小,则返回比较的结果。
-
object.toString()
当比较两个object大小时,会调用object的valueOf方法,如果结果不能直接直接比较大小,则会调用object的toString方法,并返回比较结果。