《JavaScript高级程序设计(第3版)》第三章总结二

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010011236/article/details/85525026

目录

三、操作符

3.1、一元操作符

3.2、布尔操作符

(1)逻辑非(!)

(2)逻辑与(&&)

(3)逻辑或(||)

3.3、乘性操作符

(1)乘法

(2)除法

(3)求模

(2)减法

3.5、关系操作符

3.6、相等操作符

(1)相等(==)和不相等(!=)

(2)全等(===)和不全等(!==)

参考文献


三、操作符

3.1、一元操作符

1. 递增和递减操作符

该操作符(++、--)不仅适用于整数,还是用于字符串、布尔值、浮点数值和对象。并遵循下列规则。

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

2. 一元加和减操作符

(1)一元加操作符(+)放在数值前面,对数值不会产生任何影响。

在对非数值应用一元加操作符时,该操作符会像 Number() 转型函数一样对这个值执行转换。

var o = {
    valueOf: function() {
        return -1;
    }
};
o = +o;
console.log('+o = ' + o);  // -1

(2)一元减操作符(-)应用于非数值时,规则与一元加操作符一样,最后再将得到的数值转换为负数。

var o = {
    valueOf: function() {
        return -1;
    }
};
o = -o;
console.log('+o = ' + o);  // 1

3.2、布尔操作符

(1)逻辑非(!)

逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。并遵循下列规则:

  • 如果操作数是一个对象,返回false;
  • 如果操作数是一个空字符串,返回true;
  • 如果操作数是一个非空字符串,返回false;
  • 如果操作数是0、null、NaN、undefined,返回true;
  • 如果操作数是任意非0数值(包括Infinity),返回false。

(2)逻辑与(&&)

在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,必须遵循下列规则:

  • 如果第一个操作数是对象,则返回第二个操作数;
  • 如果第二个操作数是对象,则只有第一个操作数的求值结果为 true 的情况下才会返回该对象;
  • 如果两个操作数都是对象,则返回第二个操作数;
  • 如果第一个操作数是 null、NaN、undefined,则返回 null、NaN、undefined。

(3)逻辑或(||)

与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时,它遵循下列规则:

  • 如果第一个操作数是对象,则返回第一个操作数;
  • 如果第一个操作数的求值结果为 false,则返回第二个操作数;
  • 如果两个操作数都是对象,则返回第一个操作数;
  • 如果两个操作数都是 null、NaN、undefined,则返回 null、NaN、undefined;

3.3、乘性操作符

ES中定义了3个乘性操作符:乘法、除法和求摸。非数值参与乘性运算时会调用 Number() 转型函数将其转化为数值。

(1)乘法

在处理特殊值的情况下,乘法操作符遵循下列特殊的规则:

  • 如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了 ES 数值的表示范围,则返回 Infinity 或 -Infinity;
  • 如果有一个操作数是 NaN,则返回 NaN;
  • 如果是 Infinity 与 0 相乘,则结果是 NaN;
  • 如果是 Infinity 与非 0 数值相乘,则结果是 Infinity 或 -Infinity,取决于有符号操作数的符号;
  • 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity;
  • 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上述规则。

(2)除法

特殊处理规则:

  • 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果商超过了 ES 数值的表示范围,则返回 Infinity 或 -Infinity;
  • 如果有一个操作数是 NaN,则返回 NaN;
  • 如果是 Infinity 被 Infinity 除,则结果是 NaN;
  • 如果是零被零除,则结果 NaN;
  • 如果是非零的有限数被零除,则结果是 Infinity 或 -Infinity,取决于有符号操作数的符号;
  • 如果是 Infinity 被任何非零数值除,则结果是 Infinity 或 -Infinity,取决于有符号操作数的符号;
  • 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上述规则。

(3)求模

特殊处理规则:

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

3.4、加性操作符

(1)加法

当两个操作数都是数值时,根据下列规则返回结果:

  • 如果一个操作数是 NaN,则结果是 NaN;
  • 如果是 Infinity 加 Infinity,则结果是 Infinity;
  • 如果是 -Infinity 加 -Infinity,则结果是 -Infinity;
  • 如果是 Infinity 加 -Infinity,则结果是 NaN;
  • 如果是 +0 加 +0,则结果是 +0;
  • 如果是 -0 加 -0,则结果是 -0;
  • 如果是 +0 加 -0,则结果是 +0。

如果有一个操作数是字符串,则应用如下规则:

  • 如果两个操作数都是字符串,则进行拼接;
  • 如果一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
  • 如果有一个操作数是 对象、数值 或 布尔值,则调用它们的 toString() 方法取得相应的字符串值,然后在应用上述关于字符串的规则。

(2)减法

  • 如果两个操作数都是数值,则执行常规的算术减法操作并返回结果;
  • 如果有一个操作数是 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() 函数将其转换为数值,然后再根究前面的规则执行减法计算。如果转换结果是 NaN,则减法的结果就是 NaN;
  • 如果一个操作数是对象,则调用对象的 valueOf() 方法以取得表示该对象的数值。如果得到的值是 NaN,则减法的结果就是 NaN。如果对象没有 valueOf(),则调用其 toString()方法并将得到的字符串转换为数值。

3.5、关系操作符

当关系操作符的操作数使用了非数值时,则应用如下规则:

  • 如果两个操作数都是数值,则执行数值比较;
  • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;
  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;
  • 如果一个操作数是对象,则调用对象的 valueOf() 方法,用得到的结果按照前面的规则执行比较。如果对象没有 valueOf(),则调用其 toString() 方法,并用得到的结果根据前面的规则执行比较。
  • 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

注意:任何操作数与 NaN 进行关系比较,结果都是 false。

3.6、相等操作符

相等不相等——先转换再比较

全等不全等——仅比较而不转换

(1)相等(==)和不相等(!=)

相等和不相等操作符在进行比较操作时会转换操作数,同时遵循下列基本规则:

  • 如果一个操作数是布尔值,则先转化为数值,然后再进行比较;
  • 如果一个操作数是字符串,另一个操作数是数值,则把字符串转化为数值之后再进行比较;
  • 如果一个操作数是对象,另一个操作数不是对象,则调用valueOf()方法,用得到的基本类型值按照前面的规则进行比较。

这两个操作符在进行比较时则要遵循下列规则。

  • null 和 undefined 是相等的;
  • 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值;
  • 如果有一个操作数是NaN,则相等操作符返回false,不相等操作符返回true;注意:即使两个操作数都是 NaN,相等操作符也返回false。
  • 如果两个操作数都是对象,且都指向同一个对象,则相等返回true;否则返回false。

(2)全等(===)和不全等(!==)

注意:null == undefined 会返回 true,因为它们是类似的值;

           但 null === undefined 会返回 false,因为它们是不同类型的值。

参考文献

[1] 《JavaScript高级程序设计(第3版)》

猜你喜欢

转载自blog.csdn.net/u010011236/article/details/85525026