Node.js:Buffer.slice 和 Buffer.subarray 之间的区别

doo*_*oom 14 buffer node.js

我查看了 Node.js Buffer 文档,但不明白Buffer.sliceBuffer.subarray之间的区别。

两者都指向“与原件相同的记忆”。

但似乎没有人不是对方的别名(似乎是当事时说的)。

测试表明行为是相同的:

> buf=Buffer.from([0,1,2,3,4,5,6])
<Buffer 00 01 02 03 04 05 06>
> bufSlice=buf.slice(1,5)
<Buffer 01 02 03 04>
> bufSub=buf.subarray(1,5)
<Buffer 01 02 03 04>
> bufSlice
<Buffer 01 02 03 04>
> bufSub
<Buffer 01 02 03 04>
> buf[3]=0xff
255
> buf
<Buffer 00 01 02 ff 04 05 06>
> bufSub
<Buffer 01 02 ff 04>
> bufSlice
<Buffer 01 02 ff 04>
Run Code Online (Sandbox Code Playgroud)

(即使 Node.js 文档中的切片示例不是很清楚)。

那么有什么区别呢?

doo*_*oom 8

Buffer.slice现已弃用(自节点 16.x LTS 起)

所以现在就用吧Buffer.subarray

  • 这并没有真正回答子数组在功能方面是否与切片相同的问题。 (6认同)

Ott*_*tto 5

For a NodeJS Buffer there is no difference and indeed Buffer.slice() is deprecated now so you should use Buffer.subarray().

这种弃用可能是因为 NodeJSBuffer.slice()与 JS 中的其他调用不一致slice,例如:

const t = Buffer.from([1])
t.slice()[0]=2
console.log(t[0]) // logs 2, i.e. `slice` uses same underlying memory, like `subarray` does

const t2 = [1]
t2.slice()[0]=2
console.log(t2[0]) // logs 1, unchanged! I.e. `slice` copied underlying memory

const t3 = new Uint8Array([1])
t3.slice()[0]=2
console.log(t3[0]) // logs 1, unchanged! I.e. `slice` copied underlying memory
Run Code Online (Sandbox Code Playgroud)