JavaScript新数据类型

10 阅读3分钟

1. Symbol

  • 定义:表示唯一的、不可变的标识符
  • 核心特性
    • 每个Symbol值都是唯一的
    • 可作为对象属性的键
    • 不会被常规方法枚举
  • 解决的问题
    • 属性名冲突
    • 创建私有或半私有属性
    • 定义特殊的对象行为
  • 应用场景
    • 第三方库集成
      const PRIVATE_DATA = Symbol('privateData');
      class LibraryA {
        constructor(element) {
          element[PRIVATE_DATA] = { counter: 0 };
        }
      }
      
    • 实现私有属性
      const _name = Symbol('name');
      class Person {
        constructor(name) {
          this[_name] = name;
        }
      }
      
    • 自定义迭代行为
      class Collection {
        [Symbol.iterator]() {
          // 自定义迭代逻辑
        }
      }
      
    • 单例模式实现
    • 自定义类型转换

2. BigInt

  • 定义:表示任意精度的整数
  • 核心特性
    • 可表示超过Number.MAX_SAFE_INTEGER的整数
    • 使用n后缀或BigInt()构造
    • 不能与Number直接混合运算
  • 解决的问题
    • 大整数精度丢失
    • 超大整数计算
  • 应用场景
    • 金融和会计系统
      const largeAmount = 9007199254740992n;
      const interest = largeAmount * 5n / 100n;
      
    • 密码学和加密算法
      function isProbablePrime(n) {
        // 使用BigInt实现素数测试
      }
      
    • 科学计算
    • 时间戳和ID处理
    • 区块链和加密货币
      class Wallet {
        constructor() {
          this.balance = 0n; // 使用BigInt存储代币数量
        }
      }
      

3. Map

  • 定义:键值对集合,键可以是任何类型
  • 核心特性
    • 任何值都可作为键
    • 保持插入顺序
    • 提供size属性和丰富的方法
  • 解决的问题
    • 对象键只能是字符串或Symbol
    • 对象原型链属性冲突
    • 对象迭代顺序不可靠
    • 对象大小获取不直观
  • 应用场景
    • 缓存系统
      const cache = new Map();
      function memoize(fn) {
        return function(...args) {
          const key = JSON.stringify(args);
          if (!cache.has(key)) {
            cache.set(key, fn(...args));
          }
          return cache.get(key);
        };
      }
      
    • DOM元素数据关联
      const elementData = new Map();
      document.querySelectorAll('.item').forEach(el => {
        elementData.set(el, { clicked: false });
      });
      
    • 用户会话管理
    • 图数据结构实现
      class Graph {
        constructor() {
          this.nodes = new Map(); // 存储节点和邻接节点
        }
      }
      
    • 状态机实现

4. Set

  • 定义:存储唯一值的集合
  • 核心特性
    • 自动去重
    • 可存储任何类型的值
    • 保持插入顺序
  • 应用场景
    • 去重操作
      const uniqueNumbers = [...new Set([1, 2, 2, 3, 4, 4])];
      
    • 集合操作
      function intersection(setA, setB) {
        return new Set([...setA].filter(x => setB.has(x)));
      }
      
    • 唯一值检查

5. WeakMap 和 WeakSet

  • 定义
    • WeakMap:键必须是对象的Map
    • WeakSet:只能存储对象的Set
  • 核心特性
    • 弱引用,不阻止垃圾回收
    • 没有size属性,不可迭代
  • 应用场景
    • 关联数据存储
      const domData = new WeakMap();
      function setupElement(element) {
        domData.set(element, { clickCount: 0 });
      }
      
    • 缓存对象
    • 私有数据存储
      const privateData = new WeakMap();
      class User {
        constructor(name) {
          privateData.set(this, { name });
        }
        getName() {
          return privateData.get(this).name;
        }
      }
      

6. 类型化数组(Typed Arrays)

  • 定义:用于处理二进制数据的类数组对象
  • 主要类型
    • Int8Array, Uint8Array, Uint8ClampedArray
    • Int16Array, Uint16Array
    • Int32Array, Uint32Array
    • Float32Array, Float64Array
  • 应用场景
    • 二进制数据处理
      const buffer = new ArrayBuffer(16);
      const int32View = new Int32Array(buffer);
      
    • WebGL和图形处理
    • 文件和网络I/O
    • 音频处理

7. Promise(不是数据类型但很重要)

  • 定义:表示异步操作的最终完成或失败
  • 核心特性
    • 链式调用
    • 错误处理
    • 组合多个Promise
  • 应用场景
    • 异步操作序列
      fetch('/api/data')
        .then(response => response.json())
        .then(data => console.log(data))
        .catch(error => console.error(error));
      
    • 并行操作
      Promise.all([
        fetch('/api/users'),
        fetch('/api/products')
      ]).then(([usersResponse, productsResponse]) => {
        // 处理多个响应
      });
      
    • 超时处理
    • 异步资源管理