欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

javascript基础课程之关系表达式定义用法详解

程序员文章站 2022-04-27 16:58:47
...
关系运算符用于测试两个值之间中的关系(相等、小于或“是...的属性”),根据关系是否存在而返回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基础课程之关系表达式定义用法详解的详细内容,更多请关注其它相关文章!