JavaScript Symbol与BigInt

目录

Symbol类型

一、Symbol 的核心特性

1. 唯一性

2. 不可变性

3. 不可枚举性

二、创建 Symbol

1. 基础创建

2. 全局 Symbol 注册表

三、Symbol 作为对象属性

1. 定义 Symbol 属性

2. 遍历 Symbol 属性

四、内置 Symbol 值

五、实际应用场景

1. 避免属性名冲突

2. 模拟私有属性

3. 定义迭代器

六、注意事项

七、总结

BigInt类型

一、BigInt 的核心特性

1. 定义与语法

2. 类型检测

3. 数值范围

二、BigInt 的运算规则

1. 算术运算

2. 比较运算

3. 位运算

4. 禁止混合运算

三、BigInt 的创建与转换

1. 类型转换

2. 类型强制转换

四、BigInt 的应用场景

1. 高精度整数计算

2. 时间戳与唯一ID

3. 数学库与算法

五、注意事项与兼容性

1. 兼容性

2. JSON 序列化

3. Math 对象方法

4. 性能考量

六、示例代码

1. 大数计算

2. 类型检测与转换

七、总结


Symbol类型

Symbol 是 ES6 引入的一种 原始数据类型,用于创建 唯一且不可变 的标识符,常用于对象属性的键,避免命名冲突。


一、Symbol 的核心特性

1. 唯一性

每个 Symbol 值都是唯一的,即使描述符(description)相同:

const sym1 = Symbol('key');
const sym2 = Symbol('key');
console.log(sym1 === sym2); // false
2. 不可变性

Symbol 值一旦创建,无法被修改,也无法通过 new 创建(避免装箱为对象):

const sym = Symbol();
// const obj = new Symbol(); // ❌ 报错:Symbol is not a constructor
3. 不可枚举性

作为对象属性时,Symbol 键默认不会被常规方法遍历:

const obj = { [Symbol('key')]: 'value' };
console.log(Object.keys(obj)); // []
console.log(Reflect.ownKeys(obj)); // [Symbol(key)](包含 Symbol 键)

二、创建 Symbol

1. 基础创建
// 无描述符
const sym1 = Symbol();// 带描述符(用于调试)
const sym2 = Symbol('description');
console.log(sym2.description); // "description"
2. 全局 Symbol 注册表

通过 Symbol.for() 创建或获取全局共享的 Symbol:

const globalSym1 = Symbol.for('globalKey'); // 创建或获取
const globalSym2 = Symbol.for('globalKey');
console.log(globalSym1 === globalSym2); // true// 获取全局 Symbol 的键
console.log(Symbol.keyFor(globalSym1)); // "globalKey"
  • 全局注册表机制:根据 key 在全局注册表中查找或创建 Symbol。

  • 相同 key 返回同一 Symbol。


三、Symbol 作为对象属性

1. 定义 Symbol 属性
const id = Symbol('id');
const user = {name: 'Alice',[id]: 123 // Symbol 键
};console.log(user[id]); // 123
2. 遍历 Symbol 属性

需使用 Object.getOwnPropertySymbols()

const symbols = Object.getOwnPropertySymbols(user); // [Symbol(id)]

四、内置 Symbol 值

JavaScript 预定义了一系列 内置 Symbol,用于改变对象的默认行为:

内置 Symbol用途示例
Symbol.iterator定义对象的默认迭代器obj[Symbol.iterator] = function*() { yield 1; }
Symbol.toStringTag定制 Object.prototype.toString 输出obj[Symbol.toStringTag] = 'MyObject'; → obj.toString() → [object MyObject]
Symbol.hasInstance自定义 instanceof 行为class MyClass { static [Symbol.hasInstance](obj) { ... } }
Symbol.species指定派生对象的构造函数class MyArray extends Array { static get [Symbol.species]() { return Array; } }

五、实际应用场景

1. 避免属性名冲突
// 库 A 的扩展
const LIB_A_KEY = Symbol('libA');
Object.prototype[LIB_A_KEY] = function() { /* ... */ };// 库 B 的扩展
const LIB_B_KEY = Symbol('libB');
Object.prototype[LIB_B_KEY] = function() { /* ... */ };
2. 模拟私有属性
const _counter = Symbol('counter');
class Counter {constructor() {this[_counter] = 0; // “私有”属性}increment() {this[_counter]++;}
}
3. 定义迭代器
const range = {start: 1,end: 5,[Symbol.iterator]() {let current = this.start;return {next: () => ({value: current,done: current++ > this.end})};}
};for (const num of range) {console.log(num); // 1, 2, 3, 4, 5
}

六、注意事项

