算术运算符以数值（字面量或变量）作为其操作数，并返回一个单个数值。标准算术运算符是加法（+），减法（ - ），乘法（*）和除法（/）。

## 加法 (+)

加法运算符的作用是数值求和，或者字符串拼接。

### 语法

    运算符: x + y

### 示例

    // Number + Number -> 数字相加
    1 + 2 // 3

    // Boolean + Number -> 数字相加
    true + 1 // 2

    // Boolean + Boolean -> 数字相加
    false + false // 0

    // Number + String -> 字符串连接
    5 + "foo" // "5foo"

    // String + Boolean -> 字符串连接
    "foo" + false // "foofalse"

    // String + String -> 字符串连接
    "foo" + "bar" // "foobar"

## 减法 (-)

减法运算符使两个操作数相减，结果是它们的差值。

### 语法

    运算符: x - y

### 示例

    5 - 3 // 2
    3 - 5 // -2
    "foo" - 3 // NaN

## 除法 (/)

除法运算符的结果是操作数的商 ，左操作数是被除数，右操作数是除数。

### 语法

    运算符: x / y

### 示例

    1 / 2      // 在 JavaScript 中返回 0.5
    1 / 2      // 在 Java 中返回 0
    // （不需要数字是明确的浮点数）

    1.0 / 2.0  // 在 JavaScript 或 Java 中都返回 0.5

    2.0 / 0    // 在 JavaScript 中返回 Infinity
    2.0 / 0.0  // 同样返回 Infinity
    2.0 / -0.0 // 在 JavaScript 中返回 -Infinity

## 乘法 (*)

乘法运算符的结果是操作数的乘积。

### 语法

    运算符: x * y

### 示例

    2 * 2 // 4
    -2 * 2 // -4
    Infinity * 0 // NaN
    Infinity * Infinity // Infinity
    "foo" * 2 // NaN

## 求余 (%)

求余运算符返回第一个操作数对第二个操作数的模，即 `var1` 对 `var2` 取模，其中 `var1` 和 `var2` 是变量。取模功能就是 `var1` 除以 `var2` 的整型余数。 以前有个提议，在ECMAScript未来的版本中，可能会有一个获取实际模的运算符。

### 语法

    运算符: var1 % var2

### 示例

    12 % 5 // 2
    -1 % 2 // -1
    NaN % 2 // NaN
    1 % 2 // 1
    2 % 3 // 2
    -4 % 2 // -0
    5.5 % 2 // 1.5

## 幂 (**)

幂运算符返回第一个操作数做底数，第二个操作数做指数的乘方。即， `var1``var2` ，其中 `var1` 和 `var2` 是其两个操作数。幂运算符是右结合的。`a ** b ** c` 等同于 `a ** (b ** c)`。

### 语法

    运算符: var1 ** var2

### 注解

包括 PHP 或 Python 等的大多数语言中，都包含幂运算符（一般来说符号是 ^ 或者 **）。这些语言中的幂运算符有着比其他的单目运算符（如一元 + 或一元 - ）更高的优先级。但是作为例外，在 Bash 中，** 运算符被设计为比单目运算符优先级更低。在最新的 JavaScript（ES2016） 中，禁止使用带歧义的幂运算表达式。比如，底数前不能紧跟一元运算符（`+/-/~/!/delete/void/typeof`）

    -2 ** 2;
    // 在 Bash 中等于 4 ，而在其他语言中一般等于 -4
    // 在 JavaScript 中是错误的，因为这会有歧义

    -(2 ** 2);
    // -4 在JavaScript中能够明显体现出作者的意图

### 示例

    2 ** 3 // 8
    3 ** 2 // 9
    3 ** 2.5 // 15.588457268119896
    10 ** -1 // 0.1
    NaN ** 2 // NaN

    2 ** 3 ** 2 // 512
    2 ** (3 ** 2) // 512
    (2 ** 3) ** 2 // 64

