JavaScript object对象大小比较研究

JavaScript的基本类型进行大小比较时,能直接比较大小的,除了<number>、<string>、<boolean>外,还有有如下几个:

  1. null === null
  2. undefined === undefined
  3. NaN != NaN
  4. 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)。

总结:

  1. object != object

两个对象永远不可能相等。
注:引用同一个对象的两个变量,是全相等的,即
var a = {};
var b = a;
a === b; // true
{} != {}; // true

  1. object.valueOf()

当比较两个object大小时,会调用object的valueOf方法,如果结果能直接直接比较大小,则返回比较的结果。

  1. object.toString()

当比较两个object大小时,会调用object的valueOf方法,如果结果不能直接直接比较大小,则会调用object的toString方法,并返回比较结果。

推荐阅读更多精彩内容