大家评评理,去 Deno 提 issue,几位大佬拒不认错 - V2EX
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 日 5880 次点击
    这是一个创建于 1606 天前的主题,其中的信息可能已经有所发展或是发生改变。
    讨论串在这里
    https://github.com/denoland/deno/issues/12298

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

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

    这确实只能说行为变了,而不能说是 bug 。虽然很多大型项目这种行为变化也会慎重考虑甚至写进 changelog,但对于 deno 这种<del>玩票性质</del>严格遵守最佳实践的项目文档里没有的东西当然是说变就变了。
    autoxbc
        2
    autoxbc  
    OP
       2021 年 10 月 11 日
    @oott123 #1 这是一个基于 ArrayBuffer 全量构造的 Uint8Array,不存在 byteOffset 和 length 的问题,两者长度严格相等是很自然的要求
    oott123
        3
    oott123  
       2021 年 10 月 11 日   1
    @autoxbc 我手头没有 deno 环境,如果能把 byteOffset 和 length 两个属性打出来看看就好了。至于是不是“基于 ArrayBuffer 全量构造的 Uint8Array”的,我想文档里应该没有定义它是,所以是和不是都合法。
    libook
        4
    libook  
       2021 年 10 月 11 日
    当前其实有 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 日
    ```
    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 日
    不算难以理解, ArrayBuffer 毕竟是 Buffer, 不能对这个底层实现的 Buffer 有先验知识. 这种问题最好加一下 changelog 但个人不认为是 bug.
    autoxbc
        7
    autoxbc  
    OP
       2021 年 10 月 11 日
    @libook #4 我并不介意 breaking change,Deno 这类变动很多次了。只是这次摆出我定义这是一个 feature 他就不是一个 bug 不对劲
    autoxbc
        8
    autoxbc  
    OP
       2021 年 10 月 11 日
    @mxT52CRuqR6o5 #5 长度不一致是正常的,但前提是构造的时候切过了,这全量构造是不一样的
    mxT52CRuqR6o5
        9
    mxT52CRuqR6o5  
       2021 年 10 月 11 日
    @autoxbc
    你 Deno.readFileSync 就已经拿到的是 uint8array 了,切还是全量构造是 Deno.readFileSync 内部的事情,为什么你认为 Deno.readFileSync 一定要给你全量构造的 uint8array
    现在作者明显就是想要 Deno.readFileSync 返回切过的 uint8array 这个效果,那肯定说这是个 feature 啊
    iugo
        10
    iugo  
       2022 年 2 月 23 日
    不知道我看到的情况和当时有多大差别, 但主要维护者还是对这样的修改有讨论的: https://github.com/denoland/deno/pull/12057#pullrequestreview-753151404

    还是一个 API 设计问题吧, 可以讨论.
    autoxbc
        11
    autoxbc  
    OP
       2022 年 2 月 24 日
    @iugo #10 谢谢,原来是为了优化读取性能。不过也只是微小的提升,就搞了个丑设计,感觉得不偿失
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5482 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 07:15 PVG 15:15 LAX 23:15 JFK 02:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86