JavaScript高级程序设计(第3版)笔记(三)

来源:互联网 发布:淘宝特价秒杀二维码 编辑:程序博客网 时间:2024/05/01 15:55
17.操作符
  一元操作符:递增递减操作符,一元加和减操作符

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

                      不同类型使用‘+’,相当于Number()类型转换

  位操作符:(1)按位非(NOT)由~(波浪线)表示,按位非的结果是返回数值的反码
                         var num1 = 25; //00000000000000000000000000011001
                         var num2 = ~num1;//11111111111111111111111111100110

                         alert(num2);//-26 相当于操作数的负值减1

                         注:数字的反码相当与数字的负数减1;负数相当于反码加1

                   (2)按位与(AND)由&表示,
                       第一个数值的位     第二个数值的位     结果
                        1                    1            1
                        1                    0            0
                        0                    1            0
                        0                    0            0
                       var result = 25 & 3;             25 == 11001
                       alert(result); //1                     3 == 00011
                                                                              00001
                       按位与操作只在两个数值的对应位都是1时,才返回1,其他返回0
                   (3)按位或(OR)由|表示
                       第一个数值的位     第二个数值的位     结果
                        1                    1            1
                        1                    0            1
                        0                    1            1
                        0                    0            0
                       var result = 25 | 3;             25 == 11001
                       alert(result);//27                  3 == 00011
                                                                            11011
                       按位或操作在有一位是1的情况下就返回1;只有都是0的情况下,返回0;
                  (4)按位异或(XOR),以^表示
                       第一个数值的位     第二个数值的位     结果
                        1                    1            0
                        1                    0            1
                        0                    1            1
                        0                    0            0
                       var result = 25 ^ 3;             25 == 11001
                       alert(result);//26                     3 == 00011
                                                                              11010
                       按位异或操作在只有一位是1的情况返回1,其他为0,比按位或少1
                  (5)左移 由<<表示,会将数值的所有为向左移动指定的位数
                       var oldValue = 2;   //二进制的值为 10

                       var newValue = oldValue <<5;  //1000000  64(十进制)

                      注:左移和有符号的右移不影响符号位,所以 -2 << 5 //-64

                  (6)有符号的右移,由>>表示,将数值向右移动,但保留符号位
                       var oldValue = 64;      //1000000
                       var newValue = oldValue >>5; //10  2(十进制)
                  (7)无符号右移,由>>>表示,无符号右移是以0来填充空位,而不像有符号右移是以符号位的值

                        填充空位,所以正数的无符号右移与有符号右移结果相同,但是负数的结果就很大不同了无符

                        号右移操作符会将负数的二进制码当成正数的二进制码,而且负数以其绝对值的二进制补码形

                        式表示,会使结果非常之大

                        var oldValue = -64; //等于二进制的11111111111111111111111111000000
                        var newValue = oldValue >>>5; //等于二进制的00000111111111111111111111111110 
                                                                            //十进制的134217726

                        注:左移是以0来填充空位,而有符号右移是以符号位的值来填充空位,无符号右移是以0来填充空位
  布尔操作符:适用任何数据类型(1)逻辑非,!表示,先将它的操作数转换为布尔值,然后求反
                      如果操作数为一个对象,返回false;
                      如果操作数为一个空字符串,返回true;
                      如果操作数为一个非空字符串,返回false;
                      如果操作数为数值0,返回true;
                      如果操作数为非零数值(包括infinity),返回false;
                      如果操作数为null,返回true
                      如果操作数为NaN,返回true;
                      如果操作数为undefined,返回true

                      注:同时使用两个逻辑非操作符,相当于Boolean()
              (2)逻辑且,&&表示
                      如果第一个操作数为true,则返回第二个操作数
                      如果第一个操作数为null/NaN/undefined,则返回null/NaN/undefined
              (3)逻辑或,||表示
                      如果第一个操作数是对象,则返回第一个操作数
                      如果第一个操作数的求值为false,则返回第二个操作数
                      如果两个操作数都是对象,返回第一个操作数
                      如果两个操作数都是null/NaN/undefined,则返回null/NaN/undefined

  乘性操作符:
              乘法:
              (1)如果两个数值相乘超过范围,返回Infinity
              (2)如果0乘Infinity,返回NaN
              (3)如果Infinity与Infinity/非零数值相乘,按符号返回Infinity
              (4)如果有一个为NaN,返回NaN
              (5)如果操作数不是数值,先通过Number()转换再操作
              除法:
              (1)如果非零数值除以Infinity,返回0
              (2)如果非零数值包括Infinity除以0,按符号返回Infinity
              (3)如果有一个为NaN,返回NaN
              (4)如果计算后超过范围,按符号返回Infinity
              (5)如果0/0,返回NaN
              (6)如果Infinity/Infinity,返回/NaN
              (7)Infinity除以非零数,按符号返回Infinity
              (8)如果操作数不是数值,先通过Number()转换再操作
              求模:
              (1)无穷大数值除以有限数值,返回NaN
              (2)有限数值除以无穷大数值,返回有限数值(被除数)
              (3)有限数值除以0,返回NaN
              (4)Infinity除以Infinity,返回NaN
              (5)被除数为零,返回零
              (6)如果操作数不是数值先通过Number()转换再操作
              (7)有一个操作数为NaN,返回NaN
  加性操作符:
              加法:
              (1)有一个操作数为NaN,返回NaN
              (2)Infinity加Infinity,返回Infinity
              (3)-Infinity加-Infinity,返回-Infinity
              (4)-Infinity加Infinity,返回NaN
              (5)如果其中一个操作数为字符串,另一个操作数转换为字符串格式,进行拼接
              (6)如果其中一个为对象,调用toString(),返回为null/undefined,继续调用valueOf(),根据以上规律操作
                   var result = "4" + 5;
                   alert(result)  //45
              减法:
              (1)有一个操作数为NaN且另一个不为字符串,返回NaN
              (2)Infinity减Infinity,返回NaN
              (3)-Infinity减-Infinity,返回NaN
              (4)Infinity减-Infinity,返回Infinity
              (5)-Infinity减-Infinity,返回-Ininity
              (6)其他类型操作,先转换为数值,再操作,如果转换结果为NaN,返回NaN
  关系操作符:> < >= <=
              (1)如果两个操作数为字符串,则比较字符编码值
              (2)如果有一个为数值,则两个都转换成数值比较(即使是字符串)
              (3)如果有一个操作数为boolean,转成数值进行比较
              (4)如果是对象,先通过valueOf(),toString(),进行转化,再比较
  相等操作符:相等和不相等--先转换,再比较  全等和不全等,先比较,不转换
              相等与不相等:
              (1)如果一个操作数为布尔,先转成数值,再比较
              (2)如果一个操作数为数值,则转换成数值进行比较(即使是字符串)
              (3)如果两个对象比较,比较两个是否为一个对象,判断是否指向一个对象,一个对象则为true,否则false
              (4)如果一个操作数为NaN,相等比较返回false,不相等比较,返回true
              (5)NaN != NaN //true  null == undefined  //true Infinity === Infinity  //true
                注:比较相等性时不能把undefined,null转换类型
                       null == 0 //false undefined == 0 // false 
  条件操作符:var c = a > b ? a : b;
  赋值操作符:+= , -=,*=,/=,\=,<<= , >>=,>>>=
  逗号操作符:多用于声明多个变量  var a = 1, b = 2, c = 3;
                逗号表达式(优先级低于所有操作符,甚至赋值):
                一般形式:表达式1,表达式2,表达式3,...,表达式n;
                表达式的值为表达式n的值
                常用于for循环中
                for(var i=0,j=0;i<2;i++,j++){
                    k=i+j;
                }
                注:不是所有的逗号都可以看成是逗号表达式,逗号两边必须是表达才可以
                如:var a = 1,10; //报错
                       因为逗号左侧是声明a的语句,不是表达式,所以被认为普通的逗号,常量10不能被声明,报错
                       alert(2,5) //2
                       alert((2,5)) //5
                       由于函数运算符优先级高于逗号运算符,因此第一个例子弹出2,在逗号两侧加上小括号,则优先逗号                        运算符,如例2
