发表于 & 归档在 JavaScript, Web.

JavaScript中存在两种等价操作符:相等”==”和全等”===”,前者对不同类型(比如String与Object)也可作等价判断,后者则必须要求类型相同,此外JavaScript中的任何对象都可以判断是非,也就是转换成boolean基本类型,这些都是ECMAScript语言(包括JavaScript)的基础

JavaScript中的四种基本类型

number, string, boolean, object

等价判断首先会判断对象类型,对于全等操作符,类型不一时,直接返回false,而对于相等”==”操作符则会按特定的规则,转换成number, string, boolean这三种基本类型,而后做判断

相同类型间比较

全等操作符(strict equality operator) “===”

  1. 如果类型不一致,返回false
  2. number,如果相同值,返回true,NaN不等于任何值,包括他自己,NaN可通过全局方法,isNaN(…)判断
  3. string,相同字符序列的返回true,有一种情况,相同的字符串使用Unicode标准可能有不同的编码方式,但遗憾的是,javascript只通过基本的字符比较,所有的字符串在比较之前,会先转换成“正常格式”。参考”String.localeCompare()”提供另一种比较字符串的方式
  4. boolean,同为true或false,返回true
  5. 相同引用表示是同一个对象
  6. 如果两者都是null或者undefined,表示他们相同

这里需要注意一点,NaN是个怪物,它不等于任何对象,甚至不等于自己:

[javascript]NaN !== 0;
NaN !== NaN;
NaN != 0;
NaN != NaN;[/javascript]

相等操作符(Equality operator)”==”

相同类型之间的比较,有的人说等同于”===”,准确的说要除去null 和 undefined外,因为null == undefined ,但 null !== undefined ,余下的按全等的规则

[javascript]null == undefined[/javascript]

不同类型间比较

相等操作符(Equality operator)”==”

javascript有四种类型对象,number, string, boolean, object,除去相同类型的比较外,不同类型之间会先通过类型转换,然后对二者比较,按排列组合存在六种情况:

  1. number , string >>> string转换成number,然后比较
  2. number , boolean >>> boolean转换成number,然后比较
  3. number , object >>> object.valueOf()转换成number,然后比较
  4. string , object >>> object.toString()转换成string,然后比较
  5. object , boolean >>> boolean转换成number,object转换成number,然后比较
  6. string, boolean >>> string转换成number, boolean转换成number,然后比较

补充:object转换成number:先object.valueOf()或者object.toString(),没有上面的方法的话找基类的相关方法(这里涉及到ToPrimitive()转换,这里不多介绍),得到的结果再转换成numberboolean转换成number:true是1,false是0

示例:

[javascript]var a = "yCoder.com";
var b = {valueOf: function(){return 1}, toString: function(){return "yCoder.com"}};
a == b;//结果为true
b == 1;//结果为true[/javascript]

关于对象是非的判断 – ToBoolean(…)

JavaScript中可以直接判断对象true和false,比如下面的代码:

[javascript]
if(a){ }
if(!a){ }[/javascript]

实际上这里就是将对象强制转换成了boolean基本类型,是执行的ToBoolean(o)操作,规则如下:

  • Boolean : 不变
  • Undefined/Null : false
  • Number : +0, -0, NaN –> false 其他为 true
  • String : ” –> false 其他为 true
  • Object : true

以一个题目结尾

曾看到过一道有名的javascript题目,其中有一处判断语句如下:

[javascript]var a = [];
if(a == !a){
alert("a == !a");
}[/javascript]

问a==!a是否为真,这里就涉及到前面提到的关于object >> boolean,以及object与boolean类型间等价判断的问题,留给大家思考

发表评论

电子邮件地址不会被公开。 必填项已用*标注


七 × = 14

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>