JavaScript高级程序设计:基础概念下

5.操作符

     ①一元操作符:

          1)递增与递减

                前置递增、递减:变量的值在语句被求值以前改变。

                后置递增、递减:变量的值是在语句被求值之后才执行。

                

递增、递减遵循的规则
1)包含有效数字字符的字符串:转换为数字值,再执行增减。字符串转换为数值
2)不包含有效数字字符的字符串:NaN。字符串转换为数值
3)false:转换为0,再执行增减。
4)true:转换为1,在执行增减。
5)浮点数:执行增减
6)对象:执行valueOf(),按上述规则。如果为NaN,执行toString(),在按上述规则。对象变量转换为数值。

          2)一元加和减操作

                 一元加操作符,放在数值前面,对数值不会有任何影响。对非数值应用一元加操作,操作符会像Number()一样对值进行转换。一元减操作符主要表示负数。应用于数值,数值变为负数。应用于非数值,遵循与一元加操作符相同规则,最好将得到的数值转换为负数。

     ②位操作符:

          ECMAScript中,当对数值应用位操作符,后台会发生转换:64位数值被转换为32位数值,然后执行位操作,再转换回64位数值。NaN和Infinity值应用位操作符时,都将被当做0处理。

          1)按位非(NOT)

                 由一个(~)来表示,按位非的结果就是返回数值的反码。按位非的本质:操作数的负数-1.

          2)按位与(AND)

                由一个(&)来表示,就是将两个数值的每一位对齐。

          3)按位或(OR)

                 由一个(|)来表示。按位或操作在有一个位是1的情况下就返回1。

          4)按位异或(XOR)

                 由一个(^)来表示。这个操作在两个数值对应位上只有一个1时才返回1。

          5)左移

                 由两个小于号(<<)来表示,这个操作符会将数值所有位向左移动指定的位数。左移不会影响符号位。

          6)有符号的右移

                 由两个大于号(>>)来表示。这个操作符会将数值向右移,但保留符号位。

          7)无符号右移

                  由三个大于号(>>>)来表示。这个操作符会将数值的所有32位都向右移动。对于正数,结果与有符号右移相同。对于负数,无符号右移是以0来填充空位,而有符号右移是以符号位填充空位。无符号右移操作符会把负数的二进制码当做正数的二进制码。

     ③布尔操作符

          1)逻辑非

                  由一个(!)来表示。这个操作数会返回一个布尔值。首先转为布尔值,再对其求反。而同时使用两个逻辑非操作符,相当于模拟Boolean()转型函数的行为。

          2)逻辑与

                  由两个(&&)来表示,有两个操作数。不一定返回布尔值。

                  逻辑与属于短路操作,即如果第一个操作数能决定结果,那么就不再对第二个操作数求值。如果第一个操作数为false,无论第二个操作数为什么,结果都不可能为true。

                  在逻辑与操作中不能使用未定义的值。

          3)逻辑或

                 由两个(|| )来表示。 不一定返回布尔值。

                 逻辑或也是短路操作,如果第一个操作数的求值结果为true,就不会对第二个操作数求值。

     ④乘性操作符

           1)乘法(*)

                 

乘法操作符遵守的规则
1)都为数值:常规乘法计算。如果乘积超过范围,结果为Infinity或-Infinity
2)有一个操作数为NaN:NaN
3)Infinity与0相乘:NaN
4)Infinity与非0相乘:Infinity或-Infinity
5)Infinity与Infinity相乘:Infinity
6)有一个操作数不为数值:调用Number(),再应用上述规则

 

          2)除法(/)

除法操作符遵循的规则
1)都为数值:常规除法计算。如果超过范围,Infinity或-Infinity
2)有一个操作数为Nan:NaN
3)Infinity/Infinity:NaN
4)0/0:NaN
5)非零的有限数被零除:Infinity或-Infinity
6)Infinity被任何非零数除:Infinity或-Infinity

 

          3)求模(%)

求模操作符遵循的规则
1)都为数值:常规求模运算。
2)被除数为无穷大数值,除数为有限大数值:NaN
3)被除数为有限大数值,除数为0:NaN
4)Infinity被Infinity除:NaN
5)被除数为有限大数值,除数为无穷大数值:被除数
6)被除数为0:0
7)有一个操作数为非数值:Number(),再应用上诉规则

 

     ⑤加性操作符:

          1)加法:

加法规则
1)有一个NaN:结果为NaN
2)Infinity+Infinity=Infinity
3)-Infinity+-Infinity=-Infinity
4)Infinity+-Infinity=NaN
5)+0+0=+0
6)-0+-0=-0
7)+0+-0=+0

 

          

有一个操作数为字符串的规则
1)都为字符串:则将第二个字符串与第一个字符串拼接
2)只有一个为字符串:则将另一个操作数转换为字符串,,在拼接在一起

 

          2)减法

减法遵循的规则
1)都为数值:常规算术减法操作
2)有一个操作数为NaN:NaN
3)Infinity-Infinity=NaN
4)-Infinity-(-Infinity)=NaN
5)Infinity-(-Infinity)=Infinity
6)-Infinity-Infinity=-Infinity
7)+0-(+0)=+0

8)-0-(+0)=-0

9)-0-(-0)=+0

10)有一个操作数为字符串、布尔值、null或undefined,Number(),在按照上述规则

