本文围绕 “显式类型转换” 与 “隐式类型转换” 两大维度,拆解 “其他类型转字符串”“其他类型转布尔值”“其他类型转数字” 三大核心场景,完整覆盖 ES5 数据类型转换知识点。

一、核心概念:显式转换 vs 隐式转换

数据类型转换明确分为两类:

  • 显式类型转换:通过toString()Boolean()Number()等方法主动、明确地转换类型,代码可读性强,转换逻辑清晰。
  • 隐式类型转换:未使用转换方法,由 JavaScript 引擎在特定场景(如运算、比较)中自动触发的转换,需遵循文档规定的隐式转换规则(如ToPrimitive()ToNumber()ToString()抽象操作)。

二、其他类型转换为字符串类型

2.1 显式类型转换

文档指定显式转字符串的核心方法为toString()函数,需注意nullundefined不支持该方法。

方法:toString()
  • 适用范围:布尔、数字、数组等(除nullundefined
  • 特殊能力:数字类型可通过参数指定进制(二进制、八进制、十六进制)
代码示例及运行结果

javascript

// 1. 布尔值转字符串
var bool = true;
console.log(bool.toString()); // 运行结果:'true',显式调用toString()
console.log(typeof bool.toString()); // 运行结果:string

// 2. 数字转字符串(指定进制)
var num = 10;
console.log(num.toString()); // 默认十进制,运行结果:"10"
console.log(num.toString(2)); // 二进制,运行结果:"1010"
console.log(num.toString(16)); // 十六进制,运行结果:"a"

// 3. 数组转字符串
var arr = [1, 2, 3];
console.log(arr.toString()); // 运行结果:"1,2,3"

// 注意:文档明确null/undefined无toString()
// console.log(null.toString()); // 报错:Cannot read property 'toString' of null
// console.log(undefined.toString()); // 报错:Cannot read property 'toString' of undefined

2.2 隐式类型转换

隐式转字符串的触发场景为 “任意数据与字符串通过+拼接”,引擎会自动调用ToString()抽象操作完成转换。

触发场景:字符串拼接(+运算符)
  • 规则:只要+两侧有一个操作数是字符串,另一侧数据会自动转为字符串,再进行拼接。
代码示例及运行结果

javascript

// 1. 数字与字符串拼接(隐式转字符串)
var numStr = 123 + ""; // 空字符串触发隐式转换
console.log(numStr); // 运行结果:"123"
console.log(typeof numStr); // 运行结果:string
// 2. 布尔值与字符串拼接
var boolStr = true + "JavaScript";
console.log(boolStr); // 运行结果:"trueJavaScript"

// 3. 对象与字符串拼接(引擎自动调用ToPrimitive()→toString())
var obj = { name: "zhangsan" };
console.log(obj + "test"); // 运行结果:"[object Object]test"

三、其他类型转换为布尔类型

3.1 显式类型转换

文档指定显式转布尔的方法为Boolean()包装器,转换规则统一:仅特定值转为false,其余为true

方法:Boolean()
  • 转换规则
    • 转为false:空字符串 ("")、0、nullundefinedNaN
    • 转为true:非空字符串、非零数字、对象、数组等
代码示例及运行结果

javascript

console.log(Boolean('hello')); // 非空字符串→true
console.log(Boolean('')); // 空字符串→false
console.log(Boolean(123)); // 非零数字→true
console.log(Boolean(0)); // 数字0→false
console.log(Boolean(null)); // null→false
console.log(Boolean({})); // 对象→true

3.2 隐式类型转换

文档中,隐式转布尔的触发场景为 “逻辑运算(&&||!)” 或 “条件判断(if括号内表达式)”,引擎自动调用Boolean()完成转换。

触发场景 1:逻辑非运算符(!
  • 规则!会先将操作数隐式转为布尔值,再取反。
代码示例及运行结果

javascript

// 隐式转布尔后取反
console.log(!''); // 空字符串→false,取反后运行结果:true
console.log(!100); // 非零数字→true,取反后运行结果:false
console.log(!null); // null→false,取反后运行结果:true
触发场景 2:条件判断(if语句)
  • 规则if括号内的表达式会被隐式转为布尔值,再判断真假。
代码示例及运行结果

javascript

var a = 0;
if (a) { 
  console.log("执行"); 
} else { 
  console.log("不执行"); // 运行结果:不执行(a=0隐式转为false)
}

var b = "hello";
if (b) { 
  console.log("执行"); // 运行结果:执行(b非空字符串隐式转为true)
}

四、其他类型转换为数字类型

转成数字是隐式转换最复杂的场景,需区分显式方法与隐式触发规则。

4.1 显式类型转换

显式转数字的核心方法为Number()parseInt()parseFloat(),三者适用场景不同。

方法 1:Number()(严格整体转换)
  • 规则:整体解析数据,若包含非数字字符(除合法符号、小数点、十六进制0x),则返回NaN
代码示例及运行结果

javascript

// 1. 基本类型转换
console.log(Number(true)); // 布尔true→1
console.log(Number(false)); // 布尔false→0
console.log(Number(null)); // null→0
console.log(Number(undefined)); // undefined→NaN
console.log(Number("123")); // 纯数字字符串→123
console.log(Number("123abc")); // 含非数字字符→NaN
console.log(Number("0xa")); // 十六进制→10
console.log(Number("")); // 空字符串→0

// 2. 引用类型转换
console.log(Number([])); // 空数组→0
console.log(Number([123])); // 单元素数组→123
console.log(Number({})); // 对象→NaN
方法 2:parseInt()(从左到右解析整数)
  • 规则:忽略开头空格,从左到右解析整数,遇到非数字字符停止;支持指定进制
代码示例及运行结果

javascript

console.log(parseInt("123.45")); // 忽略小数→123
console.log(parseInt("+12.7")); // 保留符号→12
console.log(parseInt("1+2.3")); // 遇到"+"停止→1
console.log(parseInt("0xa")); // 十六进制→10
console.log(parseInt("123abc")); // 遇到"a"停止→123
console.log(parseInt("abc123")); // 非数字开头→NaN
方法 3:parseFloat()(解析浮点数)
  • 规则:保留小数点后有效数字,不支持进制指定。
代码示例及运行结果

javascript

console.log(parseFloat("123.45")); // 运行结果:123.45
console.log(parseFloat("123.45.67")); // 只解析第一个小数点→123.45
console.log(parseFloat("123abc")); // 遇到"a"停止→123
console.log(parseFloat("0xa")); // 不解析十六进制→0

4.2 隐式类型转换

文档中,隐式转数字的触发场景包括 “算术运算(-*/%)”“比较运算(==><)”,引擎自动调用ToNumber()抽象操作。

触发场景 1:算术运算(除+外的运算符)
  • 规则:除+外,-*/%会自动将字符串数字转为数字;若无法转为数字,结果为NaN
代码示例及运行结果

javascript

// 1. 字符串数字减运算(隐式转数字)
var num1 = '8';
var num2 = '4';
console.log(num1 - num2); // 运行结果:4("8"和"4"隐式转为8和4)

// 2. 字符串数字乘运算
console.log(num1 * num2); // 运行结果:32(隐式转数字后计算)

// 3. 非纯数字字符串运算
console.log('10' - 'one'); // 运行结果:NaN("one"无法转为数字)
触发场景 2:比较运算(==
  • 规则==比较时的隐式转换逻辑:
    • undefined == nulltrue
    • 字符串与数字比较:字符串隐式转为数字
    • 数字与布尔比较:布尔隐式转为数字
代码示例及运行结果

javascript

console.log(undefined == null); // 运行结果:true
console.log('0' == 0); // "0"隐式转为0→true
console.log(0 == false); // false隐式转为0→true
console.log('0' == false); // 两者均隐式转为0→true
触发场景 3:一元正号(+
  • 规则+作为一元运算符时,会隐式将操作数转为数字,效果与Number()一致。
代码示例及运行结果

javascript

console.log(+"23"); // 运行结果:23("23"隐式转为数字)
console.log(+null); // 运行结果:0(null隐式转为0)
console.log(+undefined); // 运行结果:NaN(undefined隐式转为NaN)

五、文档核心转换规则总结表

转换方向 转换类型 核心方法 / 触发场景 关键规则
转字符串 显式 toString() null/undefined无此方法;数字可指定进制
转字符串 隐式 字符串拼接(+ 有一个操作数是字符串则触发,引擎调用ToString()
转布尔值 显式 Boolean() 空字符串、0、nullundefinedNaNfalse,其余→true
转布尔值 隐式 逻辑运算(!)、条件判断(if 引擎自动调用Boolean(),规则与显式一致
转数字 显式 Number()parseInt()parseFloat() Number()严格整体转换;parseInt()从左到右解析;parseFloat()保留小数
转数字 隐式 算术运算(-/*//)、==比较、一元+ 引擎调用ToNumber()==比较有特殊规则(如undefined == null
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