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

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
C
Check Point Blog
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Forbes - Security
Forbes - Security
IT之家
IT之家
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
雷峰网
雷峰网
N
News | PayPal Newsroom
The Last Watchdog
The Last Watchdog
V
Visual Studio Blog
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Webroot Blog
Webroot Blog
TaoSecurity Blog
TaoSecurity Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Schneier on Security
Schneier on Security
P
Privacy International News Feed
G
Google Developers Blog
博客园 - 聂微东
博客园 - 叶小钗
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Simon Willison's Weblog
Simon Willison's Weblog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
H
Hacker News: Front Page
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
T
The Exploit Database - CXSecurity.com
S
Security @ Cisco Blogs
博客园_首页
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
T
Threatpost

张鑫旭-鑫空间-鑫生活

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

(本篇完)