V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
autoxbc
V2EX  ›  JavaScript

大家评评理,去 Deno 提 issue,几位大佬拒不认错

  •  1
     
  •   autoxbc · 2021-10-11 10:34:22 +08:00 · 5390 次点击
    这是一个创建于 1144 天前的主题,其中的信息可能已经有所发展或是发生改变。
    讨论串在这里
    https://github.com/denoland/deno/issues/12298

    核心问题是,从本地文件创建的 Uint8Array 和其对应的 ArrayBuffer 不一致(buffer 结尾多了一个字符),大佬非说这也正常,让我自己改调用方式去 workaround

    我本来支持的 issue 发起者已经认怂了,我不服气
    第 1 条附言  ·  2021-10-11 17:39:40 +08:00
    大佬很坚决,看来这个怪异的设计要保留了,ArrayBuffer 变成薛定谔的 Buffer 了,view 之前无法预测任何细节
    11 条回复    2022-02-24 00:14:09 +08:00
    oott123
        1
    oott123  
       2021-10-11 10:41:17 +08:00
    Uint8Array 是 ArrayBuffer 的一个 view,你要读底下的 buffer 的话,还得看 byteOffset 和 length 这两个属性。

    这确实只能说行为变了,而不能说是 bug 。虽然很多大型项目这种行为变化也会慎重考虑甚至写进 changelog,但对于 deno 这种<del>玩票性质</del>严格遵守最佳实践的项目文档里没有的东西当然是说变就变了。
    autoxbc
        2
    autoxbc  
    OP
       2021-10-11 10:52:41 +08:00
    @oott123 #1 这是一个基于 ArrayBuffer 全量构造的 Uint8Array,不存在 byteOffset 和 length 的问题,两者长度严格相等是很自然的要求
    oott123
        3
    oott123  
       2021-10-11 10:56:55 +08:00   ❤️ 1
    @autoxbc 我手头没有 deno 环境,如果能把 byteOffset 和 length 两个属性打出来看看就好了。至于是不是“基于 ArrayBuffer 全量构造的 Uint8Array”的,我想文档里应该没有定义它是,所以是和不是都合法。
    libook
        4
    libook  
       2021-10-11 12:22:40 +08:00
    当前其实有 3 个问题杂糅在一起了,第一个问题是 Uint8Array 和 ArrayBuffer 是不是“1-to-1 match”的:

    去查了查 ES 规范,不知道是否有参考价值:
    https://262.ecma-international.org/6.0/#sec-uint8array
    用 TypedArray 通用规范来描述的:
    https://262.ecma-international.org/6.0/#sec-typedarray-constructors
    然后看用什么方法转换格式:
    https://262.ecma-international.org/6.0/#table-49
    用的是 ToUint8 方法进行的转换:
    https://262.ecma-international.org/6.0/#sec-touint8
    到这里就能看到,数据不是完全映射过去的。

    个人认为 maintainer 对于“not that they're a 1-to-1 match”的观点是对的。

    另一个问题是这个算不算是 breaking change:
    如果出问题的用法是规范明确提到的常规用法的话,那么这个确实算是 breaking change,在 changelog 里应当提到。

    第三个问题是 Deno 的相关 API 返回什么数据类型是合理的,这个就有太多主观因素了。

    这些我都没怎么用过,只是花了几分钟去探究了一下,要是说得不对请指正。
    说实话,Deno 推广的时候用了太多歪门邪道,导致我对它的印象一直都不大好。
    mxT52CRuqR6o5
        5
    mxT52CRuqR6o5  
       2021-10-11 12:48:36 +08:00
    ```
    const input = document.createElement("input");
    input.type = "file";
    input.addEventListener("change", async (event) => {
    const arrayBuffer = await input!.files![0].arrayBuffer();
    const uint8Array = new Uint8Array(arrayBuffer).subarray(0, 1);
    console.log(uint8Array.byteLength);
    console.log(uint8Array.buffer.byteLength);
    });
    document.body.append(input);
    ```
    在 chrome 上试了一下,一个 uint8Array 实例的 byteLength 和它的 buffer.byteLength 不一样是可以达到的,那就没有不合 js 规范的问题,单纯的是 Deno.readFileSync 表现的问题
    Mohanson
        6
    Mohanson  
       2021-10-11 13:33:13 +08:00
    不算难以理解, ArrayBuffer 毕竟是 Buffer, 不能对这个底层实现的 Buffer 有先验知识. 这种问题最好加一下 changelog 但个人不认为是 bug.
    autoxbc
        7
    autoxbc  
    OP
       2021-10-11 16:09:05 +08:00
    @libook #4 我并不介意 breaking change,Deno 这类变动很多次了。只是这次摆出我定义这是一个 feature 他就不是一个 bug 不对劲
    autoxbc
        8
    autoxbc  
    OP
       2021-10-11 16:15:47 +08:00
    @mxT52CRuqR6o5 #5 长度不一致是正常的,但前提是构造的时候切过了,这全量构造是不一样的
    mxT52CRuqR6o5
        9
    mxT52CRuqR6o5  
       2021-10-11 16:21:06 +08:00
    @autoxbc
    你 Deno.readFileSync 就已经拿到的是 uint8array 了,切还是全量构造是 Deno.readFileSync 内部的事情,为什么你认为 Deno.readFileSync 一定要给你全量构造的 uint8array
    现在作者明显就是想要 Deno.readFileSync 返回切过的 uint8array 这个效果,那肯定说这是个 feature 啊
    iugo
        10
    iugo  
       2022-02-23 15:29:05 +08:00
    不知道我看到的情况和当时有多大差别, 但主要维护者还是对这样的修改有讨论的: https://github.com/denoland/deno/pull/12057#pullrequestreview-753151404

    还是一个 API 设计问题吧, 可以讨论.
    autoxbc
        11
    autoxbc  
    OP
       2022-02-24 00:14:09 +08:00
    @iugo #10 谢谢,原来是为了优化读取性能。不过也只是微小的提升,就搞了个丑设计,感觉得不偿失
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1112 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:31 · PVG 03:31 · LAX 11:31 · JFK 14:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.