18、语句
       if语句              if(){}else{}
       do-while语句  do{}while() 注:不论是否满足条件,先执行一次,for与while不满足条件不执行
       while语句        while(){}     
       for语句            for(){}  注:初始化表达式,控制表达式,循环后表达式都是可选的,都省略,会变成无限循环                                   for(;;){}
                                        var count = 3;
                                        for(var i = 0,j = 0;i < count;i++,j++){
                                               console.log(i+" "+j);
                                        }
                                        console.log(i+' '+j);//3 3  i j 为循环内定义的变量,循环外也可以访问到
       for-in语句        如:for(var propName in window){console.log(propName)} //会输出window的所有属性                                           名,但顺序不一定
                               注:在此循环之前最好确定对象是否为null或undefined
       label语句         label:statement,一般由break,continue引用,结合for循环使用
                               如:例1:var num = 0;
                                              for (var i = 0 ; i < 10 ; i++){
                                                    for (var j = 0 ; j < 10 ; j++){
                                                         if( i == 5 && j == 5 ){
                                                                 break;
                                                          }
                                                          num++;
                                                    }
                                              }
                                             alert(num); // 当i为5,j为5时,会跳出j循环继续执行i循环,返回95
                                     例2:var num = 0;
                                              outPoint:
                                              for (var i = 0 ; i < 10 ; i++){
                                                    for (var j = 0 ; j < 10 ; j++){
                                                          if( i == 5 && j == 5 ){
                                                               break outPoint;
                                                         }
                                                         num++;
                                                   }
                                              }
                                             alert(num); // 当i为5,j为5时,会跳出到定义的outPint不再执行循环,返回55
                                     例3:var num = 0;
                                              outPoint:
                                              for (var i = 0 ; i < 10 ; i++){
                                                    for (var j = 0 ; j < 10 ; j++){
                                                           if( i == 5 && j == 5 ){
                                                                 continue outPoint;
                                                           }
                                                            num++;
                                                    }
                                               }
                                               alert(num); // 当i为5,j为5时,会跳出当前循环,再继续执行,返回9
       break与continue语句
                 break    会强制跳出当前循环,执行循环外的代码
                 continue 会停止执行continue以下的代码,继续循环
       with语句      严格模式下,不可使用
                 如 :     var qs = location.search.substring(1);
                           var hostName = location.hostname;
                           var url = location.href;
                 可改写成:with(location){
                             var qs = search.substring(1);
                             var hostName = hostName;
                             var url = href;
                           }
                 重写的例子中,with关联了location对象,with语句的代码块中,每个变量首先认为是局部变量,
                 局部环境找不到变量的定义,再查找location中是否含有同名的属性,进行使用
       switch语句    switch(expression){
                            case value: statement
                            break;
                            case value: statement
                            break;
                           default:statement 
                           }
                 注:(1)case后的statement可不写
                        (2)switch语句中可使用任何数据类型,case的值可以是变量,常量,表达式
                 例: switch(i){
                          case 25:
                          case 26: alert("26");
                          default: alert("other");
                         }
19、函数   可以通过return后跟要返回的值,实现返回值。也可以不返回,执行return,立即停止,退出函数
                 注:严格模式下,不能把函数及参数命名为eval或arguments,不能出现命名参数同名的情况
                 理解参数 
                1、ECMAScript中的参数的内部是通过一个数组来表示的,函数之中接收这个数组,所以无所谓函数中有                       多少个参数,在函数体可以通过arguments对象来访问这个参数数组,来获取每个参数。arguments                         中的值始终与命名参数同步,例如改变arguments[0]的值,也就修改了参数1的值,但是改变参数1的                       值不能该表arguments[0]的值。argumnets的长度与传入参数的个数相关,没有被传递的命名参数会                       自动赋值为undefined
                2、严格模式下,不可以对arguments进行修改从而对命名参数修改(会报错)
                3、两个名称相同的函数被定义了两次,后定义的函数会覆盖之前定义的函数(不能重载)
         

阅读全文
0 0
原创粉丝点击