JavaScript 不同类型数据运算时的隐式转换规则
本文详细解析JavaScript中五种基础数据类型在参与加减运算时的隐式转换规则。重点阐述字符串与数字相加生成字符串的机制、对象参与运算时valueOf与toString的调用优先级,以及Date对象的特殊处理逻辑,并通过代码示例说明一元加号对字符串转数字的影响。
JavaScript基础数据类型概述
JavaScript中的基础数据类型包含string、number、boolean、null和undefined五种。其中,常用于计算或比较操作的是前三种。不同类型的基础数据之间进行转换时,遵循特定的规则,而非随机发生。
基础数据转换规则
基础数据之间的转换
| 原始数据类型 | 目标类型Number |
| undefined | NaN |
| null | 0 |
| false | 0 |
| true | 1 |
| 数字串 | 相应的数字 |
| 不能转化的字符串 | NaN |
| 原始数据类型 | 目标类型String |
| undefined | undefined |
| null | null |
| false | false |
| true | true |
| 数字 | 数字字符串 |
在涉及不同类型基础数据的加法运算中,转换逻辑如下:首先尝试将数据转换为number类型;如果运算中包含string类型数据,则最终结果会转换为string类型。
代码如下:
null + undefined // 0+NaN
null + false // 0+0
1 + true // 1+1
1 + '1' //'11';数字与字符串相加结果是字符串
1 + 2 + '3' //'33';(1+2)的结果然后与'3'相加;这里要把每一步加法单独拆开来看,否则变成和下面一样的结果了.
1 + (2 +'3') //'123';先运算2+'3',然后1+'23'
's' + null //'snull'
's' + undefined // 'sundefined'
's' + true //'strue'
1 + true + undefined + 's' // 1+1+NaN+'s'=2+NaN+'s'=NaN+'s'=NaNs
对象参与运算的转换机制
对象参与加减法运算
当对象参与基础类型数据的运算时,会先将其转换为基础类型。转换过程优先调用对象的valueOf方法;若返回值不是基础类型,则继续调用toString方法;若仍非基础类型,则抛出错误。需要注意的是,Date对象的转换逻辑与此相反。
代码如下:
//为了便于观察重写Date的toString方法和valueOf方法
Date.prototype.toString = function(){
return 1;
}
Date.prototype.valueOf = function(){
return 2;
}
var a = new Date,
b = new Date;
a + b; // 调用toString,1 + 1,结果是2
// 再重写toString方法
Date.prototype.toString = function(){
return {};
}
var c = new Date,
d = new Date;
c + d; // 调用toString方法返回的不是基础类型,再调用valueOf,2 + 2,结果是4
// 再重写valueOf方法
Date.prototype.valueOf = function(){
return {};
}
var e = new Date,
f = new Date;
e + f; // 报错
将上述示例替换为Object或其他类型,可获得相应结果,区别在于先调用valueOf,再调用toString。
一元加号的字符串转数字功能
'+'号的神奇功效
在数据前添加一元加号‘+',可将字符串转换为数字类型。
代码如下:
+'1'+1 // 2
+'s'+2 // NaN注:第一次,格式不好,纰漏多,欢迎大家拍砖
JS表单序列化出现中文乱码怎么解决
2026-11-05 17:21:05
JS代码在线格式化工具推荐:无需安装快速美化
2026-11-05 17:17:49
WebStorm内置JS代码格式化功能怎么用
2026-11-05 10:10:47
在线JS代码格式化与混淆压缩工具推荐及使用指南
2026-11-03 20:31:53
CodePen、JSFiddle与RunJS对比:哪款在线JavaScript编辑器更好用
2026-11-03 18:52:45
