javascript运算符——关系运算符

面前的话

  关系运算符用于测试多少个值期间的涉嫌,遵照关系是否存在而回到true或false,关系表达式总是回到一个布尔值,通常在if、while或for语句中应用关系表明式,用以控制程序的履行流程

  javascript提供了===、!==、==、!=、<、<=、>、>=8个事关运算符,本文将分成4类介绍关系运算符

 

恒等运算符

  恒等运算符’===’,也叫严俊相等运算符,首先总结其操作数的值,然后相比这多少个值,相比过程没有此外类型转换,相比过程如下:

  【1】要是三个值的档次不均等,则赶回false

console.log(1 === '1');//false
console.log(1 === [1]);//false

  【2】倘若六个值都是Undefined、Null、Boolean、Number、String相同原始类型的值,值相同,就再次来到true,否则,再次回到false

console.log(undefined === undefined);//true
console.log(null === null);//true

console.log(true === true);//true
console.log(false === false);//true

console.log(1 === 1);//true
console.log(2.5 === 2.5);//true

  [注意]不论什么进制的数字,在展开关联相比时,最后都转移为十进制举办演算

console.log(10 === 0xa);//true

  在数字Number类型中,有一个值相比较新鲜,是NaN(not a
number),它与此外值都不对等;其它,数字Number类型中存在着+0和-0,即使其标志不同,但值万分

console.log(NaN === NaN);//false
console.log(+0 === -0);//true

  六个相同字符串值表现为:相同的尺寸和相同的字符对应相同的地方

console.log('abc' === 'abc');//true
console.log('abc' === 'acb');//false

  【3】假若七个值引用同一个目的,则赶回true,否则,重临false

  [注意]更详实的讲演是,javascript对象的相比较是引用的可比,而不是值的可比。对象和其自我是相等的,但和其余任何对象都不等于。要是两个不同的对象拥有同样数量的性质,相同的属性名和值,它们如故是不等于的

console.log([] === []);//false
console.log({} === {});//false    
console.log(function(){} === function(){});//false

var a = {};
b = a;
console.log(a === b);//true

【恒不等运算符】

  恒不等运算符(!==)又叫严俊不对等运算符,操作数的可比过程与恒等运算符相同,结果取反。假若’===’的相比较结实是true,则’!==’的相比较结实是false;假如’===’的可比结实是false,则’!==’的可比结实是true

console.log(1 !== '1');//true
console.log(1 !== 1);//false
console.log(true !== false);//true
console.log({} !== {});//true

 

等于运算符

  相等运算符’==’和恒等运算符相似,但非凡运算符的可比并不严俊,假如六个操作数不是如出一辙品种,相等运算符会尝试举行一些类型转换,然后再举办相比较

  当两个操作数类型相同时,相比规则和恒等运算符规则如出一辙

console.log(undefined == undefined);//true
console.log(10 == 0xa);//true
console.log(NaN == NaN);//false
console.log([] == []);//false

  当五个操作数类型不同时,相等运算符’==’会遵循如下规则:

  【1】假若一个值是目标类型,另一值是原始类型,则对象类型会先使用valueOf()转换成原始值,假设结果还不是原始值,则再采纳toString()方法转换,再举办相比

  [注意]日期类只允许使用toString()方法转换为字符串。类似地,时间Date对象开展加法运算时行使toString()转换为字符串,而在任何数学运算,包括减法、乘法、除法、求余等运算中,都是使用Number()转换函数将时刻Date对象使用valueOf()转换为数字

  【2】在对象转换为原始值之后,假若六个操作数都是字符串,则展开字符串的比较

console.log(new Date() == 'Sat Jun 25 2016 11:07:20 GMT+0800 (中国标准时间)');//true

  【3】在对象转换为原始值之后,即使至少有一个操作数不是字符串,则五个操作数都将透过Number()转型函数转换成数字举行数值相比

console.log(true == 1);//true
console.log(true == 0);//false
console.log(false == '1');//false
console.log(false == '0');//true
console.log(true == 'true');//false,相当于1 == NaN

console.log([1] == 1);//true,相当于1 == 1
console.log([1] == '1');//true,相当于'1' == '1'
console.log([] == 0);//true,相当于0 == 0
console.log([] == '0');//false,相当于'' == '0'

console.log([] == true);//false,相当于0 == 1
console.log([1] == true);//true,相当于1 == 1

var a = {
    valueOf:function(){
        return 1;
    },
    toString:function(){
        return '2';
    }
} 
console.log( a == '1');//true,相当于1 == 1

var a = {
    valueOf:function(){
        return {};
    },
    toString:function(){
        return '1';
    }
} 
console.log( a == 1);//true,相当于1 == 1

  [注意]如果一个值是null,另一个值是undefined,则赶回true。即使Number(null)是0,但null和0并不等于

console.log(null == undefined);//true
console.log(null == 0);//false

  [注意]空字符串或空格字符串会转成0

console.log(null == []);//false
console.log(null == '');//false
console.log([] == ' ');//false,相当于'' == ' '
console.log([] == '');//true,相当于'' == ''
console.log(0 == '');//true

 【不对等运算符】

  不等于运算符(!=)的操作数相比较过程与相等运算符相同,结果取反。假使’==’的相比较结实是true,则’!=’的相比结实是false;假使’==’的可比结实是false,则’!=’的可比结实是true

