遵循以下规则:
- 如果两个操作数都是数字,直接相加
- 如果两个操作数都是字符串,直接执行字符串连接
- 如果有一个操作数是对象的话,Date对象直接调用toString()方法;其他对象先检查是否有valueof方法,若有,调用valueof方法,返回的值若是原始值,那就返回这个值,否则调用toString方法。
- 完成对象的转换后,如果其中一个操作数是字符串的话,则另一个操作数也会转换为字符串,然后进行字符串的连接操作。否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。
在 JavaScript 中,一共有两种类型的值:
类型 | 值 |
---|---|
原始值(primitives) | undefined、null、boolean、number、string |
对象值(objects) | 除了原始值外,其他的所有值都是对象类型的值,包括数组(array)和函数(function)。 |
原始值转换成数字
参数 | 结果 |
---|---|
undefined | NaN |
null | +0 |
boolean | true被转换为1,false转换为+0 |
number | 无需转换 |
string | 由字符串解析为数字。例如,"324"被转换为324 |
原始值转换为字符串
参数 | 结果 |
---|---|
undefined | "undefined" |
null | "null" |
boolean | "true" 或者 "false" |
number | 数字作为字符串。比如,"1.765" |
string | 无需转换 |
对于+操作符来说,两个操作数要么都为字符串,要么全部为数字
console.log(true + 123);
console.log(true + '123');
console.log(new String('1') + 123);
console.log(new Number(12) + 123);
console.log(undefined + '123');
console.log(undefined + 123);
console.log(null + '123');
console.log(null + 123);
//下面模拟了对象的转化过程
var o1 = {
toString: function() {
return 'str';
},
valueOf: function() {
return {}
}
};
console.log(o1 + '');
var o2 = {
toString: function() {
return 'str';
},
valueOf: function() {
return 'valueOf'
}
};
console.log(o2 + '');
结果是: