当前位置: 首页 > news >正文

Javascript NaN Symbol BigInt

朋友们,请先欣赏这段让无数JS开发者深夜崩溃的代码:

console.log(NaN === NaN); // false
console.log(typeof NaN); // “number”
image.png

这就像发现自家冰箱说"我不是冰箱"却还坚持制冷——NaN就是JavaScript里的量子幽灵!今天,就让我们用《生活大爆炸》谢耳朵的较真精神,拆解ES6类型系统的三大"怪胎":

🐱‍👓 第一定律:NaN的薛定谔猫笼
想象你把一只猫、一瓶毒药和放射性原子关进黑箱。在打开前,猫既是活的又是死的——这就是NaN的量子态!它诞生于各种"数字自杀现场":

const quantumCat = 0/0; // 除零惨案
const schrodingerCat = +“hello”; // 字符串转数字失败
诡异的是:所有NaN都不等于自己!这就像克隆人军团每个都说"我是本体",但DNA检测显示:

console.log(quantumCat === schrodingerCat); // false
😅更荒诞的是typeof NaN === “number”——好比微波炉炸了厨房,厂家却说:“它确实是厨具”(1997年ES1的历史包袱)。检测量子幽灵的正确姿势:

// 错误示范:if (x === NaN)
if (Number.isNaN(x)) {
console.log(“抓到量子猫了!”);
}
image.png
🪪 第二定律:Symbol的元宇宙身份证
如果NaN是量子幽灵,Symbol就是元宇宙的加密数字DNA!每次调用Symbol()就像在区块链上铸造NFT:

const metaverseID = Symbol(“身份证”);
const fakeID = Symbol(“身份证”);

console.log(metaverseID === fakeID); // false
// 即使标签相同也是平行宇宙的个体!
实战神技:用Symbol.iterator给普通对象安装"流水线传送带":

const myGameInventory = {
items: [“光剑”, “等离子炮”, “曲速引擎”],
Symbol.iterator { // 此处有宝藏
let index = 0;
return {
next: () =>
index < this.items.length ?
{ value: this.items[index++], done: false } :
{ done: true }
};
}
};

for (const item of myGameInventory) {
console.log(装备:${item});
}
// 输出:光剑 → 等离子炮 → 曲速引擎
在大型项目中,Symbol属性键就像给代码上了量子锁:

const PRIVATE_KEY = Symbol(“金库密码”);
const bank = {
balance: 1000000,
[PRIVATE_KEY]: “0x8f8a2d3c” // 黑客永远找不到!
};
image.png
💰 第三定律:BigInt的金融革命
先看这个让程序员怀疑人生的等式:

console.log(0.1 + 0.2 === 0.3); // false!
image.png

这不是bug!是IEEE 754浮点数的设计局限:

   64位数字存储结构

┌──符号位──┬───11位指数位───┬──52位尾数位──┐
0 1 12 64

尾数位只能精确表示52位二进制小数,0.1在内存中其实是:

0.1000000000000000055511151231257827021181583404541015625
BigInt的降维打击:开辟任意长度的整数内存!

// Number的精度上限(2^53)
console.log(9007199254740992 === 9007199254740993); // true!

// BigInt突破次元壁
const billion1 = 9007199254740993n;
const billion2 = 9007199254740994n;
console.log(billion1 === billion2); // false
金融计算实战:

// 传统方案:小数转整数(依然有精度风险)
const total = (0.1 * 100 + 0.2 * 100) / 100; // 0.3

// BigInt原子级精度
const cryptoTransaction = {
eth: 1000000000000000000n, // 1 ETH = 10^18 wei
gas: 210000000000000n
};
console.log(eth + gas); // 1000210000000000000000n
image.png
🧪 类型检测的量子纠缠
JS类型体系就像多宇宙理论:

     JavaScript数据类型/      \原始类型      对象类型

┌────┬────┬────┬────┬───┐ ┌──────┐
│Null│未定义│布尔│字符│数字│Symbol │ Object │
└────┴────┴────┴────┴───┘ └──────┘
╱ ╲
Number BigInt

