JavaScript高级程序设计总结——操作符

339 阅读7分钟
1.一元操作符

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

1.递增和递减操作符

前置型:位于要操作的变量之前。由于前置递增和递减操作与执行语句的优先级相等,因此整个语句都会从左至右被求值。所以,执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。

后置型:执行前置递增和递减操作时,变量的值都是在语句被求值以后改变的。

所有这4个操作符对任何值都适用,也就是他们不仅适用于整数,还可以用于字符串,布尔值,浮点数值,和对象。在应用于不同的值时,递减和递增操作符遵循以下规则:

  • 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行操作。
  • 在应用于一个不包含有效数字字符的字符串时,将其变为NaN,再进行操作。
  • 在应用于一个true或者false的布尔值时,将其转换为0或1,再执行操作。
  • 浮点数等同于普通数值。
  • 在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。如果结果值为NaN,则再调用toString()方法。
2.一元加和减操作符

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

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

一元减操作符应用于数值时,该值会变成负数。

在应用于非数值时,等同于一元加。

2.位运算符

位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值,然后再进行位操作。

  • 按位非(~)
  • 按位与(&)
  • 按位或(|)
  • 按位异或(^)
  • 左移(<<)
  • 有符号的右移(>>)
  • 无符号右移(>>>)
3.布尔操作符
1.逻辑非(!)

可以应用于任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作符转换为一个布尔值,然后对其求反。如果使用两次逻辑非,就相当于Boolean()函数。

2.逻辑与(&&)

逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,它遵循下列规则:

  • 如果第一个操作数是对象,则返回第二个操作数。
  • 如果第二个操作数是对象,则只有第一个为true的时候返回。
  • 如果第一个操作符为true,返回第二个操作符,否则,返回第一个操作符。
3.逻辑或(||)

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

  • 如果第一个操作符为true,就返回第一个操作符,否则,返回第二个操作符。
4.乘性操作符
1.乘法(*)

乘法操作符用于计算两个数值的乘积。在处理特殊值的情况下,乘法操作符遵循下列特殊的规则:

  • 如果操作符都是数字,则执行常规运算。
  • NaN乘以任何数都是NaN
  • Infinity与0相乘,则结果是NaN;
  • Infinity与f非0数值相乘,则结果是Infinity或-Infinity,取决于有符号操作数的符号;
  • Infinity与Infinity相乘,则结果是Infinity;
  • 如果有一个操作符不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则;
2.除法(/)
  • 如果操作符都是数字,则执行常规运算。
  • 如果有一个操作数是NaN,则结果是NaN;
  • 0除以0,则结果是NaN;其他数除以0,为Infinity或-Infinity.
  • 如果除数是Infinity,则结果是Infinity或-Infinity;
  • 如果有一个操作符不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则;
3.求模(%)

求模即取余

  • 如果操作符都是数字,则执行常规运算。
  • 如果被除数是无穷大值而除数是有限大的数值,则结果是NaN;
  • 除数为0,则结果是NaN;
  • Infinity与Infinity相除,则结果是NaN;
  • 如果被除数是有限大的数值而除数是无穷大的数值,则结果就是被除数;
  • 被除数是0,则结果是0;
  • 如果有一个操作符不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则;
5.加性操作符
1.加法

字符串是特殊情况

  • 如果有一个操作数是NaN,则结果是NaN;
  • Infinity加Infinity,则结果是Infinity;
  • -Infinity加-Infinity,则结果是-Infinity;
  • Infinity加-Infinity,则结果是NaN;
  • +0加-0,则结果是+0;
  • 如果有一个操作数不是数字,也不是字符串,则调用Number()函数转换为数字;

如果有一个是字符串

  • 直接将两个数拼接起来;
2.减法
  • 如果有一个操作数是NaN,则结果是NaN;
  • Infinity减Infinity,则结果是NaN;
  • -Infinity减-Infinity,则结果是NaN;
  • Infinity减-Infinity,则结果是Infinity;
  • +0减-0,则结果是+0;
  • 如果有一个操作数不是数字,也不是字符串,则调用Number()函数转换为数字;
6.关系操作符

小于(<),大于(>),小于等于(<=),和大于等于(>=)这几个值都用于对两个值进行比较,返回布尔值。

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

相等和不相等:先转换再比较。==和!=

  • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值,false为0,true为1;
  • 如果有一个操作数是字符串,另一个操作数是数值,则在比较相等性之前先将字符串转换为数值。
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;

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

  • null和undefined是相等的;
  • 要比较相等性之前,不能将null和undefined转换为其他任何值;
  • NaN不等于NaN;
  • 如果两个操作数都是对象,则比较它们是不是同一个对象;

全等和不全等

除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没什么区别。

8.条件操作符

var max = (num1 > num2) ? num1 : num2;

9.赋值运算符
  • 乘/赋值(*=);
  • 除/赋值(/=);
  • 模/赋值(+=);
  • 加/赋值(+=);
  • 减/赋值(-=);
  • 左移/赋值(<<=);
  • 有符号右移/赋值(>>=);
  • 无符号右移/赋值(>>>=);
10.逗号操作符

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