实现思路
- 类型检查:首先要检查传入的两个参数类型,对于非数字类型需要进行合理的转换。
- 特殊值处理:对于
NaN
、Infinity
等特殊值,要特殊处理,避免产生不符合预期的结果。
- 类型转换:根据JavaScript的类型转换规则,将不同类型的值转换为数字进行加法运算。
- 性能优化:尽量减少不必要的类型检查和转换,提高函数执行效率。
关键代码
function safeAdd(a, b) {
// 检查是否为NaN
if (isNaN(a) || isNaN(b)) {
return NaN;
}
// 检查是否为Infinity
if (a === Infinity || b === Infinity || a === -Infinity || b === -Infinity) {
return NaN;
}
let numA, numB;
// 将a转换为数字
if (typeof a === 'number') {
numA = a;
} else if (typeof a ==='string') {
numA = parseFloat(a);
if (isNaN(numA)) {
return NaN;
}
} else if (typeof a === 'boolean') {
numA = a? 1 : 0;
} else if (typeof a === 'object' && 'valueOf' in a) {
numA = Number(a.valueOf());
if (isNaN(numA)) {
return NaN;
}
} else {
return NaN;
}
// 将b转换为数字
if (typeof b === 'number') {
numB = b;
} else if (typeof b ==='string') {
numB = parseFloat(b);
if (isNaN(numB)) {
return NaN;
}
} else if (typeof b === 'boolean') {
numB = b? 1 : 0;
} else if (typeof b === 'object' && 'valueOf' in b) {
numB = Number(b.valueOf());
if (isNaN(numB)) {
return NaN;
}
} else {
return NaN;
}
return numA + numB;
}