rfdc

中文文档
1.4.1发布于 2024/06/12MITTypeScriptCommonJS零依赖近 30 天下载 2.2亿

非常快的深克隆

中文使用文档
文档目录10 节
  1. 使用量
  2. API 密码
  3. require('rfdc')(opts = { proto: false, circles: false, cons…
  4. default 导入
  5. 类型
  6. 基准
  7. 测试
  8. 覆盖范围
  9. __proto__ 复制自有财产
  10. 许可证

经常预算c

非常快的深克隆

build status coverage js-standard-style

使用量

const clone = require('rfdc')()
clone({a: 1, b: {c: 2}}) // => {a: 1, b: {c: 2}}

API 密码

require('rfdc')(opts = { proto: false, circles: false, constructorHandlers: [] }) => clone(obj) => obj2

proto 选项

复制原型属性以及自有属性到新对象.

在原型上允许可塑性能的速度稍快一些 以复制到被克隆的对象(不是原型,而是直接复制到对象上).

以代码方式解释:

require('rfdc')({ proto: false })(Object.create({a: 1})) // => {}
require('rfdc')({ proto: true })(Object.create({a: 1})) // => {a: 1}

设置 proto 改为 true 将提供额外的2%的性能提升.

circles 选项

跟踪循环参考文献将减缓业绩 增加25%的间接费用。 即使一个物体没有任何循环参考, 追踪的间接费用是成本。 如果有圆形对象, 默认情况下 引用转到 rfdc,它将投掷(类似于 JSON.stringify
)),会投出.

使用 circles 在 对象。 如果性能很重要, 请尝试删除循环引用 对象(设置为 undefined),然后在克隆后手动添加回来 而不是使用此选项.

constructorHandlers 选项

有时消费者可能想要为特定类别添加自定义克隆行为 (例如 RegExp 或者说 ObjectId,这些不支持的外出.

这可以通过通过 constructorHandlers,它需要一系列的拖累, 其中第一个项目为匹配的类,第二个项目为函数 取入并返回克隆输出 :

const clone = require('rfdc')({
  constructorHandlers: [
    [RegExp, (o) => new RegExp(o)],
  ]
})

clone({r: /foo/}) // => {r: /foo/}

页:1:由于性能原因,处理者只匹配一个实例 准确 类(不是子类)。 子类如果需要另加 也需要特殊的克隆行为.

default 导入

也可以使用所有选项直接导入克隆功能 默认值 :

const clone = require("rfdc/default")
clone({a: 1, b: {c: 2}}) // => {a: 1, b: {c: 2}}

类型

rfdc 克隆所有 JSON 类型 :

  • Object
  • Array
  • Number
  • String
  • null

另有支助:

  • Date (复制)
  • undefined (复制)
  • Buffer (复制)
  • TypedArray (复制)
  • Map (复制)
  • Set (复制)
  • Function (参考)
  • AsyncFunction (参考)
  • GeneratorFunction (参考)
  • arguments (复制到普通物体)

所有其他类型都有匹配输出的输出值 联 合 国 JSON.parse(JSON.stringify(o))。 。 。 .

例如:

const rfdc = require('rfdc')()
const err = Error()
err.code = 1
JSON.parse(JSON.stringify(e)) // {code: 1}
rfdc(e) // {code: 1}

JSON.parse(JSON.stringify({rx: /foo/})) // {rx: {}}
rfdc({rx: /foo/}) // {rx: {}}

基准

npm run bench
benchDeepCopy*100: 671.675ms
benchLodashCloneDeep*100: 1.574s
benchCloneDeep*100: 936.792ms
benchFastCopy*100: 822.668ms
benchFastestJsonCopy*100: 363.898ms // See note below
benchPlainObjectClone*100: 556.635ms
benchNanoCopy*100: 770.234ms
benchRamdaClone*100: 2.695s
benchJsonParseJsonStringify*100: 2.290s // JSON.parse(JSON.stringify(obj))
benchRfdc*100: 412.818ms
benchRfdcProto*100: 424.076ms
benchRfdcCircles*100: 443.357ms
benchRfdcCirclesProto*100: 465.053ms

确实 最快的json拷贝 可能更快,但它有如此巨大的局限性,很少有用。 比如说,它对待的东西像 Date 财务报告和审定财务报表 Map 实例与空相同 {}它不能处理循环引用. 平面对象 能力也确实有限.

测试

npm test
169 passing (342.514ms)

覆盖范围

npm run cov
----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.js |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|

__proto__ 复制自有财产

rfdc 工作方式与 Object.assign 在复制时 ['__proto__'] (例如何时) 对象有自己的属性密钥,称为“原型页:1 它导致目标对象 原型对象正按该对象的值设定 ['__proto__'] 拥有财产.

详细记录如何从安全角度处理这个问题 https://www.fastify.io/docs/latest/Guides/Prototype-Poisoning/ 互联网档案馆的存檔,存档日期2011-12-21。 。 。 .

许可证

麻省理工学院

版本与发布记录

rfdc 共发布 15 个版本,首次发布于 2018/05/19;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.4.1latest2024/06/122 年前
1.4.02024/06/122 年前
1.3.12024/01/192 年前
1.3.02021/03/155 年前
1.2.02021/01/165 年前
1.1.42019/05/137 年前

关于 rfdc 的常见问题

rfdc 是什么?

非常快的深克隆

如何安装 rfdc?

在项目目录运行 npm install rfdc,或使用 pnpm add / yarn add / bun add。

rfdc 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

rfdc 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

rfdc 可以商用吗?

rfdc 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

rfdc 的下载量有多少?

根据 npm 官方下载统计,rfdc 在 2026/10/05 – 2026/11/03 这 30 天内被下载 219,943,326 次,日均约 7,331,444 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

rfdc 还在维护吗?

最新版本 1.4.1 发布于 2024/06/12(2 年前);至今共发布 15 个版本,其中过去 12 个月发布了 0 个;首次发布于 2018/05/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。