javascript如何理解Symbol和BigInt_这些新类型有何用【教程】
技术百科
紅蓮之龍
发布时间:2026-01-28
浏览: 次 Symbol是唯一键,用于避免属性名冲突;BigInt解决整数精度丢失问题,二者均非万能解,需依场景选用。
Symbol 是用来避免属性名冲突的唯一键
当你往一个对象里加属性,又不确定它原本有没有同名字段时,用字符串当 key 很容易覆盖别人的数据。Symbol 就是专治这个的:每次调用 Symbol() 都生成一个全局唯一的值,哪怕描述一样,也不相等。
-
Symbol('id')和Symbol('id')两个值不相等 —— 它们只是“长得像”,本质不同 - 想跨模块复用同一个 Symbol?用
Symbol.for('id'),它会查全局注册表,相同字符串返回同一个 Symbol - 对象上用 Symbol 当 key,
Object.keys()、for...in都看不到它,得用Object.getOwnPropertySymbols()单独捞 - 别试图把 Symbol 转成数字或字符串再参与运算 ——
Number(sym)会报错,String(sym)只能得"Symbol(description)"这种调试串
BigInt 解决的是整数精度丢失问题
JavaScript 的 Number 类型安全上限是 2**53 - 1(即 9007199254740991),超过这个数,加 1 可能没反应,比如 9007199254740992 + 1 === 9007199254740992。BigInt 就是为这种场景生的。
- 创建方式只有两种:
123456789012345678901234567890n(带n后缀)或BigInt("123...")(字符串入参,不能传小数) -
typeof 100n返回"bigint",但100n === 100是false,两者类型不同,不能混用 - 所有算术运算符(
+、-、*、**)都支持 BigInt,但/和%会向下取整(无小数),且10n / 3n得3n,不是3.333... - 和
Number混合运算直接报错:10n + 1→TypeError;必须显式转换:10n + BigInt(1)
它们都不是“私有”或“大数万能解”
有人以为 Symbol 能当私有属性用,或者 BigInt 能替代所有数字场景 —— 这是常见误读。
- Symbol 不等于私有:外部只要拿到那个 Symbol 实例(比如通过
Object.getOwnPropertySymbols()暴露、或你导出了它),照样能读写对应属性 - BigInt 不支持小数、不能用于
Math方法(Math.sqrt(100n)报错)、不能当数组索引(arr[100n]会被转成字符串"100")、JSON 序列化直接忽略(JSON.stringify({x: 100n})报错) -
浏览器兼容性要查实
:
Symbol在 IE 全系不支持;BigInt在 Safari 14+、Chrome 67+、Firefox 68+ 才可用,Node.js 从 v10.4.0 开始支持,但需开启--harmony-bigint标志(v10.7.0+ 默认启用)
什么时候该用,什么时候不该用
选型不是看新不新,而是看它是否真解决你手头的问题。
- 用
Symbol:定义常量枚举(const STATUS_PENDING = Symbol('pending'))、给第三方对象打标记(不污染原 key 空间)、实现轻量级“命名空间”逻辑 - 用
BigInt:处理数据库 long 型 ID(如 Twitter 的 Snowflake ID)、密码学运算、高精度计数器(比如区块链 nonce)、时间戳纳秒级精度(Date.now() * 1000000n) - 别用
Symbol:想真正隐藏数据、做访问控制 —— 应该用#privateField(ES2025 私有字段)或闭包 - 别用
BigInt:需要浮点计算、要进 JSON、要和 DOM API 交互(比如setTimeout(100n, ...)会失败)、性能敏感循环中频繁创建(BigInt创建比Number重)
真正难的不是记住语法,而是判断某个业务字段到底“是不是必须唯一”、某个数字“是不是真的会超安全整数范围”。很多时候,加个 console.log(Number.isSafeInteger(x)) 或翻下后端接口文档,比硬套新类型更管用。
# 后端
# safari
# 浏览器
# 注册表
# js
# json
# 循环
# javascript
# java
# String
# 字符串
# 接口
# chrome
# node
# 命名空间
# 闭包
# Object
# 运算符
# for
# node.js
# const
# 常量
# firefox
# date
# math
# 区块链
# 算术运算符
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python音视频处理高级项目教程_FFmpegP
- php下载安装选zip还是msi格式_两种安装包对
- 如何在Golang中实现文件下载_Golang文件
- 如何在Golang中写入XML文件_生成符合规范的
- 如何在 IIS 上为 ASP.NET 6 应用排除
- 如何使用Golang反射将map转换为struct
- PythonWeb前后端整合项目教程_FastAP
- php转mp4怎么保留字幕_php处理带字幕视频转
- c++中如何求一个数的平方根_c++ sqrt函数
- Win11怎么设置屏保时间_调整Win11屏幕保护
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- MySQL 中使用 IF 和 CASE 实现查询字
- Win11怎么关闭系统声音_Win11系统提示音静
- Win11文件扩展名怎么显示 Win11查看文件后
- c++怎么使用std::tuple存储多元组数据_
- c++中的可变参数模板(variadic temp
- mac本地php环境如何开启curl_curl扩展
- mac怎么安装字体_MAC添加第三方字体与字体册管
- Windows10如何更改盘符名称_Win10重命
- Windows11怎么自定义任务栏_Windows
- PHP主流架构如何处理会话管理_Session与C
- 如何在 Django 中安全修改用户密码而不使会话
- 如何使用Golang进行HTTP服务性能测试_测量
- Python迭代器生成器进阶教程_节省内存与懒加载
- Mac如何备份到iCloud_Mac桌面与文稿文件
- Python抽象类与接口设计_规范说明【指导】
- Win10如何卸载自带Edge_Win10彻底卸载
- PHP cURL GET请求:正确设置请求头与身份
- Python对象生命周期管理_创建销毁说明【指导】
- Mac如何创建和管理多个桌面空间_Mac高效多任务
- Windows 11无法安全删除U盘提示设备正在使
- C#如何使用XPathNavigator高效查询X
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- Go 中实现 Python urllib.quot
- 如何使用Golang捕获测试日志_Golang t
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- Win11怎么开启剪贴板历史记录_Windows1
- PythonFastAPI项目实战教程_API接口
- 如何在 Laravel 中通过嵌套关联关系进行 o
- Win11无法拖拽文件到任务栏怎么办_Win11开
- windows如何测试网速_windows系统网络
- Go语言中slice追加操作的底层共享机制解析
- VSC怎样在Linux运行PHP_Ubuntu系统
- Mac如何查看电池健康百分比_Mac系统信息电源检
- 如何使用Golang配置安全开发环境_防止敏感信息
- 使用类变量定义字符串常量时的类型安全最佳实践
- c++怎么调用nana库开发GUI_c++ 现代风
- php中self::能调用子类重写的方法吗_静态绑
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- Win11怎么设置声音输出设备_Windows11


QQ客服