关系运算符用于测试两个值之间的关系,根据关系是否存在而返回true或者是false.关系表达式总是返回一个布尔值。
具有如下8个关系运算符:大于(>),小于(<),小于等于(<=),大于等于(>=),相等(==),不等(!=),恒等(===),不全等(!==)。从下面几个方面来分析:
一、相等和不相等运算符
“===”:恒等运算符,也称是严格相等运算符,只有在无需类型转换运算数就相等的情况下才为true.
<script>
console.log('2' === 2); //false 二者的类型不同
console.log(undefined === undefined); //true 二者的类型与值都相同
console.log(NaN === NaN); //false NaN和任何值都不相等包括NaN
console.log('abc' === 'acb'); //false 字符串的相等,要长度和相应位置一样才相等
console.log([] === []); //false 对象的相等必须是引用的相等才可以
console.log(10 === 0xa); //true 转换成十进制进行比较
</script>
"==":相等运算符和“===”恒等运算符相类似,但是它没有那么的严格,如果两个操作数不是同一类型,它会进行转换后再进行比较是否是相等。
当操作数类型一样时,比较的规则和恒等运算符一样,都相等才相等;
当操作数类型不一样时,会按如下规则来判定:
如果一个值是对象类型,另一个是原始类型,则对象类型会通过valueOf()方法进行转换,转换成原始值,如转换的不是原始值,则通过toString()方法转换再进行比较;
在对象转换为原始值后,如果两个操作数是字符串,则进行字符串的比较,如果里面有一个操作符不是字符串,那两个操作数通过Number()方法进行转换,转成数字进行比较.
<script>
console.log('abc' == 'abc'); //true 类型相等,值也相等,当然相等
console.log(NaN == NaN); //false NaN和任何者不等
console.log([] == []); //false
console.log(10 == 0xa); //true 转换成十进制进行比较是否相等
console.log(true == 0); //false true转换成数字为1
console.log(true == '1'); //true
console.log([1] == 1); //true
console.log(true == 1); //true
console.log(null == undefined); // true null和undefined是相等的
console.log(0 == null); // false 0和null不等
console.log('' == false); //true 空字符串转成0和false相等
</script>
"=": 可以看成是得到或者是赋值。作用是把等号右边的值赋予等号左边的变量或属性。
赋值操作符的结合性是从右到左,也就是说,如果一个表达式中出现了多个赋值运算符,运算顺序是从右到左。
“!==”:恒不等运算符,又称严格不等运算符。操作数的比较过程与恒等运算符相同,结果取反就可。
“!=”:不相等运算符。它的操作数比较的过程和与相等运算符相同,结果取反即可。
注意:undefined只与null相等,与其它任何值相比较都不相等。字符串相对比,比较的是字符对应的ASCII码。
<script>
console.log([] !== []); //true
console.log(1 !== true); //true
console.log('1' !== 1); //true
console.log(NaN !== NaN); //true
console.log('1' != true); //false
console.log(null != undefined);//false
console.log(NaN != ''); //true
console.log(undefined == null); //true
</script>
二、比较运算符
它用来检测两个操作数的大小关系。有大于(>),小于(<),小于等于(<=),大于等于(>=)。
1、大于运算符
大于运算符的操作数可能是任意类型,然而,只有数字和字符串才能真正执行比较操作,因此那些不是数字和字符串的操作数都将进行类型转换。规则如下:
如果操作数是对象,则这个对象将先使用valueOf()转换成原始值,如果结果还不是原始值,则再使用toString()方法转换;
在对象转换为原始值之后,如果两个操作数都是字符串,则按照字母表的顺序对两个字符串进行比较,这里提到的字母表顺序是指组成这个字符串的16位unicode字符的索引顺序;
在对象转换为原始值之后,如果至少有一个操作数不是字符串,则两个操作数都转换成数字进行比较。
需要注意的是Javascript字符串是一个由16位整数值组成的序列,字符串的比较也只是两个字符串中的字符的数值比较,由unicode定义的字符编码和任何特定语言或者本地语言字符集中的传统字符编码顺序不尽相同。字符串比较是区分大小写的,所以一般首先会将字符串通过String.toLowerCase()或者是String.toUpperCase()做大小写的转换。
2、大于等于运算符
大于等于运算符并不依赖于大于或等于运算符的比较规则,而是遵循小于运算符的比较规则,结果取反
3、小于等于运算符
小于等于运算符(<=)并不依赖于小于或等于运算符的比较规则,而是遵循大于运算符的比较规则,结果取反。
4、小于运算符
小于运算符(<)用于比较两个操作数,如果第一个操作数小于第二个操作数,则小于运算符的计算结果为true,否则为false。
三、in运算符
in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。如果右侧的对象有一个名为左操作数值的属性名,那么表达式返回true.
<script>
let point = {
x: 1,
y: 2
} //定义一个对象
console.log("x" in point); //true 对象里有一个名为”x"的属性
console.log("d" in point); //false对象里没有一个名为”d"的属性
</script>
四、instanceof运算符
instanceof运算符希望左操作是一个对象,右操作数标识对象的类。如果左侧的对象是右侧类的实例,则返回true,否则为false.
<script>
let d = new Date(); //通过Date()构造函数来创建一个新的对象
console.log(d instanceof Date); //true d是由Date()创建的
console.log(d instanceof Object);//true 所有的对象都是Object的实例
console.log(d instanceof Number);//false d不是一个Number对象
</script>