算术运算符

加减乘除

  • 加法运算符x + y
  • 减法运算符x - y
  • 乘法运算符x * y
  • 除法运算符x / y

    指数

  • 指数运算符x ** y

    余数

    余数运算符(%)返回前一个运算子被后一个运算子除,所得的余数。

    1. 12 % 5 // 2
    2. 8 % 3 // 2
    3. //运算结果的正负号由第一个运算子的正负号决定。
    4. -1 % 2 // -1

    自增自减

    自增和自减运算符,是一元运算符,只需要一个运算。它们的作用是将运算子首先转为数值,然后加上1或者减去1。它们会修改原始变量。 ```javascript var x = 1; ++x // 2 x // 2

—x // 1 x // 1

var x = 1; var y = 1;

x++ // 1 x // 2 ++y // 2

  1. <a name="VSbQQ"></a>
  2. ### 求值
  3. 数值运算符(`+`)作用在于可以将任何值转为数值(与`Number`函数的作用相同)
  4. ```javascript
  5. +true // 1
  6. +[] // 0
  7. +{} // NaN

负数

负数值运算符(-),也同样具有将一个值转为数值的功能,只不过得到的值正负相反。连用两个负数值运算符,等同于数值运算符。

  1. var x = 1;
  2. -x // -1
  3. -(-x) // 1

上面代码最后一行的圆括号不可少,否则会变成自减运算符。

赋值

用于给变量赋值。最常见的赋值运算符,当然就是等号(=)。

  1. // 将 1 赋值给变量 x
  2. var x = 1;
  3. // 将变量 y 的值赋值给变量 x
  4. var x = y;
  5. 变形
  6. x += y // 等同于 x = x + y
  7. x -= y // 等同于 x = x - y
  8. x *= y // 等同于 x = x * y
  9. x /= y // 等同于 x = x / y
  10. x %= y // 等同于 x = x % y
  11. x **= y // 等同于 x = x ** y

且&&

运算规则是:
如果第一个运算子的布尔值true,则返回第二个运算子的值(注意是值,不是布尔值);
如果第一个运算子的布尔值false,则直接返回第一个运算子的值,且不再对第二个运算子求值。
可以判断多个&&运算,如果都是 ture 返回最后一个运算的值。如果其中一个是 false 直接返回当前值

  1. 't' && '' // ""
  2. 't' && 'f' // "f"
  3. 't' && (1 + 2) // 3
  4. '' && 'f' // ""
  5. '' && '' // ""
  6. var x = 1;
  7. (1 - 1) && ( x += 1) // 0
  8. x // 1
  9. //因为第一个表达式的布尔值是 false,所以返回第一个表达式的值
  10. 此时后面的表达式不会执行,即 x 的值不会被改变 即短路逻辑

或||

运算规则是:
如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;
如果第一个运算子的布尔值为false,则返回第二个运算子的值。
可以判断多个 || 运算,如果都是 fasle 返回最后一个运算的值。如果其中一个是 ture 直接返回当前值

  1. 't' || '' // "t"
  2. 't' || 'f' // "t"
  3. '' || 'f' // "f"
  4. '' || '' // ""
  5. var x = 1;
  6. (1 - 1) || ( x += 1)
  7. x // 2
  8. //上面代码中,前面的运算值为 0 是 fasle,所以会输出后面的运算结果

或运算符常用于为一个变量设置默认值(保底值)。

非!

null undefined “” 0 NaN false 这六个值取反是 ture,其他都是 false

三元条件运算符(?:)

三元条件运算符由问号(?)和冒号(:)组成,分隔三个表达式。
它是 JavaScript 语言唯一一个需要三个运算子的运算符。
如果第一个表达式的布尔值为true,则返回第二个表达式的值,否则返回第三个表达式的值。

  1. 't' ? 'hello' : 'world' // "hello"
  2. 0 ? 'hello' : 'world' // "world"

比较运算符

  • > 大于运算符
  • < 小于运算符
  • <= 小于或等于运算符
  • >= 大于或等于运算符
  • == 相等运算符
  • === 严格相等运算符
  • != 不相等运算符
  • !== 严格不相等运算符

运算符隐藏的类型转换,会带来一些违反直觉的结果。最好只使用严格相等运算符(===)。

二进制运算符

或与否

二进制位运算符用于直接对二进制位进行计算,一共有7个。

  • 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1
  • 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。
  • 二进制否运算符(not):符号为~,表示对一个二进制位取反。
  • 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。
  • 左移运算符(left shift):符号为<<,详见下文解释。
  • 右移运算符(right shift):符号为>>,详见下文解释。
  • 头部补零的右移运算符(zero filled right shift):符号为>>>,详见下文解释。

这些位运算符直接处理每一个比特位(bit),所以是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能使用它们,否则会使代码难以理解和查错。

运算顺序

运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。
运算符优先级 | MDN里面的运算顺序多达 20 种。
()里面的优先级最高,考虑到以后协同工作和代码的可读性只记这一种。