1. 概述
2. 加法运算符
2.1 基本规则
2.2 对象的相加
3. 余数运算符 % 正负看第一个运算字 可以用绝对值函数
4. 自增和自减运算符 ++ — ++x 2 y++1
5. 数值运算符,负数值运算符 + – 作用是转为数值 number 一样
6. 指数运算符 232 512 先算了 3 2
7. 赋值运算符 =
除了加法 其他都转为数值在运算
1. 概述
加法运算符:x + y
减法运算符:x – y
乘法运算符:x * y
除法运算符:x / y
指数运算符:x ** y
余数运算符:x % y
自增运算符:++x 或者 x++
自减运算符:–x 或者 x–
数值运算符:+x
负数值运算符:-x
2. 加法运算符
加法运算符是在运行时决定,到底是执行相加,还是执行连接。也就是说,运算子的不同,导致了不同的语法行为,这种现象称为“重载”(overload)
由于加法运算符存在重载,可能执行两种运算,使用的时候必须很小心。
‘3’ + 4 + 5 // “345”
3 + 4 + ‘5’ // “75”
上面代码中,由于从左到右的运算次序,字符串的位置不同会导致不同的结果
2.2 对象的相加
运算子是对象,必须先转成原始类型的值,然后再相加。
对象转成原始类型的值,规则如下。
首先,自动调用对象的 valueOf 方法。
var obj = {p: 1};
obj.valueOf() // { p: 1}
一般来说,对象的 valueOf 方法总是返回对象自身,这时再自动调用对象的 toString 方法,将其转为字符串。
var obj = {p: 1};
obj.valueOf().toString() // “[object Object]”
对象的 toString 方法默认返回[object Object],所以就得到了最前面那个例子的结果。
知道了这个规则以后,就可以自己定义 valueOf 方法或 toString 方法,得到想要的结果。
var obj = {
valueOf: function () {
return 1;
}
};
obj + 2 // 3
这里有一个特例,如果运算子是一个 Date 对象的实例,那么会优先执行 toString 方法。
var obj = new Date();
obj.valueOf = function () { return 1};
obj.toString = function () { return ‘hello’};
obj + 2 // “hello2”
3. 余数运算符 % 正负看第一位
所以,为了得到负数的正确余数值,可以先使用绝对值函数。
// 错误的写法
function isOdd(n) {
return n % 2 === 1;
}
isOdd(-5) // false
isOdd(-4) // false
// 正确的写法
function isOdd(n) {
return Math.abs(n % 2) === 1;
}
isOdd(-5) // true
isOdd(-4) // false
4. 自增和自减运算符 ++ — ++x 2 y++1
5. 数值运算符,负数值运算符 + – 作用是转为数值 number 一样
数值运算符的作用在于可以将任何值转为数值
+true // 1
+[] // 0
+{} // NaN
var x = 1;
-x // -1
-(-x) // 1
6. 指数运算符 232 512 先算了 3 2
7. 赋值运算符 =
// 等同于 x = x + y
x += y
// 等同于 x = x – y
x -= y
// 等同于 x = x * y
x *= y
// 等同于 x = x / y
x /= y
// 等同于 x = x % y
x %= y
// 等同于 x = x ** y
x **= y
下面是与位运算符的结合(关于位运算符,请见后文的介绍)。
// 等同于 x = x >> y
x >>= y
// 等同于 x = x << y
x <<= y
// 等同于 x = x >>> y
x >>>= y
// 等同于 x = x & y
x &= y
// 等同于 x = x | y
x |= y
// 等同于 x = x ^ y
x ^= y
这些复合的赋值运算符,都是先进行指定运算,然后将得到值返回给左边的变量。