js类型实现
JavaScript 类型实现
JavaScript 是一种动态类型语言,其类型系统在运行时确定。以下是 JavaScript 中类型的实现方式及相关细节。
原始类型(Primitive Types)
JavaScript 有 7 种原始数据类型:
number: 用于整数和浮点数。string: 用于文本数据。boolean: 逻辑值true或false。null: 表示空值。undefined: 表示未定义的值。symbol: 唯一的标识符(ES6 引入)。bigint: 用于大整数(ES2020 引入)。
原始类型的值是不可变的,直接存储在栈内存中。
对象类型(Object Types)
对象类型是引用类型,包括:
Object: 普通对象。Array: 数组。Function: 函数。Date: 日期。RegExp: 正则表达式。- 其他内置对象(如
Map,Set等)。
对象类型的值是可变的,存储在堆内存中,变量保存的是对象的引用。
类型检测
JavaScript 提供了多种方式检测变量类型:
typeof 运算符
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" (历史遗留问题)
typeof Symbol(); // "symbol"
typeof BigInt(1); // "bigint"
typeof {}; // "object"
typeof []; // "object"
typeof function() {}; // "function"
instanceof 运算符 用于检测对象是否为某个构造函数的实例。
[] instanceof Array; // true
new Date() instanceof Date; // true
Object.prototype.toString 更精确的类型检测方法。
Object.prototype.toString.call(42); // "[object Number]"
Object.prototype.toString.call("hello"); // "[object String]"
Object.prototype.toString.call([]); // "[object Array]"
类型转换
JavaScript 在运算或比较时会自动进行隐式类型转换,也可以通过显式方式转换。
显式转换
Number("123"); // 123
String(123); // "123"
Boolean(0); // false
隐式转换
"5" + 1; // "51" (字符串拼接)
"5" - 1; // 4 (数字运算)
true + 1; // 2 (布尔转数字)
类型比较
JavaScript 使用 == 和 === 进行比较:
==: 宽松相等,会进行类型转换。===: 严格相等,不进行类型转换。
"5" == 5; // true
"5" === 5; // false
null == undefined; // true
null === undefined; // false
ES6 新增类型
Symbol 创建唯一值,常用于对象属性键。
const sym = Symbol("description");
const obj = { [sym]: "value" };
BigInt 表示任意精度的整数。
const bigNum = 9007199254740991n;
bigNum + 1n; // 9007199254740992n
类型扩展
通过原型链和类(ES6)可以扩展自定义类型。
类定义

class Person {
constructor(name) {
this.name = name;
}
}
const person = new Person("Alice");
注意事项
typeof null返回"object"是历史遗留问题。- 原始类型的包装对象(如
new Number(42))是对象类型,但很少使用。 - 隐式类型转换可能导致意外行为,建议使用
===进行比较。
以上内容涵盖了 JavaScript 类型的核心实现和常见操作方式。






