Js 作为弱类型语言,对变量类型并不“感冒”,所以要比较两个变量是否相同要怎么操作呢?
1. 比较两个字符串是否相等
var str1 = "aaa";
var str2 = "aaa";
if(str1 == str2)alert("ok");
如果两个变量属于不同类型呢?毕竟 js 还是有 bool,string,number 基本类的
Alert(1==’1’) ,打出的结果是 true ,这说明这些基本类型在底层都是以相同的格式存储的
2. Js 里面的对象比较
js 中的对象比较和 java 中是一样的,只有地址相同才相等。当比较两个引用值时,比较的是两个引用地址,看它们引用的原值是否为同一个副本,而不是比较它们的原值字节是否相等。只有 string 、 number 、 boolean 三种基本类型才是可以直接对值进行比较。
下面是从网上找的一段很好的例子
感谢作者: http://www.jb51.net/article/17912.htm
比较符 :==,!=,===,!==,>=,<=,>,<
== 总是试图比较他们的值,如果类型不一样,总是试图作转化。
=== 比较同一性,不作转化就比较
== 如果是基本类型 (string, number, boolean) ,比较他们的值,
1. 基本类型比较
var a = "123";
var b = 123;
则 (a==b) = true;
(a===b) = false;
2. 对象比较
如果是 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;
3. 比较对象的转换顺序
如果一个 object 和一个基本类型比较 , 则先调用对象的 valueOf, 再调用对象的 toString 与基本类型进行比较。也就是说先转成 number 型,再转成 string 类型
如果是与 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;