js数据类型转换(一) -- 显示转换与隐式转换

151 阅读7分钟

在 JavaScript 面试中,数据类型转换是一个高频考点。深入理解其原理和各种场景下的转换规则,不仅能帮助我们顺利通过面试,更是写出高质量、健壮代码的关键。今天,就让我们来全面剖析 JavaScript 中的数据类型转换。

一、隐式数据类型转换

(一)自动将数字转换为字符串

在 JavaScript 中,当使用 + 运算符进行字符串拼接时,如果操作数一侧为字符串,另一侧为数字,数字会自动转换为字符串进行拼接。这是因为 + 运算符在这种情况下具有双重功能,既可以进行数字相加,也可以进行字符串拼接。例如:

console.log("今年菇凉" + 18); // 今年菇凉18
// 这里,数字 18 被自动转换为字符串,然后与 "今年菇凉" 拼接
console.log("18" + 18); // 1818
// 同样,左边的 "18" 是字符串,右边的数字 18 转换为字符串后进行拼接

(二)表达式中的转换

当表达式包含算术运算符 -*/% 时,如果操作数是字符串形式的数字,JavaScript 会将其转换为数字进行运算。这是为了遵循算术运算的规则,保证运算结果的准确性。例如:

console.log("19" - 18); // 1
// 字符串 "19" 被转换为数字 19,然后与 18 进行减法运算
console.log("19" * 2); // 38
// "19" 转换为 19 后与 2 相乘
console.log("20" / 2); // 10
// 字符串 "20" 转换为数字 20 再除以 2
console.log("20" % 3); // 2
// "20" 转换为 20 对 3 取余

// 以下是字符串数字之间的运算
console.log("19" - "18"); // 1
// 两个字符串数字都转换为数字后相减
console.log("19" * "2"); // 38
// 同理相乘

// 当字符串无法转换为数字时
console.log("你好" * 2); // NaN
// 由于 "你好" 无法转换为数字,乘法运算无法进行,结果为 NaN

(三)++-- 运算符对字符串的转换

对于可转换为数字的字符串,++-- 运算符会先将字符串转换为数字再进行相应运算。这是因为 ++-- 主要用于数字的自增和自减操作。而对于无法转换的字符串,则转换为 NaN。例如:

let a = "19";
let x = "19";
let b = "c";

console.log(++a); // 20
// 字符串 "19" 转换为数字 19,然后自增 1
console.log(x++); // 19
// 先返回 x 的值 19,然后字符串 "19" 转换为数字 19 后自增 1
console.log(--a); // 19
// 自减 1
console.log(b--); // NaN
// 字符串 "c" 无法转换为数字,转换后为 NaN
console.log(b++); // NaN
// 同样因为 "c" 无法转换,结果为 NaN

(四)比较运算符对字符串的转换

在使用比较运算符(如 <> 等)时,会将字符串尝试转换为数字进行比较,无法转换的字符串转换为 NaN 参与比较。这是为了使比较运算在不同数据类型之间具有一致性。例如:

console.log("19" < 20); // true
// 字符串 "19" 转换为数字 19 后与 20 比较,19 小于 20
console.log("19" > "10"); // true
// 两个字符串都转换为数字后比较,19 大于 10

(五)逻辑运算符对字符串的转换

  1. && 运算符:只要有一个操作数为 false,就返回 false,否则返回最后一个值。在逻辑与运算中,JavaScript 会先将操作数转换为布尔值进行判断。例如:
console.log("19" && "10"); // 10
// "19" 转换为布尔值为 true,"10" 也为 true,所以返回最后一个值 "10"
  1. || 运算符:只要有一个操作数为 true,就返回 true,否则返回最后一个值。同样,先转换为布尔值判断。例如:
console.log("19" || ""); // 19
// "19" 转换为布尔值为 true,所以直接返回 "19"

(六)! 运算符对字符串的转换

! 运算符会将字符串转换为布尔值,对于无法转换的字符串,会转换为 NaN。这是逻辑非运算对数据类型的一种处理方式。例如:

console.log(!"你好"); // false
// 字符串 "你好" 转换为布尔值为 true,取反后为 false

(七)== 运算符对字符串的转换

