lodash 的 cloneBuffer 函数关于 Buffer 深拷贝的疑惑
先张贴下源码:
function cloneBuffer(buffer, isDeep) {
if (isDeep) {
return buffer.slice()
}
const length = buffer.length
const result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length)
buffer.copy(result)
return result
}
在源码中,当 isDeep
为 true
,即要深拷贝时,使用的是 buffer.slice
方法。
但是关于 slice
方法,文档有如下描述:
Returns a new Buffer that references the same memory as the original
链接:https://nodejs.org/docs/latest-v13.x/api/buffer.html#buffer_buf_slice_start_end
也即 slice
所返回的新 Buffer
和原 Buffer
指向的是同一块内存。
在和 TypedArray.slice
的对比中更有如下描述:
While TypedArray#slice() creates a copy of part of the TypedArray, Buffer#slice() creates a view over the existing Buffer without copying.
链接:https://nodejs.org/docs/lates...
清楚说明了 slice
是 without copying
的,为什么 lodash
会用作深拷贝呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
slice()
可以对数组的第一层级进行深拷贝, 第一层级数据类型只限基本数据类型。引用 MDN 的说法:
slice()
方法返回一个新的数组对象,这一对象是一个由begin
和end
决定的原数组的浅拷贝(包括begin
,不包括end
)。原始数组不会被改变。假如你 slice 的数组数据是基本类型,可以当成深拷贝来用。例如
但如果 slice 的数组数据是引用类型,就不行。