JSON 方法拷贝对象,怎么识别并排除不可序列化的属性?

雨丽君_3745

雨丽君_3745

2026-06-12

823人浏览

原创

json.stringify仅序列化字符串、数字、布尔值、null、数组和纯对象,自动忽略函数、undefined、symbol、不可枚举属性及原型属性,循环引用则报错;可控排除需预处理,如定义tojson方法或设enumerable为false。

json 方法拷贝对象,怎么识别并排除不可序列化的属性?

JSON 方法本身不支持“识别并排除不可序列化属性”——它只会静默跳过那些无法序列化的值,比如函数、undefined、Symbol、循环引用等。真正能被 JSON.stringify() 处理的,仅限于字符串、数字、布尔值、null、数组和纯对象(且所有键必须是字符串)。所谓“排除”,其实是这些值根本进不了序列化流程,不是你主动过滤的结果。

哪些属性会被 JSON.stringify 自动忽略?

不是所有“不可见”或“特殊”的属性都会被跳过,关键看它是否满足 JSON 的数据模型约束:

  • 函数、undefined、Symbol 类型的值:直接被丢弃(连键名都不出现)
  • 不可枚举属性(enumerable: false):JSON.stringify() 只遍历可枚举自有属性,所以天然跳过
  • 原型链上的属性:不会被访问,只处理对象自身的可枚举属性
  • 循环引用:抛出 TypeError,不是忽略,而是中断

如何让某些属性“不出现在 JSON 字符串里”?

这不是靠“识别”,而是靠提前干预。主流做法有两种,都发生在序列化前:

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载
  • 定义 toJSON() 方法:该方法返回的对象,就是最终被序列化的结构。你可以在里面手动剔除敏感字段(如 password)、重命名或格式化值
  • 用 Object.defineProperty 设置 enumerable: false:这样属性就不会被 JSON.stringify() 遍历到,效果等同于“排除”。注意:这不改变属性值本身,只是让它对遍历不可见

为什么不能靠 JSON.stringify 检测“不可序列化”?

它没有提供回调或钩子来告诉你“这里有个函数被跳过了”。它的设计就是“尽力而为”——遇到无法表示的值,要么静默丢弃(如 undefined),要么报错(如循环引用)。想做精细控制,就得在调用前自己检查:

  • 遍历 Object.getOwnPropertyNames(obj) + Object.getOwnPropertyDescriptor(),查类型和描述符
  • 对每个值用 typeof 和 Object.prototype.toString.call() 判断是否为函数、Symbol、BigInt 等
  • 但这类检查成本高,一般只在调试或工具库中使用,生产环境更推荐用 toJSON 或预处理逻辑

替代方案:需要真正可控的深拷贝?

如果目标是“保留不可枚举属性”或“排除特定字段”,JSON.stringify() → parse() 就不合适了。应换用:

  • fast-copy + strict: true:能完整复刻属性描述符,包括不可枚举、getter/setter
  • Lodash _.cloneDeepWith:允许传入自定义克隆逻辑,可跳过指定键或类型
  • 手写递归 + getOwnPropertyDescriptors:完全掌控每个属性的拷贝行为

相关专题

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

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

2023.08.07

2075

5

json是什么
json是什么

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

2023.08.23

3102

1

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

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

2023.10.13

1056

3

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

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

2025.09.10

3519

7

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

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

2023.10.31

2811

5

php数据类型
php数据类型

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

2025.10.31

534

9

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

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

2026.02.12

482

19

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

2026.10.10

80

15

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

2026.10.10

40

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程