关系表达式用于测试两个值之间的关系,根据关系返回true或false。
比较相等不相等
-
===
恒等运算符或严格相等运算符,比较过程没有类型转换。 -
!==
不严格相等
是===
的求反 -
==
相等运算符
这个相等比较宽松,可以允许类型转换。 -
!=
不相等
是==
的结果求反
javascript对象的比较是引用的比较,不是值的比较。对象只和其本身相等。
对象向原始值的转换规则:日期类通过
toString()
转换,其他的先通过ofValue()
转换,如果没有ofValue()
,再通过toString()
转换。
===
比较规则:
1.类型不同则不等
2.其中一个是NaN
则不等,NaN
和自己都不等
3.两个是字符串,必须编码、长度和每个位上字符一样才相等
4.对象、数组和函数,必须指向相同的引用才相等
==
比较规则:
1.类型相同则按===
的2 3 4 条比较
2.类型不同比较,先按以下转换再通过上面的2 3 4 比较:
-
null == undefined
//相等 - 数字和字符串比较,将字符串转换为数字
- true转换为1,false转换为0
- 其中一个是对象,把对象转换为原始值。
true == '1' //结果为true, true会转换为数字1,'1'也会转换为数字1
比大小
-
<
小于 -
>
大于 -
<=
小于等于 -
>=
大于等于
只有数字和字符串才能比较大小,如果操作数不是这两种类型,会进行类型转换。
比大小的规则:
- 如果操作数有对象,则转换为原始值;
- 如果两个操作数都是字符串,将按照字母表顺序依次比较每位字符;
- 如果有一个操作数不是字符串,则两个都转换为数字;
- 有一个操作数是
NaN
,则结果为false; -
Infinity
比任何数字都大,-Inifity
比任何数字都小。
字符串比较使用String.localCompare()方法更加可靠。
加号和比较运算符都可以对字符串和数字比较,但加号优先转换为字符串,比较运算符优先转换为数字。
in运算符
判断对象是否有某个属性:
左侧操作数是字符串,如果不是会转换为字符串;
右侧操作数是对象。
var person = {name:'Mike',age:23}
'name' in person //true
instanceof运算符
判断一个对象(左操作数)是否是类(右操作数)的实例。
javascript中类是通过构造函数定义的,所以右操作数就是个函数。
var d = new Date()
d instanceof Date //true
d instanceof Object //true,所有的对象都是Object的实例
- instanceof判断也包括父类;
- 左操作数不是对象的话,返回false;
- 右操作数不是函数的话,抛出类型错误异常。