11)有一个操作数为对象,valueOf()。如果得到NaN,结果记为NaN。如果没有valueOf(),就调用toString(),并将得到的字符串转换为字符

 

     ⑥关系操作符

          大于(>)、小于(<)、小于等于(<=)和大于等于(>=)都用于对两个值进行比较。这个操作符都返回一个布尔值。

关系操作符遵循的规则
1)都是数值:进行数值比较
2)都是字符串:比较对应的字符编码值
3)一个为数值:把另一个操作数转换为数值
4)一个为对象:则调用valueOf(),用上述规则比较。如果没有valueOf(),则调用toString(),并用上述规则比较
5)一个为布尔值:转为数值,进行比较

          在比较字符串时,实际比较的是两个字符串中对应位置的每个字符的字符编码值。大写字母的字符编码全部小于小写字母的字符编码。要真正按字母表顺序比较字符串,就必须把两个操作数转换为相同的大写/小写形式。

     ⑦相等操作符

         ECMAScript提供两组操作符:相等和不相等、全等和不全等。

         1)相等与不相等

               这两个操作符都会先转换操作数(强制转型),然后再比较它们的相等性。

转换不同数据类型遵循的规则
1)有一个操作数为布尔值:false转为0,true转为1
2)有一个操作数为字符串,另一个操作数为数值:将字符串转为数值
3)有一个操作数为对象,另一个不是:调用valueOf(),用前面的规则比较

 

两个操作符进行比较遵循的规则
1)有一个操作数是NaN:相等操作符返回false,不相等操作符返回true
2)两个操作数都为对象:指向相同对象,返回true

                  2)全等和不全等

                        全等(===):在两个操作数未经转换就相等则返回true,反之返回false。

                        不全等(!==):在两个操作数未经转换就不相等就返回true,反之返回false。

     ⑧条件操作符

            variable= boolean_expression ? true_value: false_value;

     ⑨赋值操作符

          每个主要的算术操作符都有相应的符合赋值操作符。

     ⑩逗号操作符

         使用逗号操作符可以在一条语句中执行多个操作。

         逗号操作符还可以用于赋值。在用于赋值时,逗号操作符总会返回表达式中的最后一项。

 

6.语句

     ①if语句

           if(condition) statement1 else statement2;

     ②do-while语句:循环体内的代码至少会被执行一次

          do(

               statement

               }while(condition);

     ③while语句:循环体内的代码有可能永远都不会被执行

           while(exression)

                  statement

     ④for语句

          for(initialization; expression; post-loop-expression)

                statement

     ⑤for-in语句

         for-in语句是一种精确的迭代语句,可以用来枚举对象的属性。

         for( property in expression) 

             statement

         ECMAScript对象的属性是没有顺序的,因此通过for-in循环输出的顺序是不可预测的。具体来讲,每个属性都会被返回一次,但返回的先后次序可能因浏览器而异。

         如果要迭代的对象的变量值为null或undefined,语句会抛出错误。ECMAScript5更正了这一行为,对这种情况不再抛出错误,而只是不执行循环体。建议在使用for-in语句前,先检查对象的值是否为null或undefined。

     ⑥label语句

         使用label语句可在代码中添加标签,以便将来使用。

          label:statement

     ⑦break和continue语句

         break和continue都用于在循环中精确地控制代码的执行。

         break语句:会立即退出循环强制执行循环后面的语句。

         continue语句:也是立即退出循环,然后会从循环的顶部开始执行。

         break和continue语句都可以与label语句联合使用,从而返回代码中的特定的位置。

     ⑧with语句

         with语句的作用是 将代码的作用域设置到一个特定的对象中。

         with( expression) statement;

          严格模式下不允许使用with语句,否则视为语法错误。

     ⑨switch语句

         通过为每个case后面添加一个break语句,就可以避免同时执行多个case的情况。

         可以在switch语句中使用任何数据类型。每个case的值不一定是常量,可以是变量或者表达式。

         switch(expression){

          case value: statement

          break;

          case value:statement

          break;

          default:statement

        } 

 

7.函数

     使用function关键字来声明函数,后跟一组参数和函数体。

     function functionName(arg0 , arg1, arg2····){

        statement  

     }

     函数可以通过函数名来调用,后面还要跟一对圆括号和参数。

     函数在定义时不必指定是否返回值。可通过return语句后跟要返回的值来实现返回值。函数在执行完return语句后停止并立即退出。return语句也可以不带要任何返回值,函数在停止执行后返回undefined。这种用法一般用在需要提前停止函数而又不需要返回值的情况下。

     ①理解参数

         ECMAScript函数不介意传入多少参数,也不在乎传入的参数是什么数据类型。

         原因:ECMAScript中的参数在内部是用一个数组来表示的。函数始终接受的是这个数组,而不关心数组中包含哪些参数。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获得传递给函数的每一个参数。可通过arguments.length来获知有多少参数被传递给函数。

         ECMAScript函数的特定之一:命名的参数只提供便利,但不是必需的。

        arguments对象可以与命名参数一起使用。它的值永远与对应命名参数的值保持同步。并不是说这两个值访问相同的内存空间,它们的内存空间是独立的,但是它们的值会同步。arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数个数决定的。没有传递值的命名参数被自动赋予undefined值。这就跟定义变量又没有初始化一样。

     ②没有重载

          如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。


function addSomeNumber(num){
   return num+100;
 }
 
function addSomeNumber(num){
   return num+200;
 }

var result=addSomeNumber(100);//300

                

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值