MST

星途 面试题库

面试题:JavaScript类型转换专家难度题

在JavaScript的严格模式下,实现一个`safeAdd`函数,该函数接收两个参数,可以是任意JavaScript数据类型。函数要能够正确处理各种类型转换情况,保证相加结果符合预期,同时要避免JavaScript类型转换中的常见陷阱,如`NaN`、`Infinity`等特殊值的影响,并考虑性能优化。请详细阐述实现思路和关键代码。
32.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 类型检查:首先要检查传入的两个参数类型,对于非数字类型需要进行合理的转换。
  2. 特殊值处理:对于NaNInfinity等特殊值,要特殊处理,避免产生不符合预期的结果。
  3. 类型转换:根据JavaScript的类型转换规则,将不同类型的值转换为数字进行加法运算。
  4. 性能优化:尽量减少不必要的类型检查和转换,提高函数执行效率。

关键代码

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;
}