Javascript高级程序设计 Ch3-5

来源:互联网 发布:淘宝上论文查重靠谱吗 编辑:程序博客网 时间:2024/05/17 17:54

Javascript高级程序设计Ch3-5

基本概念

3.5操作符

1 一元操作符

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

  • 递增和递减操作符
    ++和–; 分前置和后置的区别(即递增和递减操作是在包含它们的语句被求值之前还是之后执行的)
    递增和递减操作符不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。在应用于不同的值时,遵循如下规则:

    • 在应用于一个包含有效数字字符字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字符串变量变成数值变量。
    • 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN。字符串变量变成数值变量。
    • 在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量。
    • 在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。布尔值变量变成数值变量。
    • 在应用于浮点数值时,执行加减 1 的操作。
    • 在应用于对象时,先调用对象的 valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则。如果是 NaN,则在调用 toString()方法后再应用前述规则。对象变量变成数值变量。
  • 一元加减操作符 += -=的应用

2 位操作符

  • 二进制补码(负数用二进制码储存的时候格式为二进制补码)
    计算步骤:

    • 1 求这个数值绝对值的二进制码;
    • 2 求二进制反码,即将 0 替换为 1, 将 1 替换为0;
    • 3 得到的二进制反码加 1;
  • 以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码前面加上一个负号。

  • 位操作:
    • 按位非(NOT) 用 波浪线 ~ 表示,执行按位非的结果就是返回数值的反码
    • 按位与(AND) 用 和号字符 & 表示, 都是 1 才为 1。
    • 按位或(OR) 用 竖线负号 | 表示, 有 1 则为 1。
    • 按位异或(XOR) 用 插入符号 ^ 表示, 不同为 1。
    • 左移 用 两个小于号 << 表示,二进制码左移。
    • 有符号右移 用 两个大于号 >> 表示, 数字转换为二进制(或二进制补码)右移,保留符号位,填充符号位,返回十进制。
    • 无符号右移 用 三个大于号 >>> 表示, 符号位全动,用 0 填充, 对负数有影响。

3 布尔操作符

非(NOT)与(AND)或(OR)

  • 逻辑非 由一个 叹号 ! 表示,可应用于任何值。
    • 如果操作数是一个对象,返回 false;
    • 如果操作数是一个空字符串,返回 true;
    • 如果操作数是一个非空字符串,返回 false;
    • 如果操作数是数值 0,返回 true;
    • 如果操作数是任意非 0 数值(包括 Infinity),返回 false;
    • 如果操作数是 null,返回 true;
    • 如果操作数是 NaN,返回 true;
    • 如果操作数是 undefined,返回 true。
      连续使用两个逻辑非,则会使其等效于 Boolean() 转型函数的行为,第一个逻辑非操作会基于无论什么操作数返回一个布尔值,第二个逻辑非操作则对该布尔值求反,于是得到了这个只正真对应的布尔值。
  • 逻辑与 由 两个和号 (&&) 表示,有两个操作数
    其真值表如下:

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

逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。再有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时遵循以下规则:

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

逻辑与属于短路操作,如果第一个操作能够决定结果,那么就不会在对第二个操作数求值。

如果第一个是 false(null,NaN,undefined), 则无论第二个是什么,都会返回 false(null,NaN,undefined)

  • 逻辑或 由两个竖线符号 ( || ) 表示,有两个操作数
    其真值表如下:

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


和逻辑与差不多,如果有一个操作数不是布尔值,结果不一定返回布尔值;此时遵循以下规则:

  1. 如果第一个操作数是对象,则返回第一个操作数;
  2. 如果第一个操作数的求值结果为 false,则返回第二个操作数;
  3. 如果两个操作数都是对象,则返回第一个操作数;
  4. 如果两个操作数都是 null,才返回 null;
  5. 如果两个操作数都是 NaN,才返回 NaN;
  6. 如果两个操作数都是 undefined,才返回 undefined。

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

我们利用逻辑或的这一行为,来避免为变量赋 null 或 undefined值!
例如:
  var myObject = preferredObject || backupObject;
如果第一个不为 null 和 undefined,则优先赋 preferredObject 给 myObject,如果 preferredObject 中不包含有效值(null、undefined等)则将 backupObject作为后备值赋给 myObject。

4 乘性操作符

  • 乘法
    由一个星号(*)表示,遵循如下规则:

    • 如果操作数都是数值,按常规来;
    • 如果有一个操作数是 NaN,则为 NaN;
    • 如果是 Infinity 与 0 相乘,则为NaN;
    • 如果是 Infinity 与非 0 数值相乘,则为Infinity或-Infinity;
    • 如果是 Infinity 与 Infinity 相乘,结果依然为Infinity;
    • 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,再用上面的规则计算。
  • 除法
    由一个斜线符号(/)表示,遵循如下规则:

    • 如果都是数值,按常规来;
    • 如果有一个操作数是 NaN,则为 NaN;
    • 如果是 Infinity 被 Infinity 除,则为NaN;
    • 如果是 0 被 0 除,则为 NaN;
    • 如果是非 0 的有限数被 0 除,结果为 Infinity 或 -Infinity;
    • 如果是 Infinity 被任何非 0 数除,则结果为 Infinity 或 -Infinity;
    • 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,再用上面的规则计算。
  • 求模
    由一个百分号(%)表示,遵循如下规则:

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

