Skip to content
On This Page

基本数据类型之间的转换机制

1. 序言

相信有不少的朋友在面试的时候,碰到过这么一个问题 [] == ![]true or false,然后叫你解释一下,虽然要回答出答案并不困难,但是要详细解释引擎执行这段代码的过程却很繁琐,我们需要对 JS 中类型转化的规则很清楚。

2. 基本数据类型的转换

JavaScript 中的基本数据类型,分别有 数字类型(Number)字符串类型(String)布尔类型(Boolean)未定义类型(Undefined)空值类型(Null)符号类型(Symbol)BigInt 类型等。

2.1 基本数据类型转布尔值类型

数字类型(Number):在 JavaScript 中,0 被视为 false,而其他非零数字被视为 true。

javascript
console.log(Boolean(0));   // false
console.log(Boolean(42));  // true

字符串类型(String):如果字符串为空,则被视为 false,否则为 true。

javascript
console.log(Boolean(""));       // false
console.log(Boolean("Hello"));  // true

未定义类型(Undefined):undefined 被视为 false。

空值类型(Null):null 被视为 false。

javascript
console.log(Boolean(undefined));  // false
console.log(Boolean(null));       // false

2.2 基本数据类型转数字类型

字符串类型 (String):可以使用 Number() 函数将字符串转换为数字。如果字符串表示有效的数字 (包括整数和浮点数),则会被转换为对应的数字。如果字符串不是有效的数字,则会被转换为 NaN (Not a Number)。

javascript
console.log(Number("42"));     // 42
console.log(Number("3.14"));   // 3.14
console.log(Number("Hello"));  // NaN
console.log(Number("520xx"));  // NaN

布尔类型 (Boolean):true 会被转换为 1,false 会被转换为 0。

javascript
console.log(Number(true));   // 1
console.log(Number(false));  // 0

未定义类型 (Undefined):undefined 被转换为 NaN。

javascript
console.log(Number(undefined));  // NaN

空值类型 (Null):null 被转换为 0。

javascript
console.log(Number(null));  // 0

符号类型 (Symbol) 和 BigInt 类型:符号类型 (Symbol) 和 BigInt 类型无法直接转换为数字类型,会直接报错。

javascript
console.log(Number(Symbol()));    // TypeError: Cannot convert a Symbol value to a number
console.log(Number(BigInt(123))); // TypeError: Cannot convert a BigInt value to a number

2.3 基本数据类型转字符串类型

数字类型(Number):返回对应的字符串表示。

javascript
console.log(String(123));  // "123"

布尔类型 (Boolean):返回对应的字符串表示。

javascript
console.log(String(true));   // "true"
console.log(String(false));  // "false"

空值类型 (Null)和未定义类型 (Undefined):分别返回 "null" 和 "undefined"。

javascript
console.log(String(null));       // "null"
console.log(String(undefined));  // "undefined"

2.4 基本数据类型转对象类型

数字类型(Number) 和字符串类型 (String) 和布尔类型 (Boolean):转换为对应的包装类对象。

JavaScript 包装类里面定义了三种基本数据类型转换成包装类对象的方法。当我们用 Object() 方法将他们转换成对象类型,其实就是通过使用其对应的包装类方法转换成对应的包装类对象,如下例代码所示:

javascript
console.log(Object('123'));  // = new String('123')
console.log(Object(123));    // = new Number(123)
console.log(Object(true));   // = new Number(123)

空值类型 (Null) 和未定义类型 (Undefined): 返回一个空对象。这是因为 nullundefined 是特殊的原始值,没有对应的包装对象。

javascript
console.log(Object(undefined));  // 输出 {}
console.log(Object(null));       // 输出 {}

WARNING

需要注意的是,{} 与使用 Object.create(null) 方法创建的原型为 null 的对象是不同的。Object.create(null) 创建的对象没有原型链,而通过 Object 方法转换的空对象仍然继承自 Object.prototype