JavaScript 是一种动态类型语言,这意味着变量可以随时持有任何类型的数据,而不需要在声明时指定类型。JavaScript 中的数据类型主要分为两大类:原始类型(基本类型)和对象类型(引用类型)。
原始类型是不可变的(immutable),直接存储在栈内存中,包括以下7种:
Number - 数字类型
let age = 25;
let pi = 3.14;
let infinity = Infinity;
let nan = NaN; // Not a Number
String - 字符串类型
let name = "Alice";
let greeting = 'Hello';
let template = `Hello, ${name}`; // 模板字符串
Boolean - 布尔类型
let isActive = true;
let isCompleted = false;
Null - 空值
let empty = null; // 表示有意为空值
Undefined - 未定义
let notDefined; // 默认值为undefined
let alsoUndefined = undefined;
Symbol (ES6新增) - 唯一且不可变的值
let sym1 = Symbol('description');
let sym2 = Symbol('description');
console.log(sym1 === sym2); // false
BigInt (ES2020新增) - 大整数
let bigNum = 1234567890123456789012345678901234567890n;
对象类型是可变的(mutable),存储在堆内存中,变量存储的是对象的引用(内存地址)。包括:
Object - 普通对象
let person = {
name: 'Bob',
age: 30
};
Array - 数组
let numbers = [1, 2, 3, 4, 5];
let mixed = [1, 'two', true, null];
Function - 函数
function greet(name) {
return `Hello, ${name}!`;
}
Date - 日期
let now = new Date();
RegExp - 正则表达式
let pattern = /abc/;
其他内置对象:如 Map, Set, WeakMap, WeakSet 等
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"
instanceof 操作符 - 检测对象类型
[] instanceof Array; // true
{} instanceof Object; // true
new Date() instanceof Date; // true
Object.prototype.toString.call()
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
JavaScript 会自动进行隐式类型转换,也可以显式转换:
显式转换
Number('123'); // 123
String(123); // "123"
Boolean(1); // true
隐式转换
'5' + 1; // "51" (字符串拼接)
'5' - 1; // 4 (数字运算)
true + 1; // 2
null + 1; // 1
undefined + 1; // NaN
理解 JavaScript 的数据类型是掌握这门语言的基础,特别是在处理类型转换和比较操作时尤为重要。