== 运算符两边同时包含字符串和数字时,JavaScript 会将字符串转换为数字进行相等性判断。为避免类型不一致导致的误判,建议使用 ===(严格相等,会判断类型是否相同)或 !==(严格不相等)来判断相等性。例如:

let m = "19";
let n = 19;

console.log(m == n); // true
// 字符串 "19" 转换为数字 19 后与数字 19 相等
console.log(m === n); // false
// 因为类型不同,m 是字符串,n 是数字

二、显式数据类型转换

(一)使用 Number 函数对字符串进行转化

  1. 包含不可转化字符返回 NaN
console.log(Number("12 3")); // NaN
// 字符串中有空格,无法完整转换为数字
console.log(Number("12 - 3")); // NaN
// 包含减号等非数字字符
  1. 格式处理
console.log(Number("001")); // 1
// 删除前导 0
console.log(Number("+001")); // 1
// 删除前面的 + 号
console.log(Number("-001")); // -1
// 保留前面的 - 号
  1. 特殊值转化
console.log(Number('')); // 0
// 空字符串转换为 0
console.log(Number(undefined)); // NaN
console.log(Number("true")); // NaN
// 因为不是有效的数字字符串
console.log(Number(true)); // 1
// 布尔值 true 转换为 1
  1. 对其他对象的转化
// 参数为 Date 对象时
console.log(Number(new Date())); 
// 从 1970 年 1 月 1 日到执行转换时的时间的毫秒数

// 对于函数、包含两个元素以上的数组对象以及除 Date 对象之外的对象
var f = function () {
  console.log("hello world");
};
console.log(Number(f)); // NaN
// 函数转换为 NaN
console.log(Number(global)); // NaN
// (在浏览器环境中 global 通常为 window,这里转换为 NaN)
console.log(Number([1])); // 1
// 单元素数组转换为数组中唯一元素对应的数字
console.log(Number([1, 2])); // NaN
// 多元素数组转换为 NaN

(二)使用 parseInt 函数对字符串进行转化

parseInt 函数主要用于将字符串转换为整型数据,它会从字符串开头解析,只保留整数部分,遇到非数字字符停止解析。例如:

console.log(parseInt("123abc")); // 123
// 提取字符串开头的整数 123,遇到非数字字符 "a" 停止解析

(三)使用 parseFloat 函数对字符串进行转化

parseFloat 函数可以将字符串转换为浮点型数据,会从字符串开头解析符合浮点数格式的部分进行转换,同样遇到非数字字符停止解析。例如:

console.log(parseFloat("3.14abc")); // 3.14
// 提取字符串开头的浮点数 3.14,遇到非数字字符 "a" 停止解析

(四)转换为字符串型

可以使用 toString() 方法或 String() 函数将其他数据类型转换为字符串型。例如:

console.log((123).toString()); // "123"
// 数字 123 调用 toString 方法转换为字符串
console.log(String(123)); // "123"
// 使用 String 函数将数字 123 转换为字符串

在 JavaScript 面试中,对于数据类型转换的考察可能会非常细致。面试官可能会给出一些复杂的表达式,要求你分析其中的数据类型转换过程和最终结果。例如:

console.log(1 + true + null + undefined + "2" + [] + {});
// 分析:
// 1. true 转换为数字 1,null 转换为数字 0,undefined 转换为 NaN
// 2. 1 + 1 + 0 + NaN = NaN
// 3. NaN + "2" = "NaN2"
// 4. "NaN2" + [] = "NaN2" (数组转换为字符串 "")
// 5. "NaN2" + {} = "NaN2[object Object]" (对象转换为字符串 "[object Object]")

或者会询问你在特定场景下应该选择哪种数据类型转换方式,以及为什么。比如在处理用户输入的数字字符串时,使用 Number()parseInt() 的区别,以及可能带来的影响。

深入理解 JavaScript 数据类型转换的各种规则和细节,能够让我们在面试中应对自如,更能在实际开发中写出高质量、无歧义的代码。


更新

js数据类型转换(二) -- 细节拷打前言 大家好 , 我是一名在校大二学生 , 今日整理之前文章 , 发现学习了很多 - 掘金 (juejin.cn)

这篇文章将带你化身为细节哥

无字动图.gif