javascript运算符——关系运算符

×

目录

[1]恒等 [2]相等 [3]大于[4]小于

前面的话

  关系运算符用于测试两个值之间的关系,根据关系是否存在而返回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字符的索引顺序

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#.E5.85.B3.E7.B3.BB.E8.BF.90.E7.AE.97.E7.AC.A6
【2】 阮一峰Javascript标准参考教程——语法——比较运算符 http://javascript.ruanyifeng.com/grammar/operator.html#toc6
【3】 W3School-Javascript高级教程——ECMAScript关系运算符 http://www.w3school.com.cn/js/pro_js_operators_relational.asp
【4】《javascript权威指南(第6版)》第4章 表达式和运算符
【5】《javascript高级程序设计(第3版)》第3章 基本概念
【6】《javascript DOM编程艺术(第2版)》第2章 Javascript语法

时间: 2024-10-05 00:08:17

javascript运算符——关系运算符的相关文章

javascript中关系运算符的说明

决定javascript语法的部分叫做ECMAScript,JavaScript的语法相比较java来说宽松了很多,同时也复杂了很多.在ECMAscript中进行关系符运算时,经常会遇到各种类型转换,大部分的类型转换都是自发的,在应用不同的操作符进行转换时,数据类型的转换又会有所不同. javascript中的关系运算符包括'>','<','>=','<='. 当两个做比较的操作数都是数字的时候,直接进行比较(当然了,这是废话). 当两个操作数都是字符串的时候,比较字符串对应的字符

C语言基础学习运算符-关系运算符

比较大小 首先,我们得先了解一下布尔类型.C语言的C99标准支持布尔类型,关键字为_Bool,用于表示逻辑值true与false.C语言用值1表示true, 用值0表示false.因此布尔类型实际上是一种整数类型. 程序常常使用含有关系运算符的表达式进行分支和循环操作.我们将在分支和循环的章节中具体学习. C语言提供6种关系运算符,如下所示: 看个简单的实例吧: #include <stdio.h> int main(void) { int a = 5; int b = 3; /*根据变量a和

shell运算符之 关系运算符,算数运算符,布尔运算符,字符串运算符和文件测试运算符

shell运算符有很多,关系运算符,算数运算符,布尔运算符,字符串运算符和文件测试运算符 1,算术运算符 原声bash 不支持简单的算术运算,可以使用expr 工具 两点注意: 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样. 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边. #!/bin/basha=10b=20rst=`expr 2 + 2`echo '2+2 =' ${rst} rst=`exp

C语言:关系运算符

<    小于运算符 <=  小于等于运算符 >    大于运算符 >=  大于等于运算符 ==   等于运算符 !=   不等于运算符 关系运算符的运算结果只有2种:如果条件成立,结果就为1,也就是“真”:如果条件不成立,结果就为0,也就是“假”. 1.关系运算符中==.!=的优先级相等,<.<=.>.>=的优先级相等,且前者的优先级低于后者 例如2==3>1 :先算3>1,条件成立,结果为1.再计算2==1,条件不成立,结果为0.因此2==3

C#2 (数值类型及调用、引用类型及调用、装拆箱、常量、变量、数据类型转换、算术运算符、赋值运算符、关系运算符、逻辑运算符、字符串的常用方法)

一.数值类型及其调用原理 名称 说明 所占字节 范围 byte 字节型 1 -27~27-1 short 短整型 2 -215~215-1 int 整型 4 -231~231-1 long 长整型 8 -263~263-1 char 字符型 1 0~65535 float 单精度型 4 ±1.5*10-45~±3.4*1038 double 双精度型 8 ±5.0*10-324~±1.7*10308 bool 布尔型 1 只有true和false两个值 static void Main(stri

C语言基础第二课 -----布尔类型,关系运算符,逻辑运算符,

/* 布尔类型: 1.c89没有布尔类型,c99有布尔类型.c工程支持c89,oc工程c99. 2.两种数值: bool true(真)   false(假) C语言 BOOL YES(真)      NO(假)   OC语言 3.真和假的表示 C语言   非0即为真  0就是假 OC语言   YES定义为1  NO定义为0 4.输出转换符是%d 5.作用:用于分支结构和循环的判断. */ //    BOOL a1 = YES; //    BOOL a2 = NO; //    printf

5.Java算术运算符和关系运算符详解

运算符就是在用变量或常量进行运算时,经常需要用到的符号,目前常用的总共有十种:算术运算符.关系运算符.逻辑运算符.位运算符.移位运算符.赋值运算符.三元运算符.逗号运算符.字符串运算符.转型运算符.下面将会对每种运算符结合实例作详细的讲述. 一.算术运算符 算术运算符总共有 7 种:“+”.“ - ”.“*”.“/”.“%”(余数).“++”(自加).“——”(自减). 运算符的精度: 当使用运算符把两个操作数结合到一起时,首先会将两个操作数转化成相同类型的数据. 两个操作数中如有一个是 dou

十一、 BOOL类型、分支结构和关系运算符

BOOL类型:表示非真即假.只有两个值:YES和NO,而二进制只识别二进制数,所以,将YES替换为“1”,NO替换为“0” BOOL数据类型占一字节的空间内存 BOOL数据类型输出为:%lu:输入为:%s 关系运算符:“<,<=,>,>=,==,!=”判断两个值是否相等,一定要用“==”,结果值用BOOL存储. 优先级:[<,<=,>,>=(属同级运算符)] > [==,!=(属同级)] 运算符优先级:算术运算符>关系运算符>逻辑运算符&g

【Shell脚本学习10】Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等

Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符. 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用. expr 是一款表达式计算工具,使用它能完成表达式的求值操作. 例如,两个数相加: #!/bin/bash val=`expr 2 + 2` echo "Total value : $val" 运行脚本输出: Total value : 4 两点注意: 表达式和运算符之间要有空格,