JavaScript类型转换(上):理解 Primitive 类型的转换逻辑😎

150 阅读4分钟

引言

众所周知,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
  • nullnull 值也会被转换为 false
  • undefined:未定义的值同样会被视为 false
  • NaNNaN也会被转换为 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类型

  1. 从布尔值转换

    • true 转换为 1
    • false 转换为 0
    console.log(Number(true)); // 1
    console.log(Number(false)); // 0
    
  2. 从字符串转换

    • ""(空字符串)转换为 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
    
  3. nullundefined 转换

    • null 转换为 0
    • undefined 转换为 NaNundefined 在数值上下文中没有转成一个特定数字的含义,所以为 NaN
    console.log(Number(null)); // 0
    console.log(Number(undefined)); // NaN
    
  4. NaN 和特殊数值转换:

    • NaN 保持不变,仍然是 NaN
    • 特殊数值如 Infinity-Infinity 也保持不变
    console.log(Number(NaN)); // NaN
    console.log(Number(Infinity)); // Infinity
    console.log(Number(-Infinity)); // -Infinity
    
  5. 从数组转换

    • 如果数组为空,则转换为 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 类型转化

  1. nullundefined 和 布尔值 (boolean)

    • nullundefinedtruefalse 被转换成字符串时,它们分别会变成字符串"null""undefined""true""false"
    console.log(String(null));      // "null"
    console.log(String(undefined)); // "undefined"
    console.log(String(true));  // "true"
    console.log(String(false)); // "false"
    
  2. 数字 (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() 函数进行检查或者使用默认值。

---欢迎各位点赞、收藏、关注,如果觉得有收获或者需要改进的地方,希望评论在下方,不定期更新

0bae-hcffhsw0416753.gif