显式类型转换是开发者主动进行的类型转换,代码意图清晰。
// String()函数
console.log(String(123)); // "123"
console.log(String(true)); // "true"
console.log(String(null)); // "null"
console.log(String(undefined)); // "undefined"
console.log(String([1, 2, 3])); // "1,2,3"
console.log(String({})); // "[object Object]"
// toString()方法
console.log((123).toString()); // "123"
console.log(true.toString()); // "true"
console.log([1, 2].toString()); // "1,2"
// 拼接空字符串
console.log(123 + ""); // "123"
console.log(true + ""); // "true"
// toFixed() - 数字转字符串并保留小数
console.log((3.14159).toFixed(2)); // "3.14"
// Number()函数
console.log(Number("123")); // 123
console.log(Number("3.14")); // 3.14
console.log(Number("")); // 0
console.log(Number("东巴文")); // NaN
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
// parseInt() - 解析整数
console.log(parseInt("123")); // 123
console.log(parseInt("123.45")); // 123
console.log(parseInt("123abc")); // 123
console.log(parseInt("abc123")); // NaN
console.log(parseInt("10", 2)); // 2(二进制)
console.log(parseInt("FF", 16)); // 255(十六进制)
// parseFloat() - 解析浮点数
console.log(parseFloat("3.14")); // 3.14
console.log(parseFloat("3.14abc")); // 3.14
console.log(parseFloat("3")); // 3
// 一元加号
console.log(+"123"); // 123
console.log(+"3.14"); // 3.14
console.log(+"东巴文"); // NaN
// Boolean()函数
console.log(Boolean(1)); // true
console.log(Boolean(0)); // false
console.log(Boolean("东巴文")); // true
console.log(Boolean("")); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean([])); // true
console.log(Boolean({})); // true
// 双重否定
console.log(!!1); // true
console.log(!!0); // false
console.log(!!""); // false
// Object()函数
console.log(Object(123)); // Number {123}
console.log(Object("东巴文")); // String {"东巴文"}
console.log(Object(true)); // Boolean {true}
// 原始值包装对象
let num = new Number(123);
let str = new String("东巴文");
let bool = new Boolean(true);
console.log(typeof num); // "object"
console.log(typeof str); // "object"
console.log(typeof bool); // "object"
隐式类型转换是JavaScript自动进行的类型转换,了解规则可以避免意外错误。
// + 运算符遇到字符串会进行拼接
console.log(1 + "2"); // "12"
console.log("1" + 2); // "12"
console.log(1 + 2 + "3"); // "33"
console.log("1" + 2 + 3); // "123"
console.log(1 + "2" + 3); // "123"
// 其他算术运算符会转换为数字
console.log("5" - 3); // 2
console.log("5" * "2"); // 10
console.log("10" / 2); // 5
console.log("10" % 3); // 1
// 一元运算符
console.log(+"5"); // 5
console.log(-"5"); // -5
console.log(+"东巴文"); // NaN
// == 会进行类型转换
console.log(5 == "5"); // true
console.log(0 == ""); // true
console.log(0 == false); // true
console.log(null == undefined); // true
// === 不进行类型转换
console.log(5 === "5"); // false
console.log(0 === ""); // false
console.log(0 === false); // false
console.log(null === undefined);// false
// 条件判断中会转换为布尔值
if ("东巴文") {
console.log("执行"); // 执行
}
if (0) {
console.log("不执行");
}
// 逻辑运算符返回原值
console.log(1 || 2); // 1
console.log(0 || 2); // 2
console.log(1 && 2); // 2
console.log(0 && 2); // 0
| 原始值 | 转换结果 | 东巴文说明 |
|---|---|---|
| undefined | "undefined" | - |
| null | "null" | - |
| true | "true" | - |
| false | "false" | - |
| 123 | "123" | - |
| NaN | "NaN" | - |
| Infinity | "Infinity" | - |
| [] | "" | 空数组 |
| [1, 2] | "1,2" | 数组元素逗号连接 |
| {} | "[object Object]" | 对象 |
| function(){} | "function(){}" | 函数源码 |
// 对象转字符串的流程
let obj = {
name: "东巴文",
// 1. 优先调用[Symbol.toPrimitive]
[Symbol.toPrimitive](hint) {
if (hint === "string") {
return this.name;
}
return 42;
},
// 2. 其次调用toString()
toString() {
return "toString结果";
},
// 3. 最后调用valueOf()
valueOf() {
return "valueOf结果";
}
};
console.log(String(obj)); // "东巴文"
console.log(obj + ""); // "42"
| 原始值 | 转换结果 | 东巴文说明 |
|---|---|---|
| undefined | NaN | - |
| null | 0 | - |
| true | 1 | - |
| false | 0 | - |
| "123" | 123 | 纯数字字符串 |
| "3.14" | 3.14 | 浮点数 |
| "" | 0 | 空字符串 |
| "东巴文" | NaN | 非数字字符串 |
| [] | 0 | 空数组 |
| [5] | 5 | 单元素数组 |
| [1, 2] | NaN | 多元素数组 |
| {} | NaN | 对象 |
let obj = {
// 1. 优先调用[Symbol.toPrimitive]
[Symbol.toPrimitive](hint) {
if (hint === "number") {
return 100;
}
return null;
},
// 2. 其次调用valueOf()
valueOf() {
return 50;
},
// 3. 最后调用toString()
toString() {
return "25";
}
};
console.log(Number(obj)); // 100
只有以下值转换为false:
const falsyValues = [
false,
0,
-0,
0n,
"", // 空字符串
null,
undefined,
NaN
];
// 检测假值
function isFalsy(value) {
return !value;
}
除假值外的所有值都是真值:
// 这些都是真值
console.log(Boolean([])); // true(空数组)
console.log(Boolean({})); // true(空对象)
console.log(Boolean(" ")); // true(空格字符串)
console.log(Boolean("false")); // true(字符串"false")
console.log(Boolean(-1)); // true(负数)
console.log(Boolean(Infinity)); // true
console.log(Boolean(function(){})); // true(函数)
// 字符串
let str = "东巴文";
console.log(str.length); // 3(自动包装)
console.log(str.toUpperCase()); // "东巴文"(自动包装)
// 数字
let num = 123;
console.log(num.toFixed(2)); // "123.00"(自动包装)
// 布尔值
let bool = true;
console.log(bool.toString()); // "true"(自动包装)
// null和undefined没有包装对象
// console.log(null.toString()); // TypeError
// console.log(undefined.toString()); // TypeError
// 1. 类型相同,直接比较
console.log(1 == 1); // true
console.log("a" == "a"); // true
// 2. null == undefined
console.log(null == undefined); // true
// 3. 数字与其他类型比较,转为数字
console.log(1 == "1"); // true
console.log(1 == true); // true
console.log(0 == false); // true
// 4. 字符串与布尔值,都转为数字
console.log("1" == true); // true
console.log("0" == false); // true
// 5. 对象与原始值,对象转为原始值
console.log([1] == 1); // true
console.log([1, 2] == "1,2"); // true
| 类型1 | 类型2 | 转换规则 | 东巴文说明 |
|---|---|---|---|
| null | undefined | 相等 | 特殊规则 |
| 数字 | 字符串 | 字符串转数字 | "5" → 5 |
| 布尔值 | 任意 | 布尔值转数字 | true → 1 |
| 对象 | 原始值 | 对象转原始值 | 调用valueOf/toString |
console.log([] == false); // true
// [] → "" → 0, false → 0
console.log([] == ![]); // true
// ![] → false, [] → "" → 0, false → 0
console.log({} == !{}); // false
// !{} → false, {} → "[object Object]" → NaN, false → 0
console.log("" == 0); // true
console.log("" == false); // true
console.log(0 == false); // true
// 推荐:使用严格相等 ===
console.log(5 === 5); // true
console.log(5 === "5"); // false
console.log(null === undefined); // false
// 明确的类型转换
console.log(Number("5") === 5); // true
console.log(String(5) === "5"); // true
console.log(Boolean(1) === true);// true
东巴文建议:始终使用===进行相等比较,避免隐式类型转换带来的意外结果。
| 目标类型 | 方法 | 东巴文推荐 |
|---|---|---|
| String | String(), toString(), +"" | String()最清晰 |
| Number | Number(), parseInt(), parseFloat(), + | Number()通用 |
| Boolean | Boolean(), !! | !!更简洁 |
| Object | Object(), new包装对象 | 按需使用 |
| 场景 | 触发运算符 | 转换目标 | 东巴文提醒 |
|---|---|---|---|
| 字符串拼接 | + | String | 注意顺序 |
| 算术运算 | -, *, /, % | Number | 自动转换 |
| 比较运算 | == | 视情况 | 使用===避免 |
| 条件判断 | if, while | Boolean | 了解假值 |
| 逻辑运算 | ||, && | 不转换 | 返回原值 |
掌握了类型转换后,让我们继续学习:
东巴文(db-w.cn) - 让编程学习更简单
🔄 东巴文寄语:理解类型转换是避免JavaScript陷阱的关键。掌握显式转换方法,了解隐式转换规则,让你的代码更加可靠。在 db-w.cn,我们帮你避开每一个坑!