Javascript数据类型与类型判断(抄AI生成的)

3 阅读4分钟

在 JavaScript 中,数据类型可以分为两大类:基本数据类型引用数据类型。每种数据类型都有其特定的用途和特征。以下是详细的分类和说明:

1. 基本数据类型

基本数据类型(Primitive types)是不可变的(immutable)数据类型,每个值都是独立的。JavaScript 中有六种基本数据类型:

  1. Undefined

    • 表示未定义的值。只有一个值,即 undefined
    • 通常在变量声明后未赋值,或者函数没有返回值时会得到此类型。
    javascript
    let a;  
    console.log(a); // undefined  
    
  2. Null

    • 表示“无”或“空”值。只有一个值,即 null
    • 用于指示变量不指向任何对象或值。
    javascript
    let b = null;  
    console.log(b); // null  
    
  3. Boolean

    • 布尔值,只能是 true 或 false,用于逻辑运算。
    javascript
    let isTrue = true;  
    let isFalse = false;  
    console.log(isTrue); // true  
    console.log(isFalse); // false  
    
  4. Number

    • 用于表示整数和浮点数,没有单独的整型和浮点型,所有数字均为 double 类型。
    • 特殊数字:NaN(非数字)和 Infinity(无穷大)。
    javascript
    let num1 = 42;  
    let num2 = 3.14;  
    console.log(num1, num2); // 42 3.14  
    
  5. BigInt

    • 用于表示大于 Number 类型范围的整数,使用 n 结尾表示。
    javascript
    let bigIntValue = BigInt(1234567890123456789012345678901234567890n);  
    console.log(bigIntValue); // 1234567890123456789012345678901234567890n  
    
  6. String

    • 字符串是字符的集合,用于表示文本数据。可以使用单引号、双引号或反引号(ES6 中的模板字符串)包围。
    javascript
    let str1 = "Hello";  
    let str2 = 'World';  
    let str3 = `Hello, ${str2}!`; // 模板字符串  
    console.log(str3); // Hello, World!  
    

2. 引用数据类型

引用数据类型(Reference types)是可变的(mutable)数据类型,指向内存中的一个对象。JavaScript 中有几种引用数据类型:

  1. Object

    • 对象是键值对的集合,可以存储多种数据类型。
    javascript
    let obj = {  
        name: "Alice",  
        age: 25  
    };  
    console.log(obj.name); // Alice  
    
  2. Array

    • 数组是特殊类型的对象,用于存储有序的数据集合。
    javascript
    let arr = [1, 2, 3, 4, 5];  
    console.log(arr[0]); // 1  
    
  3. Function

    • 函数也是对象,可以被调用,用于封装可重复使用的代码。
    javascript
    function greet() {  
        return "Hello!";  
    }  
    console.log(greet()); // Hello!  
    
  4. Date

    • 用于处理日期和时间的对象,提供多种方法来操作和格式化日期。
    javascript
    let date = new Date();  
    console.log(date); // 当前日期和时间  
    
  5. 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