NaN (量子幽灵)
历史悬案解密:为什么typeof NaN === ‘number’?

// 1997年ES1标准定义:
typeof 37 === ‘number’; // true
typeof NaN === ‘number’; // 被迫true
因为NaN本质是数字运算的失败产物,就像试图用微波炉制冷——设备还是厨房电器,但产出已不是食物!

💔 类型番外篇:undefined与null的分手大戏
这对数据类型界的"前任情侣"总让人混淆:

undefined:“我从未定义过你!”(像删除联系方式的前任)
null:“我们结束了”(像通讯录里备注"别联系"的前任)
image.png

let ex;
console.log(ex); // undefined (从未赋值)

ex = null;
console.log(ex); // null (主动清空)
用代码验证关系状态:

console.log(void 0 === undefined); // true (void操作符必返undefined)
console.log(typeof null); // “object” (史上最大设计失误!)
🧪 类型体操实验室
Symbol跨模块通信:

// 元宇宙全球身份证注册
const globalID = Symbol.for(“跨次元通行证”);

// 平行宇宙验证
console.log(Symbol.keyFor(globalID)); // “跨次元通行证”
BigInt时空转换:

// 小心!不同次元不能直接运算
console.log(500n + 500); // 报错!

// 合法穿越方案
console.log(500n + BigInt(500)); // 1000n
console.log(Number(500n) + 500); // 1000
🌌 宇宙真理公式
当你在JS世界探索时,请默念这三条次元定律:

  1. NaN !== NaN // 量子不确定性原理
  2. 123n !== 123 // 整数宇宙与浮点宇宙不可互通
  3. Symbol() !== Symbol() // 元宇宙身份证不可克隆
    下次见到NaN,请优雅地打招呼:“看,这是数字界的薛定谔猫!” 而用BigInt处理金融数据时,记得对浮点数说:“大人,时代变了!”

终极彩蛋:console.log(typeof function(){}); // “function”
然而ECMA规范说:函数只是可调用的object!🧐

http://www.dtcms.com/a/296867.html

相关文章:

  • 论文阅读:《无约束多目标优化的遗传算法,群体和进化计算》
  • 【25-cv-3322、25-cv-3323】Aeropostale连发两案!12个商标冻住600多家店铺
  • Android集成Google Map
  • 基于自适应控制算法的SVC与STATCOM联合优化
  • 如何在IEEE上检索文献|综述性文献
  • springboot 一键下载文件
  • Linux操作系统原理与应用
  • 河南萌新联赛2025第(二)场:河南农业大学
  • 使用Docker+Nginx部署电商平台项目(服务端+管理端+商城)
  • 基于STM32智能鱼缸监控投喂系统
  • Kubernetes 集群架构和Pod创建流程
  • 优选算法:移动零
  • 激光雷达的单播和广播模式介绍
  • 2025年海外短剧独立站开发:H5+PC端双平台技术实践与增长策略
  • 处理HTTP请求体:精通`@RequestBody`、`@RequestHeader`与`@CookieValue`
  • 计算机视觉技术剖析:轮廓检测、模板匹配及特征点匹配
  • SpringBoot框架简介
  • Windows本地部署DeepSeek
  • git更新内核补丁完整指南
  • 【C++】使用中值滤波算法过滤数据样本中的尖刺噪声
  • Java 并发容器:ConcurrentHashMap 笔记(JDK 1.8)
  • 01_FOC学习之先让电机转动起来
  • 双紫擒龙紫紫红黄安装使用攻略,2025通达信指标源码,擒龙追踪源码公式学习
  • 爬虫基础概念
  • 浏览器访问[http://www.taobao.com](http://www.taobao.com/),经历了怎样的过程。
  • DNS域名解析过程
  • 通达OA二次开发
  • Impact rating 影响等级定义(学习笔记)
  • YOLOv8 剪枝模型加载踩坑记:解决 YAML 覆盖剪枝结构的问题
  • 【JAVA】使用vosk实现windows实时语音转文字,解放双手