JS中的操作符与其他语言大体上是相似的,这里总结一些需要注意的地方.

一元操作符

  • 一元加(+) 在数值前面放置+对数值没有任何影响,对非数值使用+,具有Number()转型函数的效果.
  • 一元减(-)操作符 应用于数值,该值会变成负数.应用于非数值,会先遵循与+相同的规则,然后转换为负数

布尔操作符

  • 逻辑非(!) 在对非Boolean类型的数据使用逻辑非,会先转换为布尔值,再求反。 所以使用两个!速度会模拟Boolean()的行为.
  • 逻辑与(&&) 在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值,遵循以下规则:
    1. 第一个是对象,返回第二个操作数
    2. 第二个是对象,则只有第一个是true时才返回该对象
    3. 第一个是null, undefined, NaN,则返回相应的null, undefined, NaN
  • 逻辑或(||) 在有一个操作数不是布尔值的情况下,不一定会返回布尔值,遵循以下规则:
    1. 第一个是对象,则返回第一个操作数
    2. 第一个求值结果为false,则返回第二个操作数
    3. 两个操作数都是null, undefined, NaN,则返回相应的null, undefined, NaN

乘性操作符

在操作数不为数值的时候,会执行自动的类型转换.

  • 乘法() 除了“遵循NaN参与的任何操作,结果都是NaN”*之外,其他情况大部分都是正常值或者Infinity-Infinity. 只有一种情况: Infinity与0相乘,结果为NaN

  • 除法(/) 有两种情况是NaN
    1. 零被零除–> NaN
    2. Infinity 被 Infinity 除–> NaN
  • 取模(%)
    1. 被除数无穷大而除数有限大,则为NaN
    2. 被除数无穷大而除数为0,则为NaN
    3. Infinity被Infinity除,则为NaN
    4. 被除数有限大而除数无穷大,结果为被除数
    5. 被除数为0,结果为0

加性操作符

  • 加法
    1. Infinity加-Infinity,结果为NaN
    2. 有一个是字符串,则另一个数转换为字符串,然后拼接
    3. 如果有一个操作数是对象或者数值或布尔值,另一个操作数是字符串,则将非字符串转换为字符串,对于undefined和null,使用String()转换为字符串
  • 减法
    1. Infinity - Infinity = NaN
    2. -Infinity - (-Infinity) = NaN
    3. 有一个操作数是数值,另一个操作数为非数值,则转换为数值.

总结:加法中,如果有一个字符串,则优先将另一个转换为字符串,减法中,如果有一个是数值,则优先将另一个转换为数值

关系操作符

关系操作符有小于(<),大于(>),小于等于(<=)和大于等于(>=),优先比较的数据类型是数值,返回布尔值

  1. 两个操作数都是数值,则比较数值大小
  2. 两个操作数都是字符串,则比较第一个字符的编码
  3. 有一个数值,将另一个转换为数值,进行比较
  4. 注意:比较时 null转换为0 ,undefined转换为NaN

相等操作符

主要分为相等(==)和全等(===),区别在于相等操作符操作之前会进行类型的转换,全等操作符不会进行类型转换。 相等操作符优先进行数值的比较

  1. 一个操作数是字符串,另一个是数值,则转换为数值再比较
  2. 一个是对象,则调用valueOf()方法,再比较
  3. 在比较相等性之前,null和undefined不能转换为其他任何值,而在关系比较时,null会转换为0,undefined会转换为NaN 如下
      var a = null;
      console.log(a == 0);       //false,因为null不能转化为其他
      console.log(a >= 0);       // true, 因为在关系操作符中,null转换为0
      console.log(a <= 0);       // true, 因为在关系操作符中,null转换为0
    
  4. 在对象的比较中,只有两个操作数指向同一个对象,才会返回true
  5. 全等(===)操作符则两个操作数必须完全相同才会返回true

条件操作符

就是常见的expression ? true_value : false_value

赋值操作符

  • *=
  • /=
  • +=
  • -=
  • %=
  • <<=
  • >>=
  • >>>= 这些操作符只是简单而已,没有性能上的提升

逗号操作符

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

var num = 1,num2 = 2,num3 = 3;

还可以用于赋值,在用于赋值时,总会返回最后一项

var num = (5,4,3,2,0);    // num的值为0