zoukankan      html  css  js  c++  java
  • 阅读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。

  • 相关阅读:
    242. Valid Anagram
    [wikioi]关押罪犯
    [wikioi]数的划分
    [wikioi]能量项链
    [wikioi]线段覆盖 2
    [wikioi]乌龟棋
    POJ1011 Sticks
    *[leetcode]Word Break II
    [leetcode]Word Break
    《高性能网站建设指南》笔记
  • 原文地址:https://www.cnblogs.com/night2013/p/3500750.html
Copyright © 2011-2022 走看看