JS基本概念(3)

【5】操作符

(1)一元操作符:只能操作一个值的操作符

  • 递增、递减操作符

    ++a    --a    前置
    a++    a--    后置
(这四个操作符对任何值都适用,不能转换成数字的转换为NaN)

  • 一元加、一元减操作符(表示正、负)

(2)位操作符:按内存中表示数值的位来操作数值

  • ECMAScript中所有数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值,而是先将64位转化为32位的整数,然后执行操作,最后再将结果转化为64位。
  • 对于有符号的整数,32位中的前31位用于表示整数的值。第32位用于表示数值的符号(符号位):0表示正数,1表示负数。
  • 符号位的值决定了其他位数值的格式:

    正数:以纯二进制存储
    负数:二进制补码
      步骤:1》求这个数值绝对值的二进制码;
         2》求二进制的反码,即将0替换为1,将1替换为0;
         3》得到的二进制反码加1。

//-18求补码 
//18的二进制码          0000 0000 0000 0000 0000 0000 0001 0010
//求反码                1111 1111 1111 1111 1111 1111 1110 1101
//反码加1                                                     1
//————————————————————————————————————————————————————————————————————————————
//得                   1111 1111 1111 1111 1111 1111 1110 1110
  • 在对特殊的NaN和Infinity值应用位操作时,这两个值都会被当成0来处理。
  • 对非数值应用位操作符,会先使用Number()函数进行转换。

  1》按位非(~):执行按位非的结果就是返回数值的反码
  2》按位与(&):按位与操作只在两数值的对应位都是1才返回1,任何一位是0,结果都是0
  3》按位或(|):按位或操作只在两数值的对应位都是0才返回0,任何一位是1,结果都是1
  4》按位异或(^):按位异或操作在两数值的对应位都是1或0返回0,只有一位是1,才返回1
  5》左移(<<)::左移操作符会将数值的所有位向左移动指定的位数,向左移位后,原数值的右侧多出来的空位会以0来填充;左移不会影响操作数的符号位
  6》有符号的右移(>>):会将数值向右移动,但保留符号位,向右移位后,原数值的左侧多出来的空位会以符号位的值来填充   7》无符号的右移(>>>):对正数,有符号右移和无符号右移结果相同,对于负数,无符号右移以0来填充空位,并且会把负数的二进制码当成正数的二进制码

(3)布尔操作符

1》逻辑非(!)

  • !对象 //false
  • !空字符串 //true
  • !非空字符串 //false
  • !数值0 //true
  • !任意非0数值(包括Infinity) //false
  • !null //true
  • !NaN //true
  • !undefined //true

使用两个逻辑非操作符模拟Boolean()转型函数的行为。
2》逻辑与(&&)
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值:

  • 如果第一个操作数是对象,则返回第二个操作数;
  • 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
  • 如果两个操作数都是对象,则返回第二个操作数;
  • 如果有一个操作数是null,则返回null;
  • 如果有一个操作数是NaN,则返回NaN;
  • 如果有一个操作数是undefined,则返回undefined;

逻辑与操作是短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值(第一个操作数是false)。
3》逻辑或(||)
逻辑或操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑或操作就不一定返回布尔值:

  • 如果第一个操作数是对象,则返回第一个操作数;
  • 如果第一个操作数的求值结果为false,则返回第二个对象;
  • 如果两个操作数都是对象,则返回第一个操作数;
  • 如果两个操作数都是null,则返回null;
  • 如果两个操作数都是NaN,则返回NaN;
  • 如果两个操作数都是undefined,则返回undefined;

逻辑或操作也是短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值(第一个操作数是true)。

(4)乘性操作符

1》乘法(*)

  • 如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超出了ECMAScript数值的表示范围,则返回Infinity或-Infinity;
  • 如果有一个操作数是NaN,则结果是NaN;
  • 如果是Infinity与0相乘,则结果是NaN;
  • 如果是Infinity与非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
  • 如果是Infinity与Infinity相乘,则结果是Infinity;
  • 如果有一个数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。

2》除法(/)

  • 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果商超出了ECMAScript数值的表示范围,则返回Infinity或-Infinity;
  • 如果有一个操作数是NaN,则结果是NaN;
  • 如果是0被0除,则结果是NaN;
  • 如果是非0的有限数被0除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
  • 如果是Infinity被Infinity除,则结果是NaN;
  • 如果是Infinity被任何非0数值除,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
  • 如果有一个数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。

