Javascript 强制类型转换
在 JavaScript 中,强制类型转换(Type Coercion)是指自动或者显式地将一种数据类型转换为另一种数据类型。强制类型转换分为两类:隐式类型转换(自动转换)和显式类型转换(强制转换)。
1. 显式类型转换
显式类型转换是程序员手动触发的转换,将一种类型的值转换为另一种类型。JavaScript 提供了一些内置的转换函数来帮助我们进行显式类型转换。常见的转换包括:
a. 转换为数字
可以使用 Number() 函数将其他类型转换为数字:
- 字符串转数字:
Number("123")→123Number("123.45")→123.45Number(" ")→0Number("")→0Number("abc")→NaN(不可转换)
- 布尔值转数字:
Number(true)→1Number(false)→0
- 空值(null 和 undefined)转数字:
Number(null)→0Number(undefined)→NaN
- 对象转数字:
Number({})→NaNNumber([])→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)→falseBoolean(undefined)→falseBoolean('')→falseBoolean(0)→falseBoolean(NaN)→false
- 非空值:
Boolean(1)→trueBoolean('abc')→trueBoolean([1, 2, 3])→trueBoolean({})→true
d. 转换为对象
通常,只有 null 和 undefined 类型不能直接转换为对象。对于其他类型,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 == false→true(==运算符将false转换为 0)null == undefined→true(null和undefined被认为是相等的)null === undefined→false(===严格相等不进行类型转换)
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。[] == false是true,因为==运算符会进行类型转换。空数组在与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 == undefined 和 null === undefined 的区别是什么?
答案:
null == undefined返回true。null === undefined返回false。
解释:
==运算符在比较时会进行类型转换,null和undefined被认为是相等的。===运算符是严格相等运算符,不会进行类型转换。由于null和undefined是不同的类型,因此返回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。
解释:
- 空数组
[]在与false或0进行比较时,会被转换为数字0,所以[] == false和[] == 0都是true。 []被转换为一个空字符串"",空字符串与false和0比较时都被转换为0,最终都是0 == 0,结果为true。
10. 面试题:{} + [] 和 [] + {} 的结果是什么?
答案:
{} + []的结果是[object Object]。[] + {}的结果是[object Object]。
解释:
- 在 JavaScript 中,
{}被解析为块级代码,而不是对象字面量。所以{} + []被解释为一个空块{},后面跟着+ [],+ []被转换为数字0,最终的结果是[object Object]。 [] + {}被解析为数组和对象进行字符串连接,结果是[object Object]。