经常预算c
非常快的深克隆
使用量
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 类型 :
ObjectArrayNumberStringnull
另有支助:
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。 。 。 .
许可证
麻省理工学院