  1. JSON 序列化
    Symbol 属性会被 JSON.stringify() 忽略:

    const obj = { [Symbol('key')]: 'value' };
    console.log(JSON.stringify(obj)); // {}
  2. 类型转换
    Symbol 无法隐式转换为字符串或数值,需显式调用 toString()

    const sym = Symbol('desc');
    console.log(String(sym)); // "Symbol(desc)"
    console.log(sym + ''); // ❌ TypeError: Cannot convert a Symbol to a string
  3. 跨 Realm 共享
    不同 iframe 或 Web Worker 中的全局 Symbol 注册表是隔离的,需通过 postMessage 显式传递。


七、总结

特性说明
唯一性每个 Symbol 值唯一,避免命名冲突
不可变性创建后无法修改,不可通过 new 实例化
私有性通过 Symbol 键模拟私有属性(需配合模块作用域)
内置 Symbol改变对象默认行为(如迭代、类型标签)

Symbol 的核心价值 在于提供了一种安全、可控的元编程机制,适用于库开发、框架设计及复杂对象行为定制。


   

BigInt类型

BigInt 是 JavaScript 中用于表示 任意精度大整数 的数据类型,解决了传统 Number 类型在超过 2^53 - 1(即 Number.MAX_SAFE_INTEGER)时的精度丢失问题。


一、BigInt 的核心特性

1. 定义与语法
  • 字面量表示法:在数字后加 n

    const bigInt = 9007199254740993n; // 超过 Number 的安全整数范围
  • 构造函数转换:通过 BigInt() 转换其他类型。

    const fromString = BigInt("12345678901234567890");
    const fromNumber = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
2. 类型检测
  • 使用 typeof 检测返回 "bigint"

    typeof 123n; // "bigint"
3. 数值范围
  • 无固定上限:仅受内存限制,可表示任意大的整数。

  • 不支持小数:BigInt 仅用于整数,小数部分会被截断。

    BigInt(3.9); // 3n(直接截断,非四舍五入)

二、BigInt 的运算规则

1. 算术运算

支持常规运算符(+-***/%),但除法返回整数部分。

const a = 10n;
const b = 3n;
console.log(a / b); // 3n(舍去小数)
2. 比较运算

可与 Number 或其他 BigInt 进行比较(=====>< 等)。

10n === 10;   // false(类型不同)
10n == 10;    // true(值相等)
10n > 5;      // true
3. 位运算

支持位操作符(&|^<<>>),但操作数必须同为 BigInt

const mask = 0b1111n;
const result = 0b1010n & mask; // 0b1010n & 0b1111n → 0b1010n(即 10n)
4. 禁止混合运算

BigInt 与 Number 不可直接运算,需显式转换。

// 10n + 5;   // ❌ TypeError: Cannot mix BigInt and other types
10n + BigInt(5); // ✅ 15n

三、BigInt 的创建与转换

1. 类型转换
  • 字符串转 BigInt

    BigInt("123"); // 123n
    BigInt("0xFF"); // 255n(支持十六进制)
    BigInt("0b1010"); // 10n(支持二进制)
  • Number 转 BigInt

    BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
2. 类型强制转换
  • 隐式转换:部分操作(如模板字符串)会隐式调用 toString()

    `Value: ${100n}`; // "Value: 100"
  • 显式转换

    Number(100n); // 100(可能丢失精度)
    Boolean(0n);  // false(0n 为假值)

四、BigInt 的应用场景

1. 高精度整数计算

处理金融、加密算法中的大整数运算:

const largePrime = 957496696762772407663n;
const hash = largePrime * 2654435761n; // 避免溢出
2. 时间戳与唯一ID

生成高精度时间戳或分布式唯一ID:

const timestamp = BigInt(Date.now()) * 1000000n + process.hrtime.bigint();
3. 数学库与算法

实现大数阶乘、斐波那契数列等:

function factorial(n) {let result = 1n;for (let i = 2n; i <= n; i++) {result *= i;}return result;
}
console.log(factorial(20n)); // 2432902008176640000n

五、注意事项与兼容性

1. 兼容性
  • 支持环境:现代浏览器(Chrome 67+、Firefox 68+、Node.js 10.4+)。

  • Polyfill:无完美 Polyfill,可通过第三方库(如 big-integer)模拟。

2. JSON 序列化

BigInt 无法直接通过 JSON.stringify() 序列化,需自定义转换:

const data = { id: 12345678901234567890n };
const json = JSON.stringify(data, (key, value) =>typeof value === 'bigint' ? value.toString() : value
);
// {"id":"12345678901234567890"}
3. Math 对象方法

BigInt 不支持 Math 方法(如 Math.pow()),需手动实现:

function pow(base, exponent) {return base ** exponent; // 使用 ** 运算符
}
pow(2n, 10n); // 1024n
4. 性能考量
  • 内存占用:BigInt 比 Number 占用更多内存,需谨慎处理超大数值。

