Javascript 强制类型转换

217 阅读6分钟

Javascript 强制类型转换

在 JavaScript 中,强制类型转换(Type Coercion)是指自动或者显式地将一种数据类型转换为另一种数据类型。强制类型转换分为两类:隐式类型转换(自动转换)和显式类型转换(强制转换)。

1. 显式类型转换

显式类型转换是程序员手动触发的转换,将一种类型的值转换为另一种类型。JavaScript 提供了一些内置的转换函数来帮助我们进行显式类型转换。常见的转换包括:

a. 转换为数字

可以使用 Number() 函数将其他类型转换为数字:

  • 字符串转数字:
    • Number("123")123
    • Number("123.45")123.45
    • Number(" ")0
    • Number("")0
    • Number("abc")NaN(不可转换)
  • 布尔值转数字:
    • Number(true)1
    • Number(false)0
  • 空值(null 和 undefined)转数字:
    • Number(null)0
    • Number(undefined)NaN
  • 对象转数字:
    • Number({})NaN
    • Number([])0(空数组转数字)
b. 转换为字符串

可以使用 String() 函数将其他类型转换为字符串:

  • 数字转字符串:
    • String(123)"123"
    • String(123.45)"123.45"
    • String(0)"0"
  • 布尔值转字符串:
    • String(true)"true"
    • String(false)"false"
  • 空值(null 和 undefined)转字符串:
    • String(null)"null"
    • String(undefined)"undefined"
  • 对象转字符串:
    • String({})"[object Object]"
    • String([])""(空数组转空字符串)
    • String([1, 2, 3])"1,2,3"
c. 转换为布尔值

可以使用 Boolean() 函数将其他类型转换为布尔值:

  • 空值:
    • Boolean(null)false
    • Boolean(undefined)false
    • Boolean('')false
    • Boolean(0)false
    • Boolean(NaN)false
  • 非空值:
    • Boolean(1)true
    • Boolean('abc')true
    • Boolean([1, 2, 3])true
    • Boolean({})true
d. 转换为对象

通常,只有 nullundefined 类型不能直接转换为对象。对于其他类型,JavaScript 会通过自动调用其 toObject() 方法来进行转换:

  • 数字转对象:
    • Object(123)Number { 123 }
  • 字符串转对象:
    • Object("abc")String { "abc" }
  • 布尔值转对象:
    • Object(true)Boolean { true }

2. 隐式类型转换

隐式类型转换是 JavaScript 在执行运算时,自动将操作数转换为相应的类型。它通常发生在以下几种情况:

a. 加法运算符(+

加法运算符具有特殊的行为:如果操作数之一是字符串,JavaScript 会将另一个操作数转换为字符串类型,然后执行字符串连接:

  • 1 + "1""11"(数字与字符串相加,数字变为字符串)
  • "Hello" + 1"Hello1"(字符串与数字相加,数字变为字符串)
  • true + "true""truetrue"(布尔值与字符串相加,布尔值变为字符串)
b. 非加法运算符(-\*/ 等)

对于其他算术运算符,JavaScript 会将操作数转换为数字:

  • 1 - "1"0(字符串 "1" 会被转换为数字 1)
  • "3" * "2"6(字符串 "3" 和 "2" 会被转换为数字 3 和 2)
  • "3" / "2"1.5(同上)
c. 比较运算符

在比较时,JavaScript 会将两个操作数进行类型转换:

  • 5 == "5"true== 运算符进行类型转换)
  • 0 == falsetrue== 运算符将 false 转换为 0)
  • null == undefinedtruenullundefined 被认为是相等的)
  • null === undefinedfalse=== 严格相等不进行类型转换)
d. 逻辑运算符

逻辑运算符(如 &&||)会将操作数转换为布尔值,且其行为与短路操作相关:

  • false || "hello""hello"false 被转换为布尔值,且返回右侧的字符串)
  • true && "hello""hello"true 被转换为布尔值,且返回右侧的字符串)