如果要反转求幂表达式结果的符号，你可以采用这样的方式：

    -(2 ** 2) // -4

强制求幂表达式的基数为负数：

    (-2) ** 2 // 4

## 递增 (++)

递增运算符为其操作数增加1，返回一个数值。

- 如果后置（postfix）使用，即运算符位于操作数的后面（如 x++），那么将会在递增前返回数值。
- 如果前置（prefix）使用，即运算符位于操作数的前面（如 ++x），那么将会在递增后返回数值。

### 语法

    运算符: x++ 或者 ++x

### 示例

    // 后置
    var x = 3;
    y = x++;
    // y = 3, x = 4

    // 前置
    var a = 2;
    b = ++a;
    // a = 3, b = 3

## 递减 (--)

递减运算符将其操作数减去1，并返回一个数值。

- 如果后置使用（如 x--），则在递减前返回数值。
- 如果前置使用（如 --x），则在递减后返回数值。

### 语法

    运算符: x-- or --x

### 示例

    // 后置
    var x = 3;
    y = x--; // y = 3, x = 2

    // 前置
    var a = 2;
    b = --a; // a = 1, b = 1

## 一元负号 (-)

一元负号运算符位于操作数前面，并转换操作数的符号。

### 语法

    运算符: -x

### 示例

    var x = 3;
    y = -x; // y = -3, x = 3

## 一元正号 (+)

一元正号运算符位于其操作数前面，计算其操作数的数值，如果操作数不是一个数值，会尝试将其转换成一个数值。 尽管一元负号也能转换非数值类型，但是一元正号是转换其他对象到数值的最快方法，也是最推荐的做法，因为它不会对数值执行任何多余操作。它可以将字符串转换成整数和浮点数形式，也可以转换非字符串值 `true`，`false` `和` `null`。小数和十六进制格式字符串也可以转换成数值。负数形式字符串也可以转换成数值（对于十六进制不适用）。如果它不能解析一个值，则计算结果为 NaN。

### 语法

    运算符: +x

### 示例

    +3     // 3
    +"3"   // 3
    +true  // 1
    +false // 0
    +null  // 0
    +function(val){ return val;} //NaN

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript 1st Edition (ECMA-262) | Standard | Initial definition.
ECMAScript 5.1 (ECMA-262) | Standard | Defined in several sections of the specification: Additive operators, Multiplicative operators, Postfix expressions, Unary operators.
ECMAScript 2015 (6th Edition, ECMA-262) | Standard | Defined in several sections of the specification: Additive operators, Multiplicative operators, Postfix expressions, Unary operators.
ECMAScript 2016 (ECMA-262) | Standard | Added Exponentiation operator.
ECMAScript 2017 (ECMA-262) | Standard |
ECMAScript Latest Draft (ECMA-262) | Draft |

## 浏览器兼容

The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

| Desktop | Mobile | Server
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js
Addition (`+`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Decrement (`--`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Division (`/`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Exponentiation (`**`) | Chrome Full support 52 | Edge Full support 14 | Firefox Full support 52 | IE No support No | Opera Full support Yes | Safari Full support 10.1 | WebView Android Full support 51 | Chrome Android Full support 52 | Edge Mobile Full support 14 | Firefox Android Full support 52 | Opera Android Full support Yes | Safari iOS Full support 10.1 | Samsung Internet Android Full support 6.0 | nodejs Full support 7.0.0 Full support 7.0.0 Full support 6.5.0 Disabled Disabled From version 6.5.0: this feature is behind the `--harmony` runtime flag.
Increment (`++`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Multiplication (`*`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Remainder (`%`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Subtraction (`-`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Unary negation (`-`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes
Unary plus (`+`) | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes

### Legend

Full support
  Full support
No support
  No support
User must explicitly enable this feature.
  User must explicitly enable this feature.

## 相关链接

- 赋值运算符