  • 运算速度:BigInt 运算通常慢于 Number,高频计算时需评估性能。


六、示例代码

1. 大数计算
const maxSafe = Number.MAX_SAFE_INTEGER; // 9007199254740991
const unsafe = maxSafe + 2; // 9007199254740992(精度丢失)
const safe = BigInt(maxSafe) + 2n; // 9007199254740993n(精确)
2. 类型检测与转换
const big = 100n;
if (typeof big === 'bigint') {const num = Number(big); // 转换为 Number(可能丢失精度)
}

七、总结

特性BigIntNumber
整数范围任意精度±(2^53 - 1)
小数支持是(双精度浮点数)
运算符兼容需与同类型运算,禁止混合支持常规运算
内存占用较高较低
适用场景大整数计算、加密、高精度ID常规数值运算

BigInt 的核心价值在于解决 JavaScript 中 大整数精度丢失 的问题,适用于科学计算、密码学等领域。使用时需注意兼容性、类型转换及性能影响。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/78732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI Agent工程师认证-学习笔记(3)——【多Agent】MetaGPT

学习链接:【多Agent】MetaGPT学习教程 源代码链接(觉得很好,star一下):GitHub - 基于MetaGPT的多智能体入门与开发教程 MetaGPT链接:GitHub - MetaGPT 前期准备 1、获取MetaGPT (1)使用pip获取MetaGPT pip install metagpt==0.6.6#或者在国内加速安装镜像 #pip in…

【leetcode hot 100 416】分割等和子集

解法一&#xff1a;&#xff08;动态规划&#xff09;①定义&#xff1a;dp[i]表示是否可以在nums找到元素之和为i&#xff0c;dp[sum/21] ②初始状态&#xff1a;dp[0]true;dp[i]false ③状态转移方程&#xff1a;dp[i] dp[i] || dp[i - num]; class Solution {public boole…

高中数学联赛模拟试题精选第2套几何题(改编)

在 △ A B C \triangle ABC △ABC 中, 点 M M M 是边 A C AC AC 的中点. 在线段 A M AM AM, C M CM CM 上分别取点 P P P, Q Q Q, 使得 P Q A C / 2 PQAC/2 PQAC/2. 设 △ A B Q \triangle ABQ △ABQ 的外接圆与边 B C BC BC 相交于点 X X X, △ B C P \triangle …

UWB双通道隧道人员定位方案

技术基础&#xff1a;UWB&#xff08;超宽带技术&#xff09; 定义&#xff1a;UWB&#xff08;Ultra-Wideband&#xff09;是一种通过纳秒级窄脉冲传输数据的无线通信技术&#xff0c;占用500MHz以上的超宽频段。 核心优势&#xff1a; 高精度定位&#xff1a;时间分辨率极高&…

Linux 入门八:Linux 多进程

一、概述 1.1 什么是进程&#xff1f; 在 Linux 系统中&#xff0c;进程是程序的一次动态执行过程。程序是静态的可执行文件&#xff0c;而进程是程序运行时的实例&#xff0c;系统会为其分配内存、CPU 时间片等资源。例如&#xff0c;输入 ls 命令时&#xff0c;系统创建进程…

MTCNN 人脸识别

前言 此处介绍强大的 MTCNN 模块&#xff0c;给出demo&#xff0c;展示MTCNN 的 OOP&#xff0c; 以及ROS利用 C 节点&#xff0c;命令行调用脚本执行实际工作的思路。 MTCNN Script import argparse import cv2 from mtcnn import MTCNN import osclass MTCNNProcessor:def…

01_核心系统下的技术原理解析

15年前&#xff0c;基本上国内的核心系统被C垄断&#xff0c;基本上是IBM的那套东西&#xff0c;场景也是比价复杂&#xff0c;这里不再赘述&#xff0c;TPS太过于庞大&#xff0c;技术上确实比较复杂。为此我这里抛砖引玉&#xff0c;说下对应的支付系统&#xff1a; &#x…

Python 实现最小插件框架

文章目录 Python 实现最小插件框架1. 基础实现项目结构plugin_base.py - 插件基类plugins/hello.py - 示例插件1plugins/goodbye.py - 示例插件2main.py - 主程序 2. 更高级的特性扩展2.1 插件配置支持2.2 插件依赖管理2.3 插件热加载 3. 使用 setuptools 的入口点发现插件3.1 …

电感详解:定义、作用、分类与使用要点

一、电感的基本定义 电感&#xff08;Inductor&#xff09; 是由导线绕制而成的储能元件&#xff0c;其核心特性是阻碍电流变化&#xff0c;将电能转化为磁能存储。 基本公式&#xff1a; 自感电动势&#xff1a; E -L * (di/dt) &#xff08;L&#xff1a;电感值&#xff0c…

运行一次性任务与定时任务

运行一次性任务与定时任务 文章目录 运行一次性任务与定时任务[toc]一、使用Job运行一次性任务1.创建一次性任务2.测试一次性任务3.删除Job 二、使用CronJob运行定时任务1.创建定时任务2.测试定时任务3.删除CronJob 一、使用Job运行一次性任务 1.创建一次性任务 &#xff08;…

对话记忆(Conversational Memory)

一、引言 在与大型语言模型&#xff08;LLM&#xff09;交互的场景中&#xff0c;对话记忆&#xff08;Conversational Memory&#xff09;指的是模型能够在多轮对话中保留、检索并利用先前上下文信息的能力。这一机制使得对话系统不再仅仅是“问答机”&#xff0c;而是能够持…

【HD-RK3576-PI】VNC 远程桌面连接

在当今数字化时代&#xff0c;高效便捷的操作方式是技术爱好者与专业人士的共同追求。对于使用 HD-RK3576-PI微型单板计算机的用户而言&#xff0c;当面临没有显示屏的场景时&#xff0c;如何实现远程操作桌面系统呢&#xff1f;别担心&#xff0c;VNC 远程桌面连接将为你解决这…

【unity游戏开发介绍之UGUI篇】UGUI概述和基础使用

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发介绍之UGUI篇】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言1、UI系统的重要性2、UGUI概述2.1 基本定义2.2 UGUI发展历史 3、学习U…

Ubuntu 系统深度清理:彻底卸载 Redis 服务及残留配置

Ubuntu 系统深度清理&#xff1a;彻底卸载 Redis 服务及残留配置 在Ubuntu系统中&#xff0c;Redis是一种广泛使用的内存数据存储系统&#xff0c;用于缓存和消息传递等场景。然而&#xff0c;有时候我们需要彻底卸载Redis&#xff0c;以清理系统资源或为其他应用腾出空间。本…

[ARC196A] Adjacent Delete 题解

假设 n n n 是偶数。如果我们忽略删除相邻数的条件&#xff0c;即可以任选两个数相减&#xff0c;那么答案应该是前 n 2 \frac{n}{2} 2n​ 大的数&#xff08;记作“较大数”&#xff09;的和减去前 n 2 \frac{n}{2} 2n​ 小的数&#xff08;记作“较小数”&#xff09;的和…

Linux上位机开发实践(关于Qt的移植)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 linux平台上面&#xff0c;很多界面应用&#xff0c;都是基于qt开发的。不管是x86平台&#xff0c;还是arm平台&#xff0c;qt使用的地方都比较多。…

”插入排序“”选择排序“

文章目录 插入排序1. 直接插入排序(O(n^2))举例1&#xff1a;举例2&#xff1a;直插排序的"代码"直插排序的“时间复杂度” 2. 希尔排序(O(n^1.3))方法一方法二(时间复杂度更优) 选择排序堆排序直接选择排序 我们学过冒泡排序&#xff0c;堆排序等等。&#xff08;回…

FPGA_BD Block Design学习(一)

PS端开发流程详细步骤 1.第一步&#xff1a;打开Vivado软件&#xff0c;创建或打开一个工程。 2.第二步&#xff1a;在Block Design中添加arm核心&#xff0c;并将其配置为IP核。 3.第三步&#xff1a;配置arm核心的外设信息&#xff0c;如DDR接口、时钟频率、UART接口等。 …

【Python] pip制作离线包

制作离线安装包是一种非常实用的方法&#xff0c;尤其是在网络环境受限或需要在多台机器上部署相同环境时。以下是详细的步骤&#xff0c;帮助您创建一个包含所有依赖项的离线安装包&#xff0c;并在后续环境中复用。 步骤 1&#xff1a;准备工具和环境 确保您有一台可以访问互…

为啥物联网用MQTT?

前言 都说物联网用MQTT&#xff0c;那分别使用Http和Mqtt发送“Hello”&#xff0c;比较一下就知道啦 HTTP HTTP请求报文由请求行、头部字段和消息体组成。一个最简单的HTTP POST请求如下&#xff1a; POST / HTTP/1.1 Host: example.com Content-Length: 5 Content-Type: …