e. 条件运算符(? :

条件运算符会将条件表达式转换为布尔值,依据结果返回不同的值:

  • "" ? "yes" : "no""no"(空字符串转换为 false
  • "non-empty" ? "yes" : "no""yes"(非空字符串转换为 true

3. 常见面试题及答案:JavaScript 强制类型转换

1. 面试题:[] == ![] 的结果是什么?为什么?

答案: [] == ![] 的结果是 true

解释:

  • ![]false,因为空数组 [] 是一个对象,布尔值会被转换为 false
  • [] == falsetrue,因为 == 运算符会进行类型转换。空数组在与 false 比较时,JavaScript 会将其转换为一个空字符串 "",然后空字符串与 false 比较时,会被转换为 0,所以最终是 0 == 0,结果为 true
2. 面试题:为什么 [] == [] 的结果是 false

答案: [] == [] 的结果是 false

解释:

  • [] 是一个数组对象,而数组是引用类型。在 JavaScript 中,引用类型是通过地址进行比较的,而不是通过值。
  • 即使两个空数组内容相同,它们在内存中是不同的对象,因此 [] == [] 返回 false,因为它们是不同的对象引用。
3. 面试题:'5' + 1'5' - 1 分别的结果是什么?

答案:

  • '5' + 1 的结果是 "51"
  • '5' - 1 的结果是 4

解释:

  • '5' + 1 使用了加法运算符,由于加法运算符对字符串具有特殊处理(字符串连接),JavaScript 会将 1 转换为字符串,然后执行字符串连接。
  • '5' - 1 使用了减法运算符,JavaScript 会把字符串 '5' 转换为数字 5,然后执行减法运算,结果是 4
4. 面试题:null == undefinednull === undefined 的区别是什么?

答案:

  • null == undefined 返回 true
  • null === undefined 返回 false

解释:

  • == 运算符在比较时会进行类型转换,nullundefined 被认为是相等的。
  • === 运算符是严格相等运算符,不会进行类型转换。由于 nullundefined 是不同的类型,因此返回 false
5. 面试题:Boolean([])Boolean({}) 的值分别是什么?

答案:

  • Boolean([]) 的结果是 true
  • Boolean({}) 的结果是 true

解释:

  • 在 JavaScript 中,所有对象(包括空数组 [] 和空对象 {})都会被转换为 true,即使它们是空的。这是因为 JavaScript 中的所有对象类型在转换为布尔值时都被视为 "真"(truthy)。
6. 面试题:如何将一个值转换为数字类型?

答案:

  • 可以使用

    Number()
    

    函数将值转换为数字类型:

    Number('123') // 123
    Number('') // 0
    Number('abc') // NaN
    
  • 另外,使用

    +
    

    运算符也可以将一个值转换为数字:

    +'123' // 123
    +'' // 0
    +'abc' // NaN
    
7. 面试题:NaN 与其他值进行比较的结果是什么?

答案:

  • NaN
    

    与任何值(包括它自己)进行比较时,都会返回

    false
    

    NaN == NaN // false
    NaN === NaN // false
    

解释: NaN 是一个特殊的数值,它不等于任何值,包括它自己。为了判断一个值是否为 NaN,应使用 Number.isNaN()isNaN()

8. 面试题:如何将字符串 "true" 转换为布尔值 true

答案:

Boolean("true") // true

解释: 非空字符串在 JavaScript 中会被转换为 true,因此 "true" 转换为布尔值时结果是 true

9. 面试题:[] == false[] == 0 分别的结果是什么?

答案:

  • [] == false 的结果是 true
  • [] == 0 的结果是 true

解释:

  • 空数组 [] 在与 false0 进行比较时,会被转换为数字 0,所以 [] == false[] == 0 都是 true
  • [] 被转换为一个空字符串 "",空字符串与 false0 比较时都被转换为 0,最终都是 0 == 0,结果为 true
10. 面试题:{} + [][] + {} 的结果是什么?

答案:

  • {} + [] 的结果是 [object Object]
  • [] + {} 的结果是 [object Object]

解释:

  • 在 JavaScript 中,{} 被解析为块级代码,而不是对象字面量。所以 {} + [] 被解释为一个空块 {}, 后面跟着 + []+ [] 被转换为数字 0,最终的结果是 [object Object]
  • [] + {} 被解析为数组和对象进行字符串连接,结果是 [object Object]