惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Proofpoint News Feed
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Full Disclosure
云风的 BLOG
云风的 BLOG
爱范儿
爱范儿
V2EX - 技术
V2EX - 技术
B
Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
M
MIT News - Artificial intelligence
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
W
WeLiveSecurity
Stack Overflow Blog
Stack Overflow Blog
TaoSecurity Blog
TaoSecurity Blog
T
Threatpost
小众软件
小众软件
T
The Blog of Author Tim Ferriss
Google Online Security Blog
Google Online Security Blog
MongoDB | Blog
MongoDB | Blog
T
Tenable Blog
P
Privacy International News Feed
S
Security @ Cisco Blogs
H
Heimdal Security Blog
大猫的无限游戏
大猫的无限游戏
B
Blog RSS Feed
H
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Cisco Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Proofpoint News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
有赞技术团队
有赞技术团队
Application and Cybersecurity Blog
Application and Cybersecurity Blog
O
OpenAI News
Security Latest
Security Latest
S
Securelist
Cyberwarzone
Cyberwarzone
D
Docker
S
Schneier on Security
V
Vulnerabilities – Threatpost
The GitHub Blog
The GitHub Blog
P
Privacy & Cybersecurity Law Blog
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 我对CSS vertical-align的一些理解与认识(一) « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活 翻译 – CSS Sprites:实用技术还是生厌之物? « 张鑫旭-鑫空间-鑫生活 纯CSS实现易拉罐3D滚动效果 « 张鑫旭-鑫空间-鑫生活 纯CSS实现侧边栏/分栏高度自动相等 « 张鑫旭-鑫空间-鑫生活 CSS+JavaScript实现页面不同布局的切换 « 张鑫旭-鑫空间-鑫生活 JavaScript实现最简单的拖拽效果 « 张鑫旭-鑫空间-鑫生活 自己写的无图片版jQuery zxxbox弹出框插件 « 张鑫旭-鑫空间-鑫生活 中国古代道家思想与网页重构的思考 « 张鑫旭-鑫空间-鑫生活 让所有浏览器支持HTML5 video视频标签 « 张鑫旭-鑫空间-鑫生活 纯CSS实现各类气球泡泡对话框效果 « 张鑫旭-鑫空间-鑫生活 JS HEX十六进制与RGB, HSL颜色的相互转换 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变、高光等文字效果 « 张鑫旭-鑫空间-鑫生活 去除冗余 – 精简您的CSS样式代码 « 张鑫旭-鑫空间-鑫生活 对overflow与zoom”清除浮动”的一些认识 « 张鑫旭-鑫空间-鑫生活 jQuery Pagination Ajax分页插件中文详解 « 张鑫旭-鑫空间-鑫生活 absolute绝对定位的非绝对定位用法 « 张鑫旭-鑫空间-鑫生活 网页布局思想浅议-淘宝新版首页为实例 « 张鑫旭-鑫空间-鑫生活 回流与重绘:CSS性能让JavaScript变慢? « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(二) « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(一) « 张鑫旭-鑫空间-鑫生活 60个极富创造性的震撼的电影海报设计 « 张鑫旭-鑫空间-鑫生活 jQuery Lightbox(balupton版)图片展示插件讲解 « 张鑫旭-鑫空间-鑫生活 博客内嵌flash音乐播放器代码、下载与使用 « 张鑫旭-鑫空间-鑫生活 CSS3 animate实现图片墙3D翻转效果 « 张鑫旭-鑫空间-鑫生活 图片旋转效果的一些研究、jQuery插件及实例 « 张鑫旭-鑫空间-鑫生活 CSS3 border-image详解、应用及jQuery插件 « 张鑫旭-鑫空间-鑫生活 jQuery-两款不同原理的圆角插件讲解 « 张鑫旭-鑫空间-鑫生活 页面可用性之outline轮廓外框的一些研究 « 张鑫旭-鑫空间-鑫生活 CSS3 transition实现超酷图片墙动画效果 « 张鑫旭-鑫空间-鑫生活 HTML CSS列表元素ul,ol,dl的研究与应用 « 张鑫旭-鑫空间-鑫生活 jQuery图片文本滚动切换插件jCarousel中文翻译与详解 « 张鑫旭-鑫空间-鑫生活 酷酷的jQuery鼠标悬停图片放大切换显示效果 « 张鑫旭-鑫空间-鑫生活 IE6下z-index犯癫不起作用bug的初步研究 « 张鑫旭-鑫空间-鑫生活 checkbox复选框的一些深入研究与理解 « 张鑫旭-鑫空间-鑫生活 jQuery之使用slideToggle实现垂直下拉菜单 « 张鑫旭-鑫空间-鑫生活 jQuery-innerfade内部列表自动淡入淡出插件 « 张鑫旭-鑫空间-鑫生活 jQuery-火焰灯效果导航菜单 « 张鑫旭-鑫空间-鑫生活 IE下css bug集合-翻译自haslayout.net « 张鑫旭-鑫空间-鑫生活 翻译-IE7/8@font-face嵌入字体与文字平滑 « 张鑫旭-鑫空间-鑫生活 jQuery-马化腾产品设计与用户体验的一些技术实现 « 张鑫旭-鑫空间-鑫生活 像素的世界及其在web开发制作中的应用 « 张鑫旭-鑫空间-鑫生活 css行高line-height的一些深入理解及应用 « 张鑫旭-鑫空间-鑫生活 CSS实现圆角六色渐变自适应按钮详解 « 张鑫旭-鑫空间-鑫生活 我熟知的三种三栏网页宽度自适应布局方法 « 张鑫旭-鑫空间-鑫生活 jQuery照片图像剪裁插件Jcrop中文翻译详解 « 张鑫旭-鑫空间-鑫生活 Ajax Upload多文件上传插件翻译及中文演示 « 张鑫旭-鑫空间-鑫生活 告别图片—使用字符实现兼容性的圆角尖角效果beta版 « 张鑫旭-鑫空间-鑫生活 大小不固定的图片、多行文字的水平垂直居中 « 张鑫旭-鑫空间-鑫生活 jQuery boxy弹出层对话框插件中文演示及讲解 « 张鑫旭-鑫空间-鑫生活 JavaScript实现新浪微博文字放大显示动画效果 « 张鑫旭-鑫空间-鑫生活 翻译:让网络更快一些——最小化浏览器中的回流(reflow) « 张鑫旭-鑫空间-鑫生活 jQuery之addClasas与removeClass使用实例 « 张鑫旭-鑫空间-鑫生活 关于Google圆角高光高宽自适应按钮及其拓展 « 张鑫旭-鑫空间-鑫生活 JavaScript实现图片幻灯片滚动播放动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery-鼠标经过显示大图并跟随鼠标效果插件 « 张鑫旭-鑫空间-鑫生活 关于gif图片(或png8)杂边锯齿的问题 « 张鑫旭-鑫空间-鑫生活 对html与body的一些研究与理解 « 张鑫旭-鑫空间-鑫生活 鲜为人知的一个解决兼容性问题的利器——小数 « 张鑫旭-鑫空间-鑫生活 搜狐白社会似iphone短信对话框效果的优化 « 张鑫旭-鑫空间-鑫生活 关于文字内容溢出用点点点(…)省略号表示 « 张鑫旭-鑫空间-鑫生活 jquery之append与insertBefore使用实例 « 张鑫旭-鑫空间-鑫生活 jQuery之图片关联伸缩效果 « 张鑫旭-鑫空间-鑫生活 jquery之图片左右切换动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery之replace字符串替换实现不同尺寸图片切换 « 张鑫旭-鑫空间-鑫生活 jQuery-实现图片的放大镜显示效果 « 张鑫旭-鑫空间-鑫生活 jQuery-单击文字或图片内容放大显示效果插件 « 张鑫旭-鑫空间-鑫生活 reflection.js-实现图片投影倒影效果js插件 « 张鑫旭-鑫空间-鑫生活 jQuery-很酷的弹出层效果js插件 « 张鑫旭-鑫空间-鑫生活 复选框单选框与文字对齐问题的研究与解决 « 张鑫旭-鑫空间-鑫生活 css margin的相关属性,问题及应用 « 张鑫旭-鑫空间-鑫生活 IE6下png背景不透明问题的综合拓展 « 张鑫旭-鑫空间-鑫生活
JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活
张鑫旭,zhangxinxu · 2026-05-06 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=12158
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

