运算符
常用的有算术运算符(加减乘除和赋值)、比较运算符和布尔运算符
加法运算符:
加法运算符(+
)是最常见的运算符也是最复杂的,用来求两个数值的和
1 + 1 // 2
JavaScript
允许非数值的相加
true + true // 2
1 + true // 2
上面两代码,第一个是两个布尔值相加,第二个是数值和布尔值相加,这两种情况布尔值都会自动转成数值,然后相加;比较特殊的是如果两个运算子中有一个是字符串,这时非字符串会转成字符串,加法运算符会变成连接运算符,把两个相连接起来
1 + 'a' // "1a"
加法运算符是在运算时决定,到底是执行相加还是执行连接,也就是说,运算子的不同,导致了不同的语法行为,这种现象称为“重载”(overload
)
'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"
加法运算符的规则如下:
- 当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。
- 当一侧为Number类型,另一侧为原始类型,则将原始类型转换为Number类型。
- 当一侧为Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接
- 当两侧都是引用类型,则转化为原始类型的值在相加
除了加法运算符,其他算术运算符(比如减法、乘法和除法)都不会发生重载,它们的规则是:所有运算子一律转为数值,再进行相应的数学运算
1 - '2' // -1
1 * '2' // 2
1 / '2' // 0.5
如果运算子是对象,必选先转成原始类型的值,然后在相加
var obj = {
p: 1 };
obj + 2 // "[object Object]2"
对象转成原始类型的值,规则如下:
首先,自动调用对象的valueOf
方法,一般返回对象自身;
然后在调用对象的toString
方法,将其转为字符串
var obj = {
p: 1 };
obj.valueOf() // {p:1}
obj.valueOf().toString() // "[object Object]"
数值运算符:
数值运算符(+
、-
)只需要一个操作数,它的作用在于可以将任何值转为数值(与Number
函数的作用相同),返回一个新的值,不会改变原始变量的值
+true // 1
+[] // 0
+