javascript 对象比较实现代码

  javascript对象比较

  比较符:==,!=,===,!==,>=,<=,>,<

  ==总是试图比较他们的直,如果类型不一样,总是试图作转化。

  ===比较同一性,不作转化就比较

  == 如果是基本类型(string, number, boolean),比较他们的值,

  var a = "123";

  var b = 123;

  则(a==b) = true;

  (a===b) = false;

  如果是object, array, function类型,比较他们的reference.只有当他们的reference相等才为true.

  function Point(x,y){

  this.x = x;

  this.y = y;

  };

  Point.prototype.toString = function(){

  alert("in toString");

  return "x=" + this.x + " y=" + this.y;

  };

  Point.prototype.valueOf = function(){

  alert("in valueOf");

  return this.x+this.y;

  };

  var pa = new Point(1,1);

  var pb = new Point(1,1);

  var pc = pa;

  则:pa!=pb;

  pa!==pb;

  pa==pc;

  pa===pc;

  var arr1 = [1,2,3];

  var arr2 = [1,2,3];

  arr1!=arr2, arr1!==arr2

  

  不得不说一下0, false, null, undefined

  var t1 = 0;

  var t2 = false;

  var t3 = null;

  var t4;

  则:t1==t2;t1!==t2;

  t1!=t3; t1!==t3;

  t1!=t4; t1!==t4;

  t2!=t3; t2!==t3;

  t2!=t4; t2!==t4;

  t3==t4; t3!==t4;

  如果一个object和一个基本类型比较,则先调用对象的valueOf,再调用对象的toString与基本类型进行比较

  如果是与boolean比较,先把true转为1,false转为0再比较。

  var pa = new Point(1,1);

  alert(pa==2);会输出"in valueOf",再输出"true";

  如果屏蔽掉Point.prototype.valueOf则输出"in toString",再输出"false";

  var pa = new Point(1,0);

  则pa==true;

  关系操作符>=,<=,>,<

  如果两边都是数字,或者可以转化为数字,则比较数字。

  如果两边都是string,或者可以转化为string,则比较string。

  如果一边可转为string,一边可转为number,则再试图把string转为number再比较,如果string不能转为number, 则为NaN,返回false.

  如果有object参与比较,则总是试图转object为number或string再比较。

  下面有一个有趣的例子:

  function Point(x,y){

  this.x = x;

  this.y = y;

  };

  Point.prototype.toString = function(){

  alert("in toString");

  return "x=" + this.x + " y=" + this.y;

  };

  Point.prototype.valueOf = function(){

  alert("in valueOf");

  return this.x+this.y;

  };

  var pa = new Point(1,1);

  var pb = new Point(1,1);

  (pa==pb)==false;

  (pa>pb)==false;

  (pa<pb)==false;

  但是:

  (pa>=pb) == true;

  (pa<=pb) == true;