在前端开发中,JSON对象的方法我们最常用的就是parsestringify,几乎每天都在和它们打交道——接口请求后用parse解析数据,提交数据前用stringify序列化对象。

但如果你最近关注JS的新特性,会发现多了一个不怎么起眼但却很实用的方法:JSON.rawJSON。

很多同学看到这个方法会一脸疑惑:stringify已经能序列化数据了,为什么还要整个rawJSON?它到底解决了什么问题?

今天我们就抛开晦涩的官方文档,用最接地气的方式,把JSON.rawJSON的作用、用法和避坑点讲明白,看完就能直接用到项目里。

JSON示意图

一、stringify的“隐形坑”

在讲rawJSON之前,我们先看一个日常开发中很容易踩的坑,也是rawJSON诞生的核心原因。

大家都知道,JavaScript里的数字都是浮点数,这就导致有些超大整数无法被精确表示。比如我们有一个超大的ID值:12345678901234567890,当我们用stringify序列化它时,会发现一个诡异的问题:

// 期望序列化出 12345678901234567890
console.log(JSON.stringify({ id: 12345678901234567890 }));
// 实际输出:{"id":12345678901234567000}

注意看,末尾的数字被自动“四舍五入”了,精度直接丢失!这不是bug,而是JavaScript浮点数的固有缺陷——它无法精确表示所有整数,当数字超过2^53时,就会出现精度偏差。

