JavaScript 的数据类型分为 基本数据类型(原始类型) 和 引用数据类型(对象类型) 两大类
一、基本数据类型(7 种)
- Number
- 表示整数和浮点数,例如:
42
,3.14
- 特殊值:
Infinity
(正无穷)、-Infinity
、NaN
(非数字,如0/0
的结果)。
- 表示整数和浮点数,例如:
- String
- 表示文本,可用单引号、双引号或反引号(模板字符串)定义,例如:
"hello"
、'world'
、Hi ${name}
。 - 字符串不可变,修改时会创建新字符串。
- 表示文本,可用单引号、双引号或反引号(模板字符串)定义,例如:
- Boolean
- 仅有两个值:
true
和false
。 - 其他值可隐式转换:如
0
、""
、null
、undefined
、NaN
会被转为false
,其余为true
。
- 仅有两个值:
- Undefined
- 变量声明后未赋值的默认值,例如:
let a;
中a
的值是undefined
。 - 函数无返回值时,默认返回
undefined
。
- 变量声明后未赋值的默认值,例如:
- Null
- 表示空值,需显式赋值,例如:
let a = null;
。 typeof null
返回"object"
(历史遗留问题)。
- 表示空值,需显式赋值,例如:
- Symbol(ES6 新增)
- 表示唯一值,例如:
const sym = Symbol('desc');
。 - 常用于对象属性名,避免命名冲突。
- 表示唯一值,例如:
- BigInt(ES2020 新增)
- 表示大整数,后缀加
n
或调用BigInt()
,例如:123n
、BigInt(123)
。 - 解决
Number
类型无法精确表示超大整数的问题(如超过2^53 - 1
)。
- 表示大整数,后缀加
二、引用数据类型(对象类型)
- Object
- 普通对象:键值对的集合,例如:
{ name: 'John', age: 30 }
。 - 内置对象:
- Array(数组):
[1, 2, 3]
,类型检测用Array.isArray()
。 - Function(函数):
function() {}
,typeof
返回"function"
。 - Date、RegExp、Error 等。
- Array(数组):
- 普通对象:键值对的集合,例如:
- 特点
- 变量存储的是内存地址(引用),赋值时复制引用而非对象本身。
- 可动态添加或修改属性。
三、类型检测方法
-
typeof
-
返回值:
typeof 42; // "number" typeof "hello"; // "string" typeof true; // "boolean" typeof undefined; // "undefined" typeof null; // "object" (注意!) typeof Symbol(); // "symbol" typeof 123n; // "bigint" typeof {}; // "object" typeof []; // "object" typeof function() {};// "function"
-
局限性:无法区分
null
和对象,无法检测数组。
-
-
instanceof
-
检测对象是否属于某个构造函数,例如:
[] instanceof Array; // true ({}) instanceof Object;// true
-
-
其他方法
Array.isArray(arr)
:检测数组。Object.prototype.toString.call(obj)
:返回更精确的类型,如[object Array]
。
四、存储方式
- 基本类型:值直接存储在栈内存中,占用空间固定。
- 引用类型:数据存储在堆内存中,变量保存的是堆内存地址。
总结
- 基本类型(7 种):
undefined
、null
、boolean
、number
、string
、symbol
、bigint
。 - 引用类型:对象(包括数组、函数等),操作时通过引用传递。
- 注意
typeof null
的陷阱及类型检测的替代方案。