Skip to content

js 数据类型

JavaScript 数据类型分为基础类型(Primitive Types)引用类型(Reference Types),它们在内存存储、赋值和比较方式上有显著区别。以下是详细分类:

一、基础类型(Primitive Types)

基础类型的值是不可变的,直接存储在栈内存中,且通过值进行比较。

1. 数值(number

  • 表示整数和浮点数,包括特殊值 NaNInfinity-Infinity
  • 示例
    javascript
    let num = 42;
    let pi = 3.14;
    let invalid = NaN;

2. 字符串(string

  • 文本数据,用单引号、双引号或反引号定义,支持模板字面量。
  • 示例
    javascript
    let name = "Alice";
    let greeting = `Hello, ${name}`; // 模板字符串

3. 布尔值(boolean

  • truefalse,用于逻辑判断。
  • 示例
    javascript
    let isLoggedIn = true;

4. null

  • 表示有意设置的空值,类型为 null
  • 示例
    javascript
    let empty = null;

5. undefined

  • 声明未初始化的变量或访问不存在的属性时返回。
  • 示例
    javascript
    let x; // undefined
    let obj = {};
    console.log(obj.foo); // undefined

6. 符号(symbol

  • ES6 引入的唯一标识符,用于对象属性键避免冲突。
  • 示例
    javascript
    const key = Symbol("unique");
    const obj = { [key]: "value" };

7. 大整数(bigint

  • ES2020 引入,处理超过 Number 安全范围的整数(末尾加 n)。
  • 示例
    javascript
    const big = 12345678901234567890n;

二、引用类型(Reference Types)

引用类型的值是可变的,存储在堆内存中,通过引用地址进行比较。

1. 对象(object

  • 键值对集合,包括普通对象、数组、函数等。
  • 示例
    javascript
    const user = { name: "Bob", age: 30 };

2. 数组(array

  • 有序值的集合,动态长度。
  • 示例
    javascript
    const fruits = ["apple", "banana", "orange"];

3. 函数(function

  • 可执行的代码块,属于特殊对象。
  • 示例
    javascript
    function add(a, b) {
      return a + b;
    }

4. 日期(Date

  • 处理日期和时间。
  • 示例
    javascript
    const today = new Date();

5. 正则表达式(RegExp

  • 用于模式匹配。
  • 示例
    javascript
    const pattern = /^[A - Za - z]+$/;

三、类型判断方法

方法适用场景
typeof检测基础类型(null 返回 'object')和函数类型。
instanceof判断对象是否为某构造函数的实例(如 arr instanceof Array)。
Array.isArray()检测是否为数组。
Object.prototype.toString.call()精准检测类型(如 [object Array])。

四、基础类型与引用类型的区别

特性基础类型引用类型
内存存储栈内存堆内存(引用地址存于栈)
可变性不可变可变
比较方式值比较引用地址比较
默认赋值行为复制值复制引用地址

五、常见面试题

  1. typeof null 为什么返回 'object'

    • 历史遗留问题,null 被错误归类为对象,实际是独立类型。
  2. NaN 如何检测?

    • 使用 isNaN()Number.isNaN()(后者更严格)。
  3. nullundefined 的区别?

    • null 是有意设置的空值,undefined 表示未初始化或不存在。
  4. 对象属性名可以是哪些类型?

    • 字符串、Symbol(ES6+),数字会自动转为字符串。

通过掌握数据类型的特性,可以避免常见错误(如内存泄漏、引用混淆),并写出更健壮的 JavaScript 代码。

Released under the MIT License.