这个问题在对接后端接口时尤为常见,比如后端返回的用户ID、订单号是超大整数,前端用stringify序列化后,再传给后端,就会导致ID错误,进而出现查不到数据、订单异常等问题。

有人会说:那我把数字转成字符串不就行了?比如这样:

console.log(JSON.stringify({ id: "12345678901234567890" }));
// 输出:{"id":"12345678901234567890"}

这样确实能保留精度,但新的问题来了:后端接口期望的id是数字类型,而我们传过去的是字符串,会导致接口报错。这就陷入了一个两难境地:传数字,精度丢失;传字符串,类型不符。

而,JSON.rawJSON 就是为了解决这个“两难”而生的。

解决两难

二、JSON.rawJSON的核心作用

官方对JSON.rawJSON的定义很简单:创建一个“原始JSON对象”,当这个对象被JSON.stringify序列化时,会直接将传入的字符串作为JSON文本的一部分,不做任何转义、不做任何修改,也不会添加额外的引号。

说得更通俗一点:rawJSON就像是一个“容器”,你把一段合法的JSON文本放进去,它会告诉stringify:“这段内容你别乱动,直接原样输出就行”。

我们用刚才的超大整数案例来测试一下,就能瞬间明白它的作用:

// 传入一段表示超大整数的JSON文本(注意是字符串形式)
const rawId = JSON.rawJSON("12345678901234567890");
// 序列化包含rawJSON对象的对象
console.log(JSON.stringify({ id: rawId }));
// 输出:{"id":12345678901234567890}

完美!

完美表情包

既保留了超大整数的精度,又保证了序列化后的id是数字类型,后端接口能正常接收。

这就是rawJSON最核心的作用——让我们能“手动控制”JSON序列化的结果,解决stringify无法处理的精度丢失、类型不符等问题。

再举一个更直观的对比,帮大家分清rawJSON和普通字符串的区别:

// 普通字符串
const normalStr = "12345678901234567890";
// rawJSON对象
const rawStr = JSON.rawJSON("12345678901234567890");

// 分别序列化
console.log(JSON.stringify({ normal: normalStr })); // {"normal":"12345678901234567890"}
console.log(JSON.stringify({ raw: rawStr }));       // {"raw":12345678901234567890}

很明显:普通字符串会被stringify加上引号,变成字符串类型;而rawJSON对象会被原样输出,保持原本的JSON类型(这里是数字)。

三、rawJSON的3个关键细节

很多同学用rawJSON时会踩坑,不是因为方法本身难,而是没注意它的几个关键细节。

结合日常开发场景,我把这些细节整理出来,帮大家避坑。

避坑

细节1:传入的必须是“合法的JSON原语文本”

rawJSON的参数必须是一段合法的JSON文本,而且只能是JSON原语(数字、字符串、布尔值、null),不能是对象或数组。

如果传入的文本不合法,或者是对象/数组,会直接抛出SyntaxError错误。

// 合法:数字文本
JSON.rawJSON("123"); // 正确
// 合法:字符串文本(注意内部要加引号)
JSON.rawJSON('"hello"'); // 正确,序列化后是"hello"
// 合法:布尔值文本
JSON.rawJSON("true"); // 正确
// 非法:传入对象文本(会报错)
JSON.rawJSON('{"name":"张三"}'); // SyntaxError
// 非法:传入不合法的JSON文本(会报错)
JSON.rawJSON("123abc"); // SyntaxError

这里有个容易踩的坑:如果想序列化字符串类型的内容,传入的文本必须加上引号。

比如我们想让序列化后的结果是字符串”hello”,就必须传入'”hello”‘(外层是参数的引号,内层是JSON字符串的引号),否则会报错。

细节2:返回的是“特殊对象”,不是普通值

JSON.rawJSON返回的不是字符串,也不是数字,而是一个特殊的“原始JSON对象”。这个对象有两个特点:

  1. 它的原型是null,而且是冻结的(frozen),无法修改它的属性,也无法给它添加新属性,避免被意外篡改;
  2. 它有一个public属性rawJSON,里面存储着我们传入的原始字符串;

我们可以打印出来看看:

const raw = JSON.rawJSON("123456");
console.log(raw); // 输出:{ rawJSON: "123456" }
console.log(Object.getPrototypeOf(raw)); // null
console.log(Object.isFrozen(raw)); // true

