面试题答案
一键面试优化性能的最佳实践
- 显式类型转换:在进行数值和字符串混合运算时,尽量使用显式类型转换函数,避免 JavaScript 隐式类型转换带来的不确定性和性能损耗。
- 将字符串转换为数值:使用
Number()
函数或一元+
运算符。例如:
- 将字符串转换为数值:使用
let str = '123';
let num1 = Number(str);
let num2 = +str;
- 将数值转换为字符串:使用
toString()
方法或String()
函数。例如:
let num = 456;
let str1 = num.toString();
let str2 = String(num);
- 缓存类型转换结果:如果在循环或频繁调用的函数中需要进行类型转换,缓存转换后的结果,避免重复转换。例如:
function processArray(arr) {
let numArr = [];
for (let i = 0; i < arr.length; i++) {
if (!numArr[i]) {
numArr[i] = Number(arr[i]);
}
// 对 numArr[i] 进行数值相关操作
}
return numArr;
}
- 减少不必要的运算:在进行混合运算前,提前判断数据类型,避免不必要的类型转换。例如:
function add(a, b) {
if (typeof a ==='string' && typeof b ==='string') {
return a + b;
} else if (typeof a === 'number' && typeof b === 'number') {
return a + b;
} else if (typeof a ==='string') {
return Number(a) + b;
} else {
return a + Number(b);
}
}
类型转换陷阱及解决方案
- 字符串与数值比较陷阱:在使用
==
进行比较时,JavaScript 会进行隐式类型转换,可能导致不符合预期的结果。例如:
console.log(0 == ''); // true
console.log(1 == '1'); // true
console.log(null == undefined); // true
解决方案:使用严格相等运算符 ===
,它不会进行类型转换,直接比较值和类型。例如:
console.log(0 === ''); // false
console.log(1 === '1'); // false
console.log(null === undefined); // false
- 加法运算符的隐式类型转换陷阱:当
+
运算符两边有一个是字符串时,会进行字符串拼接而不是数值加法。例如:
let result1 = 1 + '2'; // '12'
let result2 = '3' + 4; // '34'
解决方案:确保参与加法运算的数据类型一致,如果需要数值运算,先进行显式类型转换。例如:
let num1 = 1;
let str1 = '2';
let result3 = num1 + Number(str1); // 3
parseInt()
精度问题:parseInt()
函数在处理字符串转换为整数时,可能存在精度问题,尤其是在处理八进制或十六进制字符串时。例如:
let num4 = parseInt('08'); // 在非严格模式下,'08' 会被当作八进制字符串,返回 0(八进制中没有 8)
解决方案:为 parseInt()
函数提供第二个参数指定基数。例如:
let num5 = parseInt('08', 10); // 返回 8