引言
众所周知,JS 在es6 之前分为 Primitive 数据类型(Number、String、Null、Undefined、Boolean) 和 复杂数据类型(Object)两大类,而我们今天就讨论讨论这些数据类型之间的转换。
在阅读这篇文章前,你需要知道:
- +0:从正方向无限接近 0
- -0:从负方向无限接近 0
- Infinity:无限接近正无穷
- -Infinity:无限接近负无穷
- NaN(Not-a-Number):不是一个有效的数字
显式类型转换:
Boolean类型
转换为 false 的情况:
Boolean():直接调用Boolean()且不传递任何参数将返回false。(即默认值为false)+0和-0:正零和负零都会被视为false。"":空字符串("")会被转换为false。null:null值也会被转换为false。undefined:未定义的值同样会被视为false。NaN:NaN也会被转换为false。
console.log(Boolean()); // false
console.log(Boolean(+0)); // false
console.log(Boolean(-0)); // false
console.log(Boolean("")); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined));// false
console.log(Boolean(NaN)); // false
其他所有情况均转换为 true:
其他所有值(包括对象、非空字符串、非零数字等)都会被转换为 true,当然除了值为false。
console.log(Boolean({})); // true
console.log(Boolean([])); // true
console.log(Boolean("hello")); // true
console.log(Boolean(42)); // true
console.log(Boolean(-1)); // true
console.log(Boolean(true)); // true
console.log(Boolean(false)); // false (注意这里)
Number类型
-
从布尔值转换:
true转换为1false转换为0
console.log(Number(true)); // 1 console.log(Number(false)); // 0 -
从字符串转换:
""(空字符串)转换为0- 包含有效数字的字符串(如
"123")转换为相应的数字 - 包含非数字字符的字符串(如
"123abc")转换为NaN(Not-a-Number)
console.log(Number("")); // 0 console.log(Number(" ")); // 0 console.log(Number("123")); // 123 console.log(Number("==123")); // NaN console.log(Number("123abc")); // NaN -
从
null和undefined转换:null转换为0undefined转换为NaN(undefined在数值上下文中没有转成一个特定数字的含义,所以为NaN)
console.log(Number(null)); // 0 console.log(Number(undefined)); // NaN -
从
NaN和特殊数值转换:NaN保持不变,仍然是NaN- 特殊数值如
Infinity和-Infinity也保持不变
console.log(Number(NaN)); // NaN console.log(Number(Infinity)); // Infinity console.log(Number(-Infinity)); // -Infinity -
从数组转换:
- 如果数组为空,则转换为
0 - 如果数组只有一个元素,则尝试将该元素转换为数字
- 如果数组有多个元素,则转换为
NaN
console.log(Number([])); // 0 console.log(Number([1])); // 1 console.log(Number([a])); //报错ReferenceError: a is not defined console.log(Number([1, 2])); // NaN - 如果数组为空,则转换为
String 类型转化
-
null和undefined和 布尔值 (boolean):- 当
null、undefined、true和false被转换成字符串时,它们分别会变成字符串"null"、"undefined"、"true"和"false"。
console.log(String(null)); // "null" console.log(String(undefined)); // "undefined" console.log(String(true)); // "true" console.log(String(false)); // "false" - 当
-
数字 (
number):- 数字值会直接转换为其等价的字符串表示形式。
- 特殊数值如
Infinity,-Infinity, 和NaN也会被转换为对应的字符串"Infinity","-Infinity", 和"NaN"。
console.log(String(42)); // "42" console.log(String(3.14)); // "3.14" console.log(String(Infinity)); // "Infinity" console.log(String(-Infinity)); // "-Infinity" console.log(String(NaN)); // "NaN"
其余特殊转换:
console.log(1 / +0) // Infinity正无穷
console.log(1 / -0) // -Infinity负无穷
// Object.is(a,b)比较a、b是否相对,返还boolean类型
console.log(Object.is(5, 5))
// Object.is()比较方法(比 == 和 === 更严格)
console.log(Object.is(+0, -0)) // false
console.log(+0 === -0) // true
// 隐式转换
// NaN 即:Not a Number(Number类型) =>
console.log(2 * "a", 2 + "a")
console.log(typeof NaN) // number
console.log(NaN === NaN) // NaN 不代表确切的值,所以 NaN 和任何值都不相等,包括它本身
// isNaN() 可以判断一个值是否是 NaN,因为不能通过 == 或 === 来判断一个值是否是 NaN
console.log(isNaN(NaN), isNaN(parseInt("abc"))) // true true
特殊函数 parseInt() 详解:
parseInt 是 JavaScript 中的一个全局函数,用于解析一个字符串并返回一个整数。它根据指定的进制(基数)来解析字符串,直到遇到无法解析的字符为止。
语法:
parseInt(string, radix);
// string: 要被解析的字符串。
// radix (可选): 一个介于 2 到 36 之间的整数,表示string使用的进制,添加后将string转换为十进制。
示例:
console.log(parseInt("10")); // 10
console.log(parseInt("10", 16)); // 16 (十六进制)
console.log(parseInt("17", 8)); // 15 (八进制)
console.log(parseInt("25", 2)); // 5 (二进制)
console.log(parseInt("12.34")); // 12 (小数点后的内容被截断)
console.log(parseInt("12a")); // 12 (非数字部分被忽略)
console.log(parseInt("a12")); // NaN (开头就遇到了非数字字符)
console.log(parseInt(" 42")); // 42 (前导空白符被忽略)
console.log(parseInt("-42")); // -42 (识别负号)
注意事项:
总是提供 radix 参数:为了避免不同环境下的解析差异,建议总是显式地提供 radix 参数。 处理无效输入:对于可能包含无效数字字符的输入,应该考虑如何处理 NaN 值,比如使用 isNaN() 函数进行检查或者使用默认值。
---欢迎各位点赞、收藏、关注,如果觉得有收获或者需要改进的地方,希望评论在下方,不定期更新