这个特殊对象的唯一作用,就是告诉JSON.stringify:“我里面的内容要原样输出”。

除此之外,它没有其他实际用途,也不能当作普通对象使用。

细节3:配合JSON.isRawJSON判断是否为rawJSON对象

既然rawJSON返回的是特殊对象,那我们怎么判断一个值是不是rawJSON对象呢?

JS提供了对应的判断方法:JSON.isRawJSON。

这个方法很简单,传入一个值,返回布尔值,true表示是rawJSON对象,false表示不是。

const raw = JSON.rawJSON("123");
const normal = 123;

console.log(JSON.isRawJSON(raw)); // true
console.log(JSON.isRawJSON(normal)); // false
console.log(JSON.isRawJSON({})); // false

这个方法在实际开发中很实用,比如我们接收一个未知值,想判断它是不是rawJSON对象,再决定如何处理,就可以用它。

四、JSON.rawJSON的实际应用场景

讲完了细节,我们再说说rawJSON在实际开发中到底能用到哪些地方。除了前面提到的“超大整数精度保留”,还有两个高频场景。

场景1:解决超大整数、BigInt序列化问题

除了普通的超大整数,BigInt类型的序列化也是一个痛点。默认情况下,stringify无法序列化BigInt,会直接报错:

const bigNum = 12345678901234567890n;
JSON.stringify({ num: bigNum }); // Uncaught TypeError: Do not know how to serialize a BigInt

这时候,我们就可以用rawJSON来解决:
const bigNum = 12345678901234567890n;
// 将BigInt转成字符串,传入rawJSON
const rawBig = JSON.rawJSON(bigNum.toString());
// 序列化后正常输出数字类型
console.log(JSON.stringify({ num: rawBig })); // {"num":12345678901234567890}

这样既解决了BigInt无法序列化的问题,又保留了数字类型,后端接口也能正常接收。

场景2:精确控制JSON序列化格式

有时候,我们需要让JSON序列化的结果完全符合特定格式,而stringify的默认处理会不符合预期。

例如下面的例子:

// 普通方式 - JS 自动解析 Unicode 转义
const emoji1 = "\ud83d\ude04";  // JS 字符串 = 1个字符 "😄"
console.log(JSON.stringify({ emoji: emoji1 }));
// 输出: {"emoji":"😄"}  ❌ 自动转成了表情符号

// rawJSON 方式 - 强制保留转义序列形式
const emoji2 = JSON.rawJSON('"\\ud83d\\ude04"');
// 参数 "\\\\u..." 在 JS 中 = "\\ud83d\\ude04"(2个反斜杠)
// 作为 JSON 字符串 = \ud83d\ude04(1个反斜杠)
// 解析后 = "😄"
console.log(JSON.stringify({ emoji: emoji2 }));
// 输出: {"emoji":"\ud83d\ude04"}  ✅ 保留转义序列字面形式

不过这种场景实际开发中并不多见。

避坑提醒:这些情况别用rawJSON

rawJSON虽然实用,但不是万能的,有些场景下使用反而会给自己添麻烦。结合我的开发经验,总结了3个“别用”的场景:

  1. 不需要精确控制序列化结果时,别用。如果只是普通的对象序列化,用stringify就足够了,rawJSON会增加不必要的代码复杂度;
  2. 传入的内容不是合法JSON原语时,别用。强行传入对象、数组或非法JSON文本,会直接报错,反而影响代码运行;
  3. 兼容性要求高的项目,慎用。rawJSON是ES2025引入的新特性,目前(2026年)Chrome、Edge等现代浏览器已经支持,但一些老旧浏览器(比如IE)、部分国产浏览器(尤其是电视端、低端设备)还不支持,需要做好兼容处理(可以用ponyfill填充)。

五、兼容性、ponyfill及结语

rawJSON方法的兼容性如下图所示:

rawJSON兼容性

ponyfill

JSON.rawJSON 和 isRawJSON 的 ponyfill可以参见这个项目:https://github.com/ungap/raw-json

最后总结

其实JSON.rawJSON的核心逻辑很简单,一句话就能概括:让JSON.stringify“原样输出”一段合法的JSON原语文本,解决精度丢失、类型不符、格式控制等问题。

我们不用把它想得太复杂,记住它的核心场景——超大整数/BigInt序列化、精确控制JSON格式,在需要的时候用它,就能解决很多开发中的“隐形坑”。

另外,提醒大家一句:rawJSON不是要替代stringify,而是对stringify的补充。大多数情况下,我们还是用stringify;只有遇到stringify解决不了的问题时,再考虑用rawJSON。

最后留一个小练习,大家可以自己动手试试:用rawJSON序列化一个布尔值true,再用stringify输出,看看结果是什么?欢迎在评论区留下你的答案~

美少女飞吻

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=12158

(本篇完)