如何理解原始类型在 JSON.stringify 中对 NaN 和 Infinity 转换为 null 的规则

冬明同学_8173

冬明同学_8173

2026-05-22

576人浏览

原创

json.stringify将nan、infinity和-infinity统一序列化为null,因json标准不支持这些ieee 754扩展值;为保障可解析性与兼容性,ecmascript规范强制映射为合法json值null,该过程不可逆,原始信息丢失。

如何理解原始类型在 json.stringify 中对 nan 和 infinity 转换为 null 的规则

JSON.stringify 对 NaN、Infinity 和 -Infinity 的处理不是“转换错误”,而是明确写入规范的行为:它们统一被序列化为 null。

为什么是 null,而不是字符串或报错?

JSON 标准本身不支持 NaN 或 Infinity 字面量。原生 JSON 语法只允许 null、布尔值、数字(有限十进制)、字符串和对象/数组。JavaScript 中的 NaN 和 Infinity 属于 IEEE 754 浮点扩展值,不属于 JSON 合法数值范围。为保持兼容性和可解析性,ECMAScript 规范强制规定:这些值在序列化时必须映射为 null,而非抛出错误或保留原始语义。

实际表现与验证

以下行为一致且可复现:

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载
  • JSON.stringify({ a: NaN }) → '{"a":null}'
  • JSON.stringify({ b: Infinity }) → '{"b":null}'
  • JSON.stringify({ c: -Infinity }) → '{"c":null}'
  • 即使嵌套在数组中:JSON.stringify([NaN, Infinity]) → '[null,null]'

注意:null 不代表“丢失”,而是有明确语义的替代

这个 null 是 JSON 字符串里的合法值,不是 undefined 或空字段。后续用 JSON.parse() 解析后,得到的是真正的 JavaScript null,不再是原来的 NaN 或 Infinity。也就是说,该过程是不可逆的类型降级,原始信息已丢失。

如何避免这种隐式替换?

若需保留语义,必须主动干预:

  • 使用 replacer 函数提前识别并转为自定义字符串(如 "NaN"、"Infinity")
  • 解析端约定将特定字符串再还原为对应值(例如 value === "Infinity" ? Infinity : value)
  • 对关键字段做预处理,例如把 Infinity 替换为一个业务上无歧义的大数(如 Number.MAX_SAFE_INTEGER)

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2055

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3002

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1016

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3419

7

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

2711

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

534

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

462

19

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1678

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习