3》求模、余数(%)

  • 如果操作数都是数值,执行常规的除法计算,返回除得的余数;
  • 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN;
  • 如果被除数是有限大的数值而除数是0,则结果是NaN;
  • 如果是Infinity被Infinity除,则结果是NaN;
  • 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
  • 如果被除数是0,则结果是0;
  • 如果有一个数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。

(5)加性操作符

1》加法(+)

  • 如果两个操作符都是数值,执行常规的加法计算,然后根据下列规则返回结果:
  • 如果有一个操作数是NaN,则结果是NaN;
  • 如果是Infinity加Infinity,则结果是Infinity;
  • 如果是-Infinity加-Infinity,则结果是-Infinity;
  • 如果是Infinity加-Infinity,则结果是NaN;
  • 如果是+0加+0,则结果是+0;
  • 如果是-0加-0,则结果是-0;
  • 如果是+0加-0,则结果是+0。
  • 如果有一个操作符是字符串,那么应用如下规则:
  • 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
  • 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
  • 如果有一个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用字符串的规则。对于null和undefined,则分别调用String()函数并取得字符串"null"和"undefined"。

2》减法(-)

  • 如果两个操作符都是数值,执行常规的算数减法操作并返回结果:
  • 如果有一个操作数是NaN,则结果是NaN;
  • 如果是Infinity减Infinity,则结果是NaN;
  • 如果是-Infinity减-Infinity,则结果是NaN;
  • 如果是Infinity减-Infinity,则结果是Infinity;
  • 如果是-Infinity减Infinity,则结果是-Infinity;
  • 如果是+0减+0,则结果是+0;
  • 如果是-0减-0,则结果是+0;
  • 如果是+0减-0,则结果是-0;
  • 如果有一个操作符是字符、布尔值、null或undefined。则在后台调用Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是NaN,则减法的结果就是NaN;
  • 如果有一个操作数是对象,则调用对象的valueOf()方法取得表示该对象的数值。如果得到的值是NaN,则减法的结果就是NaN。如果对象没有valueOf()方法,则调用toString()方法并将得到的字符串转化为数值。

(6)关系操作符

小于(<)、大于(>)、小于等于(<=)、大于等于(>=) 这几个操作符都返回一个布尔值

  • 如果两个操作数都是数值,则执行数值比较。
  • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
  • 如果一个操作数是数值,则将另一个操作数转化为一个数值,然后执行数值比较。
  • 如果一个操作数是对象,则调用这个对象的valueOf()方法,并用得到的结果根据前面的规则执行比较。如果对象没有valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较。
  • 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
  • 任何操作数与NaN进行关系比较,结果都是false。

(7)相等操作符

1》相等和不相等(==和!=)——先转换再比较
先转换操作数再比较相等性,在转换不同的数据类型时,相等和不相等遵循以下规则:

  • 如果有一个操作数是布尔值,则在比较相等性前先将其转换为数值---false转换为0,true转换为1;
  • 如果一个操作数是字符串,另一个操作数是数值,则在比较相等性前将字符串转换为数值;
  • 如果一个操作数是对象,另一个不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则比较;
  • null和undefined是相等的;
  • 在比较相等性之前,不能将null和undefined转换为其他任何值;
  • 如果有一个操作符是NaN,则相等操作符返回false,不相等操作符返回true;即使两个操作数都是NaN,也一样,因为按照规则,NaN不等于NaN;
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false;
表达式
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
5 =="5" true
false == 0 true
true == 1 true
true == 2 flase
undefined == 0 false
null == 0 false

 

 

 

 

 

 

 

 

 

 

 

2》全等和不全等()——仅比较而不转换
两个操作数在未经转换的情况下相等返回true,不相等返回false;

undefined == null;//true
undefined === null;// false

(8)条件操作符

variable = boolean_expression ? true_value : false_value ;

(9)赋值操作符

简单赋值(=)将右侧的值赋给左侧的变量
乘/赋值(*=)
除/赋值(/=)
模/赋值(%=)
加/赋值(+=)
减/赋值(-=)
左移/赋值(<<=)
有符号右移/赋值(>>=)
无符号右移/赋值(>>>=)

(10)逗号操作符

逗号操作符多用于声明多个变量;

var num1 = 0 , num2 = 1 , num3 = 2 ;

除此之外,逗号操作符还可用于赋值,逗号操作符总会返回表达式中最后一项。

var num = {1,2,3,4,5}; //num值为5

 

posted @ 2016-09-17 11:34  木子拖拖  阅读(123)  评论(0编辑  收藏  举报