5 加性操作符

  • 加法
    用加号(+)表示,遵循如下规则:

    • 如果有一个操作数是 NaN,则结果为 NaN;
    • 如果是 Infinity 加 Infinity,则结果为 Infinity;
    • 如果是 -Infinity 加 -Infinity,则结果为 -Infinity;
    • 如果是 Infinity 加 -Infinity,则结果为 NaN;
    • 如果是 +0 加 +0,则结果为 +0;
    • 如果是 -0 加 -0,则结果为 -0;
    • 如果是 +0 加 -0,则结果为 +0;
    • 如果两个操作数都是字符串,则拼接;
    • 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后拼接。

    如果有一个操作数是对象、数值或布尔值,则调用 toString()方法取得相应的字符串的值,对于 undefined和null调用 String()取得字符串 “undefined” 和 “null”。

  • 减法
    用减号(-)表示,遵循如下规则:
    • 如果两个操作数都是数值,按常规来;
    • 如果有一个操作数是 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() 函数,再执行;
    • 如果有一个操作数是对象,则调用对象的 valueOf() 方法取得表示该对象的数值。

6 关系操作符

  • 小于(<)、大于(>)、小于等于(<=)和大于等于(>=),规则就是正常数学规则,比较大小,返回布尔值。
    当关系操作符的操作数使用了非数值时,以下为相应规则:

    • 如果两个操作数都是数值,按常规来;
    • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;
    • 如果一个操作数是数值,则将另一个操作数转换为一个数值,再比较;
    • 如果一个操作数是对象,则调用这个对象的 valueOf() 方法,用得到的结果按上面的规则进行比较,如果对象没有 valueOf() 方法,则调用 toString() 方法,用得到的结果按上面的规则进行比较;
    • 如果一个操作数是布尔值,先转换为数值,再比较;
    • 和 NaN 比较的结果都是 false。

7 相等操作符

  • 相等和不相等

    相等由两个等号(==)表示,
    不相等由叹号后跟等于号(!=)表示,
    这两个操作符都会先转换操作数(通常称为强制转型),然后再比较,返回布尔值。

    遵循如下规则:

    • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值(false → 0; true → 1);
    • 如果一个操作数是字符串,另一个是数值,比较前字符串转换为数值;
    • 如果一个操作数是对象,另一个不是,现调用对象的 valueOf() 方法
    • null 和 undefined 是相等的;
    • 在比较相等性之前,不能将 null 和 undefined 转换为其他值;
    • 如果有一个操作数是 NaN,则相等操作符返回 false 不相等操作符返回 true;
    • 如果两个操作数都是对象,则比较它们是不是同一个对象,是则 true 否则 false。

    下表列出了一些特殊情况及比较结果:

表达式 值 表达式 值 null == undefined true true == 1 true “NaN” == NaN false true == 2 false 5 == NaN false undefined == 0 false NaN == NaN false null == 0 false NaN != NaN true “5” == 5 true false == 0 true

  • 全等和不全等

    全等由三个等于号(===)表示,
    不全等由叹号后跟两个等于号(!==)表示,
    除了在比较之前不转换操作数之外,全等和不全等操作符与相等不相等操作符没什么区别

    全等只在两个操作数未经转换就相等的情况下返回 true 。
    null == undefined 会返回 true,因为他们是类似的值;但 null === undefined 会返回 false,因为它们是不同类型的值

8 条件操作符

  • 模板:

variable = boolean_expression ? true_value : false_value;

例如
   var max = (num1 > num2) ? num1 : num2;
   
它表示如果 num1 大于 num2 (关系表达式返回true),则将 num1 赋给 max,否则将 num2 赋给 max。

9 赋值操作符

  • 简单的赋值操作符由等于号(=)表示,其作用是把右侧的值赋给左侧的变量,
    如果在等于号(=)前面再添加乘性操作符、加性操作符或位操作符,可以完成复合赋值操作。
    例如:
    • 乘/赋值 (*=);
    • 除/赋值 (/=);
    • 模/赋值 (%=);
    • 加/赋值 (+=);
    • 减/赋值 (-=);
    • 左移/赋值 (<<=);
    • 有符号右移/赋值 (>>=);
    • 无符号右移/赋值 (>>>=)。

10 逗号操作符

使用逗号操作符可以在一条语句中执行多个操作,多用于声明多个变量赋值(用作赋值时,逗号操作符总会返回表达式中的最后一项)