【问题标题】:Can I convert a slice of an array to a different type?我可以将数组的切片转换为不同的类型吗?
【发布时间】:2019-07-01 09:00:32
【问题描述】:

我正在尝试从 getImageData() 返回的 ImageData 中提取画布上像素的数据。

无论以下方法是否是一个好主意(我可以只转换整个缓冲区),我想知道是否可以/允许/建议只转换该数据的一部分。

我尝试了以下

const cvs = document.getElementById("paint");
const ctx = cvs.getContext('2d');
const imageData = ctx.getImageData(0, 0, cvs.width, cvs.height);
const data = imageData.data;
data[0] = 0x11;
data[1] = 0x22;
data[2] = 0x33;
data[3] = 0x44;
console.log(new Uint32Array(data.slice(0, 4).buffer)[0].toString(16));
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>test</title>
  </head>
  <body>
  <canvas id="paint" width=500px height=500px />
  <script src="test.js"></script>
  </body>
</html>

但我真的找不到任何关于这是否被允许以及可能以哪种奇怪方式破坏的文档。 Javascript 的类型转换行为记录在哪里? 这会创建副本吗?它会访问相同的内存吗?

对不起,如果这是一个糟糕的问题。我是 Javascript 新手。

【问题讨论】:

  • 有趣的问题。要回答这个问题,需要深入了解 v8 引擎的工作原理。我个人觉得这篇文章很有用,因为它还解决了当我们用新值重新分配变量时会发生什么,这实际上可以解释你的部分问题 - 文章:nodeaddons.com/type-conversions-from-javascript-to-c-in-v8

标签: javascript arrays memory types


【解决方案1】:

如果我正确理解 MDN 文档,这似乎是安全的:data.slice() 创建数组部分的临时副本,new Uint32Array(ArrayBuffer) 为该临时副本的 ArrayBuffer 创建一个视图。由于此临时副本未在其他任何地方使用,因此不会发生数据冲突。

【讨论】:

    猜你喜欢
    • 2022-11-05
    • 2022-08-17
    • 2021-09-04
    • 2019-05-21
    • 1970-01-01
    • 2019-01-27
    • 2021-03-14
    • 2017-01-11
    • 2012-08-09
    相关资源
    最近更新 更多