在 JavaScript 中,数据类型可以分为两大类:基本数据类型和引用数据类型。每种数据类型都有其特定的用途和特征。以下是详细的分类和说明:
1. 基本数据类型
基本数据类型(Primitive types)是不可变的(immutable)数据类型,每个值都是独立的。JavaScript 中有六种基本数据类型:
-
Undefined
- 表示未定义的值。只有一个值,即
undefined
。 - 通常在变量声明后未赋值,或者函数没有返回值时会得到此类型。
javascript let a; console.log(a); // undefined
- 表示未定义的值。只有一个值,即
-
Null
- 表示“无”或“空”值。只有一个值,即
null
。 - 用于指示变量不指向任何对象或值。
javascript let b = null; console.log(b); // null
- 表示“无”或“空”值。只有一个值,即
-
Boolean
- 布尔值,只能是
true
或false
,用于逻辑运算。
javascript let isTrue = true; let isFalse = false; console.log(isTrue); // true console.log(isFalse); // false
- 布尔值,只能是
-
Number
- 用于表示整数和浮点数,没有单独的整型和浮点型,所有数字均为
double
类型。 - 特殊数字:
NaN
(非数字)和Infinity
(无穷大)。
javascript let num1 = 42; let num2 = 3.14; console.log(num1, num2); // 42 3.14
- 用于表示整数和浮点数,没有单独的整型和浮点型,所有数字均为
-
BigInt
- 用于表示大于
Number
类型范围的整数,使用n
结尾表示。
javascript let bigIntValue = BigInt(1234567890123456789012345678901234567890n); console.log(bigIntValue); // 1234567890123456789012345678901234567890n
- 用于表示大于
-
String
- 字符串是字符的集合,用于表示文本数据。可以使用单引号、双引号或反引号(ES6 中的模板字符串)包围。
javascript let str1 = "Hello"; let str2 = 'World'; let str3 = `Hello, ${str2}!`; // 模板字符串 console.log(str3); // Hello, World!
2. 引用数据类型
引用数据类型(Reference types)是可变的(mutable)数据类型,指向内存中的一个对象。JavaScript 中有几种引用数据类型:
-
Object
- 对象是键值对的集合,可以存储多种数据类型。
javascript let obj = { name: "Alice", age: 25 }; console.log(obj.name); // Alice
-
Array
- 数组是特殊类型的对象,用于存储有序的数据集合。
javascript let arr = [1, 2, 3, 4, 5]; console.log(arr[0]); // 1
-
Function
- 函数也是对象,可以被调用,用于封装可重复使用的代码。
javascript function greet() { return "Hello!"; } console.log(greet()); // Hello!
-
Date
- 用于处理日期和时间的对象,提供多种方法来操作和格式化日期。
javascript let date = new Date(); console.log(date); // 当前日期和时间
-
RegExp
- 正则表达式对象,用于模式匹配和文本搜索。
javascript let regex = /hello/i; console.log(regex.test("Hello, world!")); // true
数据类型检测
可以使用 typeof
运算符来检测变量的数据类型,但对于某些情况有特殊表现,如:
javascript
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (这是个历史遗留问题)
console.log(typeof true); // "boolean"
console.log(typeof 42); // "number"
console.log(typeof "Hello"); // "string"
console.log(typeof Symbol()); // "symbol"(ES6 引入的)
console.log(typeof BigInt(123)); // "bigint"
console.log(typeof {}); // "object"
console.log(typeof []); // "object"(数组也是对象)
console.log(typeof function(){}); // "function"
1. 使用 typeof
运算符
typeof
运算符可以用来检测数据类型,但对于对象和数组等引用类型,它的行为可能会有些模糊。
javascript
console.log(typeof {}); // "object"
console.log(typeof []); // "object"
console.log(typeof function(){});// "function"
console.log(typeof null); // "object"(这是一个历史遗留问题)
2. 使用 instanceof
运算符
instanceof
运算符用于判断一个对象是否为某个构造函数的实例,它可以有效地判断引用类型。
javascript
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(function(){} instanceof Function); // true
console.log(/regex/ instanceof RegExp); // true
3. 使用 Array.isArray()
对于数组,可以使用 Array.isArray()
方法来专门判断一个值是否为数组。
javascript
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
4. 使用 Object.prototype.toString.call()
这种方法可以提供更详细的信息,能够准确地判断不同的引用类型,包括对象、数组、函数等。
javascript
function checkType(value) {
return Object.prototype.toString.call(value);
}
console.log(checkType({})); // "[object Object]"
console.log(checkType([])); // "[object Array]"
console.log(checkType(function(){})); // "[object Function]"
console.log(checkType(/regex/)); // "[object RegExp]"
console.log(checkType(null)); // "[object Null]"(注意:`null` 是特殊情况)
5. 自定义类型检查函数
可以编写一个简单的函数来判断是否为引用类型,示例如下:
javascript
function isObject(value) {
return value !== null && typeof value === 'object';
}
console.log(isObject({})); // true
console.log(isObject([])); // true
console.log(isObject(null)); // false
console.log(isObject(42)); // false
console.log(isObject("Hello")); // false
注意事项
- null 的特例:
null
被认为是对象类型,使用typeof
时会返回"object"
。因此,在判断时要特别处理。 - 数组和对象的判断:由于
typeof
对数组的判断为"object"
,所以更推荐使用Array.isArray()
或instanceof Array
。