前言
JavaScript中类型转换是一个很令人头疼的问题,特别是对于初学者来说。这是由于 JavaScript 是一种弱类型语言,它在运行时会尝试自动转换数据类型,以使表达式能够执行。这种灵活性使得 JavaScript 非常强大,但也容易引发一些不直观的行为。就比如当字符串与数字相加时,例如"3" + 2,JavaScript 将数字 2 隐式转换为字符串,而不是执行数学运算。今天我们就来聊聊JS中的类型转换规则,并且带你解决经典面试问题[ ] == ![ ] ?。
基本数据类型转换
JavaScript中有七种原始数据类型,分别是数字类型(Number)
、字符串类型(String)
、布尔类型(Boolean)
、未定义类型(Undefined)
、空值类型(Null)
、符号类型(Symbol)
和BigInt
类型。我们现在来基础介绍一下先:
-
Number(数字):
- 用于表示整数或浮点数。
javascriptCopy code var integer = 42; var float = 3.14;
-
String(字符串):
- 用于表示文本。
var text = "Hello, World!";
-
Boolean(布尔):
- 用于表示逻辑值,只能是
true
或false
。
var isTrue = true; var isFalse = false;
- 用于表示逻辑值,只能是
-
Undefined(未定义):
- 表示声明了变量但未给其赋值时的默认值。
var undefinedVariable;
-
Null(空):
- 表示变量没有值,是一种特殊的空值。
var nullValue = null;
-
Symbol(符号):
- 引入于ECMAScript 6,用于创建唯一的标识符。
var symbol = Symbol("unique");
-
BigInt(大整形):
var big = 123n
基本数据类型转数字型
这里我们使用Number()
函数,可以显式地将其他数据类型转换为数字。当我们console.log(Number())
时,括号里为空,那么将输出0
- 字符串转数字
console.log(Number('123')); // 123
console.log(Number('hello')); // NaN
-
- 将字符串
'123'
转换为数字。在这种情况下,字符串表示的是一个整数,所以Number('123')
的结果是数字123
。因此,console.log
会输出123
。
- 将字符串
-
- 试图将字符串
'hello'
转换为数字。然而,由于字符串'hello'
不是有效的数字表示,因此Number('hello')
的结果是NaN
(Not a Number)。NaN
是一个特殊的 JavaScript 值,表示无法表示的或者非数字的值。因此,console.log
会输出NaN
。
- 试图将字符串
- 布尔类型转数字
console.log(Number(true)); // 1
console.log(Number(false)); // 0
-
第一个语句:
console.log(Number(true));
试图将布尔值
true
转换为数字。在 JavaScript 中,布尔值true
在进行数字转换时被转换为数字1
。因此,Number(true)
的结果是1
。console.log
输出的结果为1
。 -
第二个语句:
console.log(Number(false));
这行代码试图将布尔值
false
转换为数字。在 JavaScript 中,布尔值false
在进行数字转换时被转换为数字0
。因此,Number(false)
的结果是0
。console.log
输出的结果为0
。
Number(true)
结果为 1
,因为布尔值 true
在转换为数字时被视为 1
。
Number(false)
结果为 0
,因为布尔值 false
在转换为数字时被视为 0
。
- Undefined 和 NUll 转数字
console.log(Number(undefined)); // NaN
console.log(Number(null)); // 0
-
第一个语句:
console.log(Number(undefined));
这行代码试图将
undefined
转换为数字。由于undefined
表示变量已声明但未初始化,它在进行数字转换时会得到NaN
(Not a Number)。因此,Number(undefined)
的结果是NaN
。console.log
输出的结果为NaN
。 -
第二个语句:
console.log(Number(null));
这行代码试图将
null
转换为数字。在 JavaScript 中,null
在进行数字转换时被转换为数字0
。因此,Number(null)
的结果是0
。console.log
输出的结果为0
。
总结:
Number(undefined)
结果为NaN
,因为undefined
无法转换为数字。Number(null)
结果为0
,因为null
在转换为数字时被视为0
。
- 符号类型 (Symbol) 和 BigInt 类型:符号类型 (Symbol) 和 BigInt 类型无法直接转换为数字类型,会直接报错。
基本数据类型转布尔型
在JavaScript中,可以使用 Boolean()
构造函数将其他数据类型转换为布尔类型。Boolean()
函数会根据传入的值进行布尔类型的转换。
- 数字类型转布尔类型
在JavaScript中,将数字类型转换为布尔值遵循一些规则。这涉及到“truthy”(真值)和“falsy”(假值)的概念。以下是一些规则:
-
Truthy 值(真值):
- 大多数数字(除了
0
和NaN
)都被视为真值。 - 正数、负数、正无穷大(
Infinity
)都是真值。 - 小数、负无穷大(
-Infinity
)也是真值。
console.log(Boolean(1)); // true console.log(Boolean(-1)); // true console.log(Boolean(0.5)); // true console.log(Boolean(Infinity)); // true
- 大多数数字(除了
-
Falsy 值(假值):
- 数字
0
被视为假值。 - 负零
-0
也被视为假值。 - 非数值的数字,如
NaN
,被视为假值。
console.log(Boolean(0)); // false console.log(Boolean(-0)); // false console.log(Boolean(NaN)); // false
- 数字
字符串类型转布尔型
console.log(Boolean('123')); // true
console.log(Boolean('')); // false
这段代码使用 console.log
打印了两个语句的执行结果:
-
Boolean('123')
:- 非空字符串
'123'
被视为真值,因此Boolean('123')
的结果为true
。
- 非空字符串
-
Boolean('')
:- 空字符串
''
被视为假值,因此Boolean('')
的结果为false
。
- 空字符串
在JavaScript中,字符串类型的转换规则是:
-
Truthy 值(真值):
- 所有非空字符串都被视为真值。
-
Falsy 值(假值):
- 空字符串
''
被视为假值。
- 空字符串
Undefin 和 null
console.log((Boolean(undefined))); // false
console.log(Boolean(null)); //false
-
Boolean(undefined)
:undefined
在布尔转换中被视为假值,因此Boolean(undefined)
的结果是false
。
-
Boolean(null)
:null
在布尔转换中也被视为假值,因此Boolean(null)
的结果是false
。
基本数据类型转字符串型
在JavaScript中,String()
是一个全局对象的构造函数,可以用于将其他数据类型转换为字符串。
-
数字转字符串:
console.log(String(123)); // '123'
console.log((String(0))); // '0'
console.log(String(NaN)); // 'NaN'
console.log(String(Infinity)); // 'Infinity'
-
-
String(123)
:
- 将数字
123
转换为字符串,得到字符串'123'
。
-
-
-
String(0)
:
- 将数字
0
转换为字符串,得到字符串'0'
。
-
-
-
String(NaN)
:
- 将特殊的数值
NaN
转换为字符串,得到字符串'NaN'
。
-
-
-
String(Infinity)
:
- 将特殊的数值
Infinity
转换为字符串,得到字符串'Infinity'
。
-
- 布尔值转字符串:
console.log(String(true)); // 'true'
将布尔值true
转换为字符串,得到字符串 'true'
。
null
和undefined
转字符串:
console.log(String(undefined)); // 'undefined'
console.log(String(null)); // 'null