console.log(1 != '1');//false,相当于1 != 1
console.log(true != '1');//false,相当于1 != 1
console.log('true' != 1);//true,相当于NaN != 1
console.log([1] != '1');//false,相当于'1' != '1'
console.log([1] != true);//false,相当于1 != 1

 

超越运算符

  大于运算符(>)用于对比多个操作数,假若第一个操作数大于第二个操作数,则超越运算符的乘除结果为true,否则为false

  大于运算符的操作数可能是擅自档次,然则,惟有数字和字符串才能当真履行相比操作,由此这一个不是数字和字符串的操作数都将拓展类型转换,类型转换规则如下:

  【1】假设操作数是目标,则那多少个目的将先采纳valueOf()转换成原始值,倘使结果还不是原始值,则再利用toString()方法转换

  [注意]实际,在原生对象中,使用valueOf()方法转换为原始值的,唯有转换为数字Number类型的年华Date对象,其他对象都通过toString()方法转换为字符串

  【2】在目的转换为原始值之后,要是六个操作数都是字符串,则依据字母表的相继对六个字符串举行相比,这里涉及的字母表顺序是指组成这个字符串的16位unicode字符的目录顺序

图片 1

console.log('b' > 'a');//true
console.log('B' > 'a');//false

console.log({} > '[a]');//true,相当于'[object Object]' > '[a]'
console.log({} > '[p]');//false,相当于'[object Object]' > '[p]'

console.log(['a'] > ['b']);//false,相当于'a' > 'b'
console.log([2] > [11]);//true,相当于'2' > '11'

  [注意]在字母表中大写字母在小写字母的前方,所以大写字母 <
小写字母;但字符串String对象有一个字符串相比的措施localeCompare()方法会设想自然语言的排序情形,把’B’排在’a’的后边,即便字符串在字母表中排在其参数之前时,则该措施重回一个负数;字符串在字母表中排在其参数之后时,再次来到一个正数

console.log('B'.localeCompare('a'));//1
console.log('B' > 'a');//false
console.log('b'.localeCompare('a'));//1
console.log('b' > 'a');//true

  【3】在对象转换为原始值之后,假使至少有一个操作数不是字符串,则四个操作数都转换成数字进行比较

  [注意]在相当操作符中,时间Date()对象只允许通过toString()方法转换为字符串,而不容许通过valueOf()方法转换为数字;而在高于操作符中,时间Date()对象允许先行使用valueOf()方法转换为数字 

console.log(new Date() > 100);//true,相当于1466826928667 > 100
console.log(true > [0]);//true,相当于 1 > 0

console.log(2 > 1);//true
console.log(11 > '2');//true,相当于11 > 2

console.log(NaN > 1);//false
console.log(1 > NaN);//false
console.log({} > true);//false,相当于 NaN > 1

  [注意]null ==
0的结果为false,这是因为javascript将null ==
undefined的结果设为true。在过量运算中,null和undefined举行Number()转型函数转换分别转换为0和NaN

console.log(undefined > -1);//false,相当于NaN > -1
console.log(null > -1);//true,相当于0 > -1
console.log(undefined > 0);//false,相当于NaN > 0
console.log(null > 0);//false,相当于0 > 0    

  对于数字和字符串来说,加号运算符和相比较运算符的行事有所不同,加号运算符更偏爱字符串,尽管它的一个操作数是字符串,就举行字符串连接。而正如运算符则更偏爱数字,只有在多少个操作数都是字符串时,才举办字符串的可比

console.log(1 + 2);//3
console.log('1' + '2');//'12'
console.log('1' + 2);//'12',相当于 '1' + '2'

console.log(2 > 1);//true
console.log('2' > '1');//true
console.log('2' > 1);//true,相当于 2 > 1

【小于等于运算符】

  小于等于运算符(<=)并不看重于小于或等于运算符的相比较规则,而是遵从大于运算符的可比规则,结果取反。即使’>’的相比较结实是true,则'<=’的可比结实是false;假设’>’的相比较结实是false,则'<=’的可比结实是true

console.log(1 <= '0');//false,相当于1 <= 0
console.log(true <= '0');//false,相当于1 <= 0
console.log('true' <= 0);//false,相当于NaN <= 0
console.log([1] <= '0');//false,相当于'1' <= '0'
console.log([0] <= true);//true,相当于0 <= 1
console.log(1 <= 1);//true

 

低于运算符

  小于运算符(<)用于相比多少个操作数,假设第一个操作数小于第二个操作数,则小于运算符的盘算结果为true,否则为false

  小于运算符与过量运算符的类型转换规则类似,就不再赘述

【大于等于运算符】

  同样地,大于等于运算符(>=)并不借助于于过量或等于运算符的相比较规则,而是按照小于运算符的可比规则,结果取反。尽管'<‘的相比较结实是true,则’>=’的结果是false;假设'<‘的可比结实是false,则’>=’的结果是true

 

参考资料

【1】 ES5/关系运算符
https://www.w3.org/html/ig/zh/wiki/ES5/expressions
【2】 阮一峰Javascript标准参照教程——语法——相比较运算符
http://javascript.ruanyifeng.com
【3】 W3School-Javascript高级教程——ECMAScript关系运算符
http://www.w3school.com.cn
【4】《javascript权威指南(第6版)》第4章 表达式和运算符
【5】《javascript高级程序设计(第3版)》第3章 基本概念
【6】《javascript DOM编程艺术(第2版)》第2章 Javascript语法