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.pswp.cn/diannao/78732.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78732.shtml
英文地址,請注明出處:http://en.pswp.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: …