JavaScript 数据类型详解
JavaScript 数据类型详解
JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11+):
一、原始类型(7种)
1. undefined
- 定义:未赋值的变量默认值
- 特点:
- 变量声明未初始化时值为
undefined
- 函数无返回值时返回
undefined
- 变量声明未初始化时值为
- 检测:
let a; console.log(a); // undefined console.log(typeof a); // "undefined"
2. null
- 定义:表示 空值 或 对象不存在
- 关键点:
typeof null === "object"
(历史遗留问题)- 与
undefined
区别:null
需显式赋值
let b = null; console.log(b === null); // true
3. boolean
- 值域:
true
/false
- 隐式转换规则:
值类型 转 boolean 结果 0
,NaN
false
非零数字 true
""
false
非空字符串 true
null
/undefined
false
对象/数组 true
4. number
- 定义:双精度 64 位浮点数(IEEE 754)
- 特殊值:
NaN
(Not a Number):无效数学操作结果Infinity
/-Infinity
:超出数值范围Number.MAX_SAFE_INTEGER
(2⁵³ - 1)
- 示例:
console.log(0.1 + 0.2); // 0.30000000000000004(精度问题) console.log(1 / 0); // Infinity console.log(Math.sqrt(-1)); // NaN
5. bigint
(ES2020)
- 定义:表示任意精度的整数
- 语法:数字末尾加
n
- 用途:处理超过
Number.MAX_SAFE_INTEGER
的值const bigNum = 9007199254740991n; console.log(bigNum + 1n); // 9007199254740992n
6. string
- 定义:UTF-16 编码的文本序列
- 特性:
- 不可变(修改会创建新字符串)
- 模板字符串支持插值:
`Hello ${name}`
- 转义字符:
\n
,\t
,\u{1F600}
(表情符号)
7. symbol
(ES6)
- 定义:唯一且不可变的标识符
- 用途:
- 创建对象唯一属性键
- 避免命名冲突
const id = Symbol("unique_id"); const obj = { [id]: 123 }; console.log(obj[id]); // 123
二、对象类型(1种,包含子类)
1. Object
- 定义:键值对集合(属性 + 方法)
- 子类:
类型 用途 示例 Array
有序数据集合 [1, 2, 3]
Function
可执行对象 function foo() {}
Date
日期时间处理 new Date()
RegExp
正则表达式 /\d+/g
Map
/Set
键值对/唯一值集合 new Map([['key', 1]])
Promise
异步操作管理 new Promise(...)
Error
错误信息封装 new Error("msg")
对象特性:
-
引用传递
const obj1 = { x: 1 }; const obj2 = obj1; obj2.x = 2; console.log(obj1.x); // 2(共享内存)
-
原型继承
const arr = []; console.log(arr.__proto__ === Array.prototype); // true
三、类型检测方法对比
方法 | 适用场景 | 局限性 |
---|---|---|
typeof | 原始类型检测 | typeof null => "object" |
instanceof | 检测对象实例的构造函数 | 不适用于原始类型 |
Array.isArray() | 专检数组 | 仅限数组 |
Object.prototype.toString.call() | 最准确类型判断 | 需配合调用 |
精准类型检测函数:
function getType(value) {return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}console.log(getType(null)); // "null"
console.log(getType(/regex/)); // "regexp"
console.log(getType(new Map())); // "map"
四、类型转换机制
1. 显式转换
Number("123"); // 123
String(true); // "true"
Boolean([]); // true
2. 隐式转换(易错点)
1 + "2" // "12"(数字转字符串)
"5" - true // 4(布尔转数字)
[] == 0 // true([]转""再转0)
null >= 0 // true(null转0)
关键总结
- 原始类型:直接存储值,不可变(7种)
- 对象类型:存储内存引用,可变(含多种子类)
- 类型检测:优先用
Object.prototype.toString.call()
- 转换原则:
- 数学运算:尝试转数字
+
运算:遇字符串则拼接==
比较:触发隐式转换(建议用===
)
💡 特殊记忆:
NaN
是唯一不等于自身的值:NaN !== NaN
typeof function() {}
返回"function"
(历史遗留)