本文深入解析 JavaScript 的 8 种数据类型,涵盖 undefined、Boolean、Number、String、BigInt、Symbol 及 Object。重点讲解动态类型特性、原始值的不可变性以及 typeof 与 instanceof 在类型检查中的区别与应用,帮助开发者准确理解 JS 基础结构。
1. 什么是动态类型
- JavaScript 被归类为弱类型或动态语言。
- 在编写代码时,无需预先声明变量的具体类型,系统会在程序运行期间自动推断并确定类型。
- 这种机制允许同一个变量在不同时刻存储不同类型的数据。
let a; // 初始不给任何类型
a = 11; // a此时是number类型
a = "二大爷"; // a 变成了字符串类型
a = true; // a 变成了布尔类型
尽管语法上允许这样做,但在实际工程开发中并不推荐频繁改变变量类型,因为这可能导致难以预料的逻辑错误。
- 例如,假设一个变量原本存储的是男性身份,随后被赋值为女性身份,这种类型的剧烈转换可能引发业务逻辑混乱。
- 或者,原本代表女性角色的变量突然被赋予男性身份,同样会造成数据语义的冲突。
- 再比如,涉及敏感关系的变量类型发生不可控的突变,可能导致程序状态异常。
- …
- 因此,一旦变量的数据类型被确定,建议保持其稳定性,避免随意篡改。
2. 数据类型分类
- 许多人可能仍认为 JavaScript 仅包含 6 种数据类型,这是一种过时的认知。
- 根据最新的 ECMAScript 标准,JavaScript 共定义了 8 种数据类型。
2.1 原始类型(共 6 种,可通过 typeof 运算符进行检测)
- undefined:通过 typeof instance === “undefined” 进行判断。
- Boolean:通过 typeof instance === “boolean” 进行判断。
- Number:通过 typeof instance === “number” 进行判断。
- String:通过 typeof instance === "string" 进行判断。
- BigInt:通过 typeof instance === “bigint” 进行判断,用于表示任意精度的整数。
- Symbol:通过 typeof instance === “symbol” 进行判断。
2.2 null 与 Object
- null:通过 typeof instance === “object” 进行判断(这是语言设计的历史遗留问题)。
- 对于通过构造函数创建的对象实例,typeof 同样返回 “object”。
- 所有通过 new 关键字创建的对象实例,如 new Object、new Array、new Map、new Set、new WeakMap、new WeakSet、new Date 等,均属于特殊非数据结构类型,同时也作为数据结构使用。
2.3 typeof 操作符的关键说明
- typeof 操作符的主要功能是检查值的基本类型。
- 若需检测从 Object 派生的具体结构类型,typeof 无法提供准确结果,因为它对所有对象类型均返回 “object”。
- 要检查 Object 的具体种类(如数组、日期等),应使用 instanceof 关键字。然而,即使使用 instanceof,在某些跨窗口或复杂场景下仍存在误差,目前尚无百分之百完美的类型检测方法。

3. 原始值详解
3.1 原始值基本概念
- 除 Object 以外的所有类型均为不可变类型,即值本身无法被修改。
- 与 C 语言不同,JavaScript 中的字符串是不可变的。对字符串执行任何操作都会返回一个新字符串,而原始字符串保持不变,这类值被称为“原始值”。
3.2 各类型具体说明
- 布尔类型(Boolean):表示逻辑实体,仅有两个值:true 和 false。
- Null 类型:仅有一个值 null,表示“空”或“无”。
- Undefined 类型:未赋值的变量默认具有 undefined 值。
- Number 类型:JavaScript 未像 Java 那样细分整数和浮点数类型,统一使用 Number。此外还包括特殊值:+Infinity、-Infinity 和 NaN(Not-a-Number,非数值)。
- BigInt 类型:JavaScript 中的基础数值类型,支持任意精度的整数运算。它可以安全地存储和操作超过安全整数限制的大整数。BigInt 可通过在整数末尾添加 n 或使用构造函数创建。
语法:BigInt(value);
value:创建 BigInt 对象所需的数值,可以是字符串或整数。
注意:BigInt() 不是构造函数,因此不能使用 new 操作符来创建 BigInt 实例。
- String 类型:字符串是不可变的。创建后无法修改原字符串,但可以通过对原始字符串的操作生成新字符串。
获取子串可通过选取特定字符或使用 String.substr() 方法实现。
字符串连接可使用连接操作符 (+) 或 String.concat() 方法完成。
- Symbols 类型:唯一且不可修改,常用作 Object 的键名,确保属性名的唯一性。
- Object 类型:对象可视为一组属性的集合。使用对象字面量语法定义对象时,会自动初始化一组属性。
属性的值可以是任意类型,包括具有复杂数据结构的其他对象。属性通过键标识,键可以是字符串或符号值(Symbol)。
以上内容详细解析了 JavaScript 的数据类型与数据结构,更多关于 JS 数据类型与数据结构的资料请关注本站其它相关文章!