基本数据类型之间的转换机制
1. 序言
相信有不少的朋友在面试的时候,碰到过这么一个问题 [] == ![]
是 true
or false
,然后叫你解释一下,虽然要回答出答案并不困难,但是要详细解释引擎执行这段代码的过程却很繁琐,我们需要对 JS 中类型转化的规则很清楚。
2. 基本数据类型的转换
JavaScript 中的基本数据类型,分别有 数字类型(Number)
、字符串类型(String)
、布尔类型(Boolean)
、未定义类型(Undefined)
、空值类型(Null)
、符号类型(Symbol)
和 BigInt
类型等。
2.1 基本数据类型转布尔值类型
数字类型(Number):在 JavaScript 中,0 被视为 false,而其他非零数字被视为 true。
console.log(Boolean(0)); // false
console.log(Boolean(42)); // true
字符串类型(String):如果字符串为空,则被视为 false,否则为 true。
console.log(Boolean("")); // false
console.log(Boolean("Hello")); // true
未定义类型(Undefined):undefined 被视为 false。
空值类型(Null):null 被视为 false。
console.log(Boolean(undefined)); // false
console.log(Boolean(null)); // false
2.2 基本数据类型转数字类型
字符串类型 (String):可以使用 Number() 函数将字符串转换为数字。如果字符串表示有效的数字 (包括整数和浮点数),则会被转换为对应的数字。如果字符串不是有效的数字,则会被转换为 NaN (Not a Number)。
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。
console.log(Number(true)); // 1
console.log(Number(false)); // 0
未定义类型 (Undefined):undefined 被转换为 NaN。
console.log(Number(undefined)); // NaN
空值类型 (Null):null 被转换为 0。
console.log(Number(null)); // 0
符号类型 (Symbol) 和 BigInt 类型:符号类型 (Symbol) 和 BigInt 类型无法直接转换为数字类型,会直接报错。
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):返回对应的字符串表示。
console.log(String(123)); // "123"
布尔类型 (Boolean):返回对应的字符串表示。
console.log(String(true)); // "true"
console.log(String(false)); // "false"
空值类型 (Null)和未定义类型 (Undefined):分别返回 "null" 和 "undefined"。
console.log(String(null)); // "null"
console.log(String(undefined)); // "undefined"
2.4 基本数据类型转对象类型
数字类型(Number) 和字符串类型 (String) 和布尔类型 (Boolean):转换为对应的包装类对象。
JavaScript 包装类里面定义了三种基本数据类型转换成包装类对象的方法。当我们用 Object() 方法将他们转换成对象类型,其实就是通过使用其对应的包装类方法转换成对应的包装类对象,如下例代码所示:
console.log(Object('123')); // = new String('123')
console.log(Object(123)); // = new Number(123)
console.log(Object(true)); // = new Number(123)
空值类型 (Null) 和未定义类型 (Undefined): 返回一个空对象。这是因为 null
和 undefined
是特殊的原始值,没有对应的包装对象。
console.log(Object(undefined)); // 输出 {}
console.log(Object(null)); // 输出 {}
WARNING
需要注意的是,{}
与使用 Object.create(null)
方法创建的原型为 null 的对象是不同的。Object.create(null)
创建的对象没有原型链,而通过 Object
方法转换的空对象仍然继承自 Object.prototype
。