阅读javascript高级程序设计随笔(五)

2.5 操作符

  操作符包括算术操作符、位操作符、关系操作符合相等操作符。ECMAScript操作符与众不同的是,它们能够适用很多值,例如字符串、数字值、布尔值甚至对象。在应用于对象时,相应的操作符通常都会调用对象的valueOf()或toString(),以便取得可以操作的值。

2.5.1 一元操作符

  只能操作一个值的操作符叫做一元操作符。

  1.递增和递减操作符

  递增和递减操作符,各有两个版本:前置型和后置型。例如:

  var num= 4;

     num++;//后置型

     ++num;//前置型

    前置型和后置型区别是前置型是先进行递增或递减运算,然后再参加运算;后置型是先参加运算,再进行递增或递减运算。例如:

  var num = 4;

  //alert(++num+1);//输出6 写成alert((++num)+1)结果也是一样

  //alert(num+++1);//输出5 写成alert((num++)+1)结果也是一样

 递增递减操作符不仅仅用在整数,还可以用在字符串、布尔值、浮点数和对象。它们遵循的规则以下:

1.在应用与一个包含有效数字字符的字符串时,先转换为数字值,再执行加减1的操作

2.在应用与一个不包含有效数字字符的字符串时,将变量的值设为NaN

3.在应用于布尔值false时,先将其转换为0再执行加减1的操作

4.在应用于布尔值true时,先将其转换为1再执行加减1的操作

5.在应用于浮点数值时,执行加减1操作。

6.在应用于对象,先调用对象的valueOf()方法以取得一个可供操作的值。然后对该值应用前述的规则。如果结果是NaN,则调用toString()方法后再应用前述规则。

例子:

var s1 = "2";

var s2 = "z";

var b = false;

var f = 1.1;

var o = {

  valueOf: function(){

    return -1;
  }

};

s1++; //值变成3

s2++;//值变成NaN

b++;//值变成1

f--; //值变成0.10000000000000009(由于浮点舍入错误所致)

o--;//值变成-2;

2.一元加和减操作符

2.5.2 位操作符

  位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。

  对于有符号的整数,32位中的前31位用于表示整数的值,第32位用于表示数值的符号:0表示整数,1表示负数。这个表示符号的位叫符号位。

     计算机是以二进制码来存储数据,而且是使用的是补码

  1.正数的补码就是它的原码。

  例如:+9(32位)

     原码为: 0000 0000 0000 0000 0000 0000 0000 1001

   补码为: 0000 0000 0000 0000 0000 0000 0000 1001

  2.负数的补码等于其绝对值的原码各位取反,然后整个数加1的数值

      例如:-7(32位)

       原码为: 1000 0000 0000 0000 0000 0000 0000 0111

   绝对值:0000 0000 0000 0000 0000 0000 0000 0111

    取反后: 1111 1111 1111 1111 1111 1111 1111 1000

    加1:    1111 1111 1111 1111 1111 1111 1111 1001

   所以补码是 1111 1111 1111 1111 1111 1111 1111 1001

按位非(NOT)(波浪线~)

var num1 = 25; // 0000 0000 0000 0000 0000 0000 0001 1001

var num2 = ~num1; // 1111 1111 1111 1111 1111 1111 1110 0110

alert(num2); //-26

按位与(AND)(&)

var result = 25 & 3; //0000 0000 0000 0000 0000 0000 0001 1001

           //0000 0000 0000 0000 0000 0000 0000 0011

alert(result);//1      // 0000 0000 0000 0000 0000 0000 0000 0001

按位或(or)(|)

var result = 25 & 3; //0000 0000 0000 0000 0000 0000 0001 1001

           //0000 0000 0000 0000 0000 0000 0000 0011

alert(result);//27     // 0000 0000 0000 0000 0000 0000 0001 1011

按位异或(XOR)(^)

var result = 25 & 3; //0000 0000 0000 0000 0000 0000 0001 1001

           //0000 0000 0000 0000 0000 0000 0000 0011

alert(result);//26    // 0000 0000 0000 0000 0000 0000 0001 1010

左移

左移操作符(<<),这个操作符将数值的所有位向左移动指定的位数。

 var oldValue = 2;    // 二进制10

var newValue = oldValue << 5;//左移5位 1000000,就是十进制的64

其实这个操作结果等于2*Math.pow(2,5);

在左移后,原数值的右侧多出了5个空位,左移操作会以0来填充这些空位。左移操作不会影响符号位。

有符号右移

有符号右移操作符(>>),这个操作与左移操作相反,数值向右移动,但保留符号位。

var oldValue= 64;// 0000 0000 0000 0000 0000 0000 0100 0000 红色为符号位

var newValue = oldValue>>5;//0000 0000 0000 0000 0000 0000 0000 0010 红色为符号位,蓝色为自动填充的0

向右移动空出的位置自动填充符号位的值

无符号向右移动操作符号(>>>)

2.5.3布尔操作符

1.逻辑非

    逻辑非操作符由一个叹号(!)表示。逻辑非操作符首先将它的操作数转换为一个布尔值,然后求反。

2.逻辑与

  逻辑与操作符号(&&),有两个操作数。逻辑与操作可以应用任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值。它遵循以下规则:

  $ 如果第一个操作数是对象,则返回第二个操作数。

  $ 如果第二个操作数是对象,则只有第一个操作数的求值结果为true的情况下才会返回该对象

  $ 如果两个操作数都是对象,则返回第二个操作数

  $ 如果有一个操作数是null,则返回null;(除了第一个操作数是false的情况)

  $ 如果有一个操作数是NaN,则返回NaN;(除了第一个操作数是false的情况)

  $ 如果有一个操作数是undefined,则返回undefined。(除了第一个操作数是false的情况)

如果两个操作数都是布尔值,会根据以下

----------------------------------------------

第一个操作数        第二个操作数          结果

----------------------------------------------

true                    true                       true

true                    false                      false

false                   true                       false

false                   false                      false

-----------------------------------------------

逻辑与也叫短路与,即如果第一个操作数能绝对结果,那么就不会再对第二操作数求值。当第一个操作数为false,就不管第二个操作数,直接返回false。

 例子:

var found = true;
var result = (found && someUndefinedVariable); //这里会发生错误
alert(result);//不执行

在浏览器报了Uncaught ReferenceError: someUndefinedVariable is not defined的错误。这说明不能在逻辑与操作中使用未定义的值。如果把found改为false,这个错误就不会发生了,因为发生短路,后面不求值。

3.逻辑或

逻辑或操作符(||)表示,有两个操作数。

在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值。它遵循以下规则:

  $ 如果第一个操作数是对象,则返回第一个操作数。

  $ 如果第二个操作数求值结果为false,则返回第二个操作数

  $ 如果两个操作数都是对象,则返回第一个操作数

  $ 如果有一个操作数是null,则返回null;(除了第一个操作数是true的情况)

  $ 如果有一个操作数是NaN,则返回NaN;(除了第一个操作数是true的情况)

  $ 如果有一个操作数是undefined,则返回undefined。(除了第一个操作数是true的情况)

如果两个操作数都是布尔值,会根据以下

----------------------------------------------

第一个操作数        第二个操作数          结果

----------------------------------------------

true                    true                       true

true                    false                      true

false                   true                       true

false                   false                      false

-----------------------------------------------

逻辑或也叫短路或,当第一个操作数是true,就不会执行第二个操作数,直接返回true。

原文地址:https://www.cnblogs.com/night2013/p/3500750.html