说一说javascript中的数据类型?它们存储上有什么区别?

2024-07-20 14:29:16 140
在JavaScript中,数据类型分为两大类:**原始类型(Primitive Types)**和**引用类型(Reference Types)**。它们在存储和操作上的方式有所不同。

原始类型(Primitive Types)

原始类型是不可变的数据类型,包含以下几种:

  1. Number:表示整数和浮点数。

    let num = 42;
    let pi = 3.14;
    
  2. String:表示文本数据。

    let str = "Hello, world!";
    
  3. Boolean:表示真(true)或假(false)。

    let isTrue = true;
    let isFalse = false;
    
  4. Null:表示空值,即没有任何值。

    let empty = null;
    
  5. Undefined:表示未定义的值。

    let notAssigned;
    
  6. Symbol(ES6引入):表示唯一且不可变的值,通常用于对象的属性标识符。

    let sym = Symbol('unique');
    
  7. BigInt(ES2020引入):表示任意精度的整数。

    let bigInt = 123456789012345678901234567890n;
    

存储方式

原始类型的值是直接存储在变量中的。它们的大小固定,存储在栈(stack)内存中。因为它们的大小是已知的,所以在分配和访问时速度很快。

引用类型(Reference Types)

引用类型表示复杂的数据结构,包括对象、数组和函数。

  1. Object:对象是键值对的集合。

    let obj = { name: "Alice", age: 25 };
    
  2. Array:数组是按顺序排列的一组值。

    let arr = [1, 2, 3, 4];
    
  3. Function:函数是可以调用的代码块。

    function greet() {
      console.log("Hello!");
    }
    
  4. 其他对象类型:如Date、RegExp、Map、Set等。

存储方式

引用类型的值是存储在堆(heap)内存中的。变量存储的是指向这些对象的引用(或地址)。因为对象的大小是不固定的,存储在堆中可以动态调整大小。

let obj1 = { name: "Alice" };
let obj2 = obj1; // obj2 指向与 obj1 相同的对象

obj2.name = "Bob";
console.log(obj1.name); // 输出 "Bob"

原始类型与引用类型的区别

  1. 存储位置

    • 原始类型存储在栈内存中,值直接保存在变量中。
    • 引用类型存储在堆内存中,变量保存的是对对象的引用。
  2. 赋值方式

    • 原始类型赋值是复制值。
    • 引用类型赋值是复制引用。
  3. 不可变性

    • 原始类型是不可变的,一旦创建,值不能改变。
    • 引用类型是可变的,可以修改对象的属性。
  4. 比较

    • 原始类型的比较是值的比较。
    • 引用类型的比较是引用的比较。
// 原始类型比较
let a = 10;
let b = 10;
console.log(a === b); // true

// 引用类型比较
let arr1 = [1, 2, 3];
let arr2 = [1, 2, 3];
console.log(arr1 === arr2); // false

let arr3 = arr1;
console.log(arr1 === arr3); // true

总结

  • 原始类型包括Number、String、Boolean、Null、Undefined、Symbol和BigInt,它们存储在栈内存中,赋值时是值的复制。
  • 引用类型包括Object、Array、Function等,它们存储在堆内存中,变量保存的是对对象的引用,赋值时是引用的复制。