JavaScript学习(4.6):关系表达式

4.9 关系表达式
关系运算符用于测试两个值之间的关系,根据关系是否存在返回true和false

4.9.1 相等和不等运算符
"="  -- "得到或者赋值"
"=="  -- “相等”,检测两个数是否相等,“相等定义非常宽松,可以允许进行类型转换”  求反  != 
"===" - -- “恒等”,检测两个操作数是否严格相等    求反 !==

JavaScript对象的比较是引用过的比较,不是值的比较。
"===" 首先计算其操作数的值,然后比较这两个值,比较过程没有类型的转换
  • 如果两个值类型不同,则它们不相等。
  • 如果两个值都是null或者undefined,则不相等。
  • 如果都是布尔值的true或者false,相等。
  • 一个值是NaN或者两个值都是NaN,不相等;NaN和其他任何值都不相等,包括本身,通过 x!==x来判断x是否为NaN,只有在x为NaN的时候,这个表达式才为true.
  • 如果两个值是数字且数值相等,则相等,0  -0同样相等。
  • 如果两个值是字符串,且所含的对应为上的16位数完全相等,则相等。
  • 如果两个两个引用值指向同一个对象、数组或函数,则相等。如果指向不同对象,即使属性完全一样,也不相等。

“==”比较并不严格,如果操作数不是同一类型,那么相等运算符会尝试进行一些类型转换:
  • 如果类型相同,则和“===”的比较规则一样;如果严格相等,则相等,否则不等。
  • 如果类型不同,“==”也可能认为它们相等,检测相等遵循以下规则和类型转换:
    • null 和 undefined相等。
    • 如果一个是数字,一个是字符串,则先将字符串转换成数字,然后比较。
    • 如果是true,true-1,false-0,然后进行比较。
    • 如果一个是对象,另一个是字符串或者数字,将对象转换为原始值进行比较。JavaScript语言核心的内置类首先尝试使用valueOf,然后toString,日期类只使用toString
    • 其他类型比较均不相等。



4.9.2 比较运算符
    比较运算符用来检测两个操作数的大小关系(数值大小或者字母表的顺序)
    比较操作符的操作数可以是任意类型,但是只有数字和字符串才能真正执行比较操作,那些不是字符串和数字的操作数都将进行类型转换,规则如下:
  • 如果是对象,按照对象转换规则转换成原始值:如果valueOf返回一个原始值,那么直接使用这个原始值;,否则,使用toString进行转换。
  • 转换为原始值之后,如果都是字符串,那么按照字母表顺序进行比较-字母表顺序:组成这个字符串的16位Unicode字符的索引顺序。
  • 对象转换为原始值之后,如果至少一个操作数不是字符串,那么两个操作数都将转换成数字进行比较。0 == -0,Infibity比任何数字都大(除了本身),-Infinity比任何数字都小(除了本身),如果其中一个操作数是NaN或者转换后是NaN,那么比较操作符总是返回false。
*JavaScript字符串是一个由16位整数值组成的序列,字符串的比较也只是两个字符串中的字符的数值比较。字符串比较是区分大小写的,所有的大写的ASCII字母都“小于”小写的ASCII字母。
    参照String.localCompare()方法获取更多字符串比较信息,String.localCompare方法更加健壮可靠,这个方法参照本地语言的字母表定义的字符顺序。对那些不区分字母大小写的来说,则需要首先将字符串全部转换为小写字母或者大写字母,String.toLowerCase().String.toUpperCase.

*对于数字和字符串来说,+ 和 比较运算符不同,+ 偏爱字符串,只要有一个操作数是字符串,进行字符串的连接;比较运算符偏爱数字,只有在两个操作数都是字符串的时候,才会进行字符串的比较。

* “<=” 和 “>=”运算符在判断相等的时候,并不依赖于相等运算符和严格相等运算符的比较法规则,只是简单的“不大于”和“不小于”。只有一个例外,当其中一个操作数(或者转换之后)是NaN的时候,所有四个比较运算符均返回false。
4.9.3 in运算符
    in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。如果右侧的对象拥有一个名为左操作数的属性名,那么表达式返回true.

var point ={x:1,y:2};

"x" in point  //true:对象有一个x的属性
"z" in point  //false:对象没用此属性
"toString" in point // true:对象继承该方法
"valueOf" in point  //true:对象继承该方法

var data = [7,8,9];
"0" in data  //true:包含索引"0"
1 in data    //true:转换为字符串,包含该索引数字
7 in data  //false:不包含该索引

*注意:对象是属性名  ,数组是索引名
4.9.4  instanceof运算符
    instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧的对象是右侧类的实例,则表达式返回true,否则返回false。

var d = new Date();
d instanceof Date; //true:d是Date的实例
d instanceof Object; //true:所有对象都是Object实例
d instanceof Number; //false

    所有对象都是Object的实例。当通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对父类的检测。如果instanceof的左操作数不是对象的话,返回false;右操作数不是函数,抛出一个类型错误异常。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值