lodash 的 cloneBuffer 函数关于 Buffer 深拷贝的疑惑

发布于 2022-09-12 02:04:24 字数 1370 浏览 27 评论 0

先张贴下源码

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
}

在源码中,当 isDeeptrue,即要深拷贝时,使用的是 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...

清楚说明了 slicewithout copying 的,为什么 lodash会用作深拷贝呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

昔梦 2022-09-19 02:04:24

slice() 可以对数组的第一层级进行深拷贝, 第一层级数据类型只限基本数据类型。

人心善变 2022-09-19 02:04:24

引用 MDN 的说法:

arr.slice([begin[, end]])

slice() 方法返回一个新的数组对象,这一对象是一个由 beginend决定的原数组的浅拷贝(包括begin,不包括end)。原始数组不会被改变。

假如你 slice 的数组数据是基本类型,可以当成深拷贝来用。例如

a = [1, 2, 3, 4]
b = a.slice()
b.push(5)
console.log(a) // 1,2,3,4
console.log(b) // 1,2,3,4,5

但如果 slice 的数组数据是引用类型,就不行。

a = [{ test: 1 }]
b = a.slice()
b[0].test = 2
console.log(a[0].test) // 2
console.log(b[0].test) // 2
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文