关系运算符用于测试两个值之间中的关系(相等、小于或“是...的属性”),根据关系是否存在而返回true和false.关系表达式总是返回一个布尔值,通常在if while或者for语句中使用关系表达式,以控制程序的执行流程。
i相等和不等运算符
“==”和"==="运算符用于比较两个值是否相等,两个运算符允许任意类型的操作符。如果相等则返回true,否则返回false.“===”也称为严格相等运算符(有时称为恒等运算符),它用于检测两个操作数是否严格相等。“==”运算符称作相等运算符,它用来检测两个操作数是否相等,这里的相等定义宽松,可以允许进行类型转换。
javascript支持“=”,“==”,“===”运算符,你应当理解(赋值,相等,恒等)运算符之间的区别。并在编程中小心使用。为了减少混淆,应该把“=”称作“得到或赋值”,把“==”称作“相等”,把“===”称作“严格相等”。
“!=”和“!==”运算符规则是“==”,“===”运算符的求反,“!”是布尔非运算符,我们将“!=”,“!==”称为不相等,不严格相等
javascript对象的比较是引用的比较,而不是值的比较。对象和本身是相等的,但和人和对象都不相等。如果两个对象具有相同数量的属性,相同的属性名和值,它们依然是不相等的。相应位置的数组元素是相等的两个数组也是不相等的。
严格相等运算符"==="首先计算操作数的值,然后比较这两个值,比较过程没有任何类型转换。
如果两个值类型不想同,则它们不相等
如果两个值都是null或者undefined,则它们不相等
如果两个值都是布尔值true或者false, 则它们相等
如果其中一个值是NaN,或者两个值都是NaN ,则它们不相等,NaN和其它值都是不相等的,包括它本身。
如果两个值为数字且相等,则它们相等。如果一个值为0,令一个值为-0,则它们同样相等。
如果两个值为字符串,并且所含对应位上的16位数(参照3章2节)完全相等,则它们相等。如果他们的长度或内容不同,则不相等。两个字符串可能函数完全一样并且所显示出的字符也一样,但具有不用编码的16位值,javascript并不对Unicode进行标准转换,因此这样的字符串通过"==="和"=="运算符的比较结果也不相等。第三部分的String.localeCompare()提供了另外一种比较字符串的方法。
如果两个引用值指向同一个对象,数组或函数,则它们是相等的。如果指向不同的对象,则它们是不等的,尽管两个对象有完全相同的属性。
相等运算符"=="和恒等运算符相似,但相等运算符比较并不严格。如果两个数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较。
如果两个操作类型相同,则和上文相等运算符的比较规则一样。如果严格相等,那么比较结果相等。如果他们不严格相等,则比较结果不相等。
如果两个操作类型不同,“==”相等操作符也会认为它们相等。检测相等会遵循如下的规则和类型转换:
如果一个类型是null,令一个是undefined,则它们相等
如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。
如果一个值是true,则将其转换为1再进行比较,如果一个值是false,则转换为0比较。
如果一个值是对象,另一个值是数字或字符串,则使用3章8节3小节的方法的转换规则将对象转换为原始值,然后进行比较。对象通过toString()方法或者valueOf()方法转换为原始值。javascript语言核心的内置类首先尝试使用valueOf()再尝试使用toString(),除了日期类,日期类只能通过toString()转换。那些不是javascript 语言核心中的对象则通过实现中定义的方法转换为原始值。
其它不同类型之间的比较均不相等
这里有一个判断相等的小例子
"1" == true
这个表达式的结果为true,这表明完全不同类型的值比较结果为相等。布尔值true首先转换为数字1 ,然后再执行比较。接下来字符串“1”也会转换为数字1 ,因为两个数字的值相等,因此结果为true.
ii.比较运算符
小于(<)
如果第一个操作数小于第二个操作数,则“<”运算结果我true,否则为false
小于等于(<=)
大于(>)
大于等于(>=)
....(不详细介绍含义)
比较操作符的操作数可能是任意类型。然而只有数字和字符串才能真正执行比较操作符,因此,那些不是数字和字符串的操作数都将进行类型转换。类型转换规则如下:
如果操作数为对象,则按照3章8节3小节处锁描述的转换规则转换为原始值:如果valueOf()返回一个原始值,那么直接使用这个原始值。否则使用toString() 的转换结果进行比较。
在对转换为原始值之后,如果两个操作数都是字符串,那么将依字母表的顺序对两个字符串进行比较,这里提到的“字母表顺序”是组成这两个字符串的16位Unicode字符的索引顺序。
在对象转换为原始值之后,如果至少一个操作数不去是字符串,那么两个操作数都将为数字进行数值的比较。0和-0是相等的。Infinty壁其它任何数字都大(除了infinty本身),-infinty比任何数字都小(除了它自己本身。)如果一个操作数(或转换后)为NaN,那么比较符总是返回false
对于数字和字符串操作符来说,加号运算符和比较运算符的行为有所不同 ,前者更偏爱字符串,如果它的其中一个操作数是字符串的话,则进行字符串连接操作。而比较运算符则更偏爱数字,只有在两个操作数都是字符串串的时候。才会进行字符串的比较。
1 + 2 //=>3 加法,结果为3
"1" + "2" //字符串连接,结果为"12"
"1" + 2 //字符串连接,2转换为"2",结果"12"
11 < 3 //数字比较,结果true
"11" < "3" //字符串比较,结果为true
"11" < 3 //数字的比较,“11”转换为11,结果为true
"one" < 3 //数字比较,"one"转换为NaN,结果为falase
最后需要注意的是,“<=”和“>=”运算符在判断相等的时候,并不依赖相等运算符和和严格相等运算比较规则。相反,小于等于运算符芝是简单的“不大于”,大于等于运算只是“不小于”。只有一个例外,的那个一个操作数(后转换后)是NaN的时候,所有4个比较运算符均会返回fasle.
iii.in运算符
in运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右侧是一个对象。如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true.例如
var point = { x: 1, y: 1 } //定义一个对象 "x" in point //=>true 对象有一个名为x的属性 "z" in point //=>false 对象无名为z的属性 "toString" in point // =>true 对象继承了toString方法 var data = [7, 8, 8] "0" in data //=>true 数组包含0 1 in data //=>true 数字转换为字符串 3 in data //=>fase 没有索引为3的元素
iiii.instanceof运算符
instanceof运算符希望左操作符为一个对象,右操作数标示对象的类。如果左侧的对象是右侧类的实例,则表达式返回true;负责返回false.第9章将会讲到。javascript对象的类是通过初始化他们的构造函数的来定义的。这样的话,instanceof的右操作数应当是一个函数。比如:
var d = new Date(); //构造一个新对象 d instanceof Date; //计算结果为true, d是Date() 创建的 d instanceof Object //计算结果为true ,所有的对象都是Object的实例 d instanceof Number //计算结果为 false,d不是一个Number对象 var a = [1,2,3] //数组直接量创建数组 a instanceof Array //计算结果true a为数组 a instanceof Object //true 所有的数组都是对象 a instanceof RegExp //fasle 数组不是正则表达式
需要注意的是,所有对象都是Object的实例。当通过instanceof盘对一个对象是否为一个类的实例的时候,这个判断也叫“父类”(superclass)的检测,如果instanceof的左侧操作对象不是对象的话,instanceof返回false。如果右侧操作不是函数,则抛出类型错误的异常。
为了理解instanceof运算符是如何工作的,必须首先理解“原型类”(prototype chain),原型链作为javascript的继承机制,将在6章2节2小节详细描述。
为了计算表达式o instanceof f ,javascript笔仙首先计算f.prototyoe,然后在原型链中查询o,如果找到,那么o是f(或者f的父类)的一个实例,那么返回true。反之false
以上是javascript基础课程之关系表达式定义用法详解的详细内容。更多信息请关注PHP中文网其他相关文章!