# rfdc 中文文档

规范地址：https://npmcn.com/package/rfdc/

版本：1\.4\.1
npm 元数据更新时间：2024-06-12T10:18:29.803Z
中文译文更新时间：2026-11-05T16:21:36.959Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/rfdc
原文对照：https://npmcn.com/package/rfdc/?lang=original
项目主页：https://github.com/davidmarkclements/rfdc#readme
源码仓库：https://github.com/davidmarkclements/rfdc

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：27.1 kB，9 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- 首次发布：2018-05-19T05:31:58.910Z
- 最新版本发布：2024-06-12T10:18:29.594Z
- 近 30 天下载量：219943326（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：15（近 12 个月 0 个）

## 中文简介

非常快的深克隆

## 安装

```sh
npm install rfdc
```

也可以使用：`pnpm add rfdc`、`yarn add rfdc`、`bun add rfdc`

## README

# 经常预算c

非常快的深克隆

[![build status](https://img.shields.io/travis/davidmarkclements/rfdc.svg)](https://travis-ci.org/davidmarkclements/rfdc) [![coverage](https://img.shields.io/codecov/c/github/davidmarkclements/rfdc.svg)](https://codecov.io/gh/davidmarkclements/rfdc) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/)

## 使用量

```js
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` 选项

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

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

以代码方式解释:

```js
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`,它需要一系列的拖累, 其中第一个项目为匹配的类,第二个项目为函数 取入并返回克隆输出 :

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

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

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

### `default` 导入

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

```js
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))`。 。 。 .

例如:

```js
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: {}}
```

## 基准

```sh
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拷贝](https://www.npmjs.com/package/fastest-json-copy) 可能更快,但它有如此巨大的局限性,很少有用。 比如说,它对待的东西像 `Date` 财务报告和审定财务报表 `Map` 实例与空相同 `{}`它不能处理循环引用. [平面对象](https://www.npmjs.com/package/plain-object-clone) 能力也确实有限.

## 测试

```sh
npm test
```

```
169 passing (342.514ms)
```

### 覆盖范围

```sh
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](https://www.fastify.io/docs/latest/Guides/Prototype-Poisoning/)。 。 。 .

## 许可证

麻省理工学院

## 常见问题

### 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 和提交记录判断。

