JavaScript 变量类型与类型转换详解
变量存储方式分类 在 JavaScript 中,变量根据数据存储机制分为两类:基本类型(值类型) 和 引用类型。
- 基本类型 包括:
boolean、null、undefined、number、string以及Symbol(用于创建唯一标识符)。 - 引用类型 包括:
Object、Array、Function。
使用 typeof 检测类型
typeof 操作符可识别以下类型:
undefinedstringbooleannumberobjectfunction
console.log(typeof undefined); // "undefined"
console.log(typeof 'hello'); // "string"
console.log(typeof true); // "boolean"
console.log(typeof 42); // "number"
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof null); // "object" (历史遗留问题,表示空对象引用)
console.log(typeof function(){}); // "function"
⚠️ 注意:
typeof null返回"object"是语言设计的缺陷,实际应为null类型。
通过 instanceof 判断引用类型
对于复杂类型,建议使用 instanceof 进行判断:
console.log({} instanceof Object); // true
console.log([] instanceof Array); // true
值类型与引用类型核心差异
| 特性 | 值类型 | 引用类型 |
|---|---|---|
| 存储位置 | 栈内存 | 堆内存,栈中仅存地址 |
| 内存生命周期 | 函数执行完毕即释放 | 只要存在引用,就不会被回收 |
| 复制行为 | 复制原始值 | 复制引用地址,共享同一对象 |
| 类型检测方式 | typeof |
instanceof |
显式类型转换
- 转换为数字:Number()
-
原始值:
-
数字 → 不变
-
字符串:可解析则转为数值,否则为
NaN;空字符串转为0 -
布尔值:
true→1,false→0 -
undefined→NaN -
null→0 -
对象:
- 先调用
valueOf(),若返回原始值则转换; - 否则调用
toString(),若返回原始值则转换; - 若两者均返回复合类型,则抛出错误。
Number('123') // 123
Number('abc') // NaN
Number(true) // 1
Number(null) // 0
- 转换为字符串:String()
-
原始值:
-
数字 → 字符串形式
-
字符串 → 不变
-
布尔值 →
'true'/'false' -
undefined→'undefined' -
null→'null' -
对象:
- 优先调用
toString(),若返回原始值则使用; - 否则调用
valueOf(),若返回原始值则使用; - 两者都返回复合类型时抛错。
String(123) // "123"
String(true) // "true"
String(null) // "null"
- 转换为布尔值:Boolean()
仅当值为以下情况时为
false:
undefinednull+0,-0NaN- 空字符串
''
其余所有值均转为 true。
Boolean('') // false
Boolean('abc') // true
Boolean(0) // false
隐式类型转换场景
- 算术运算
100 + '10' // "10010"(字符串拼接)
100 - '10' // 90(自动转为数字)
100 * '5' // 500
100 / '2' // 50
- 条件判断
if (100) { /* true */ } // 非零数转为 true
if ('') { /* false */ } // 空字符串转为 false
-
控制台输出与弹窗
console.log()与alert()会自动将参数转为字符串显示。 -
相等比较操作符
==执行类型强制转换,例如:
123 == '123' // true
0 == '' // true
null == undefined // true
- 逻辑运算符
10 && 0 // 0(短路求值,10 转为 true)
'' || 'hello' // 'hello'
!window.data // true(若 data 未定义)
何时使用 === 与 ==
-
推荐始终使用
===:避免意外类型转换,性能更优,代码更清晰。 -
特殊情况使用
==:
- 检查属性是否存在(常见于库函数写法):
if (obj.prop == null) {
// 等价于 obj.prop === null || obj.prop === undefined
}
- 函数参数是否缺失:
function process(value) {
if (value == null) {
// 表示参数未传或为 null/undefined
}
}
JavaScript 内置构造函数(纯语言层面)
ObjectArrayBooleanNumberStringFunctionDateRegExpError
关于 JSON 的理解 JSON 是一种轻量级的数据交换格式,广泛用于前后端通信。它本质上是符合特定规则的 JavaScript 对象结构。
常用方法:
JSON.stringify(obj):将对象序列化为字符串。JSON.parse(str):将字符串解析为对象。
const data = { name: 'Alice', age: 25 };
const jsonStr = JSON.stringify(data);
const parsed = JSON.parse(jsonStr);