Javascript:请问一种方案,标记一个不受自己控制的 typed array 是否存在修改 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yqf3139
V2EX    问与答

Javascript:请问一种方案,标记一个不受自己控制的 typed array 是否存在修改

  •  
  •   yqf3139 2015-08-25 16:51:47 +08:00 1873 次点击
    这是一个创建于 3736 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有这么一个需求,给定一个很长的 typed array ,由其他人的逻辑修改,在一个循环中进行多次修改,而我需要多次做记录,即上次到目前是否有修改,将整个数组发回去,不需要找出具体的修改内容.如何在不改动其他人的代码的同时用最小的成本做到这一切?

    预期其他人的修改是通过 set 函数和[]操作符.就希望在这些函数调用时插入一个设置 dirty 的语句.
    set 函数可以轻易修改,但[]操作符却因为 Javascript 操作符不能重载而难以追踪到是否有数据修改.

    目前已经作废的想法如下:
    1.所有需要遍历数组的办法比较低效,还要每次复制原数组.
    2.查到可以使用 Array.observe (),可以获得更新的回调,不过发现是异步的,而这样的话在回调之前我便已经需要对这个数组做判断了,而且似乎比较重量级,性能消耗大.
    3.查到可以使用 Object.defineProperty ,注册对应下标的 get , set 函数,不过似乎需要针对每个下标都注册函数,而且发现这个方法对于 typed array 无效,对于 ArrayBuffer , Object 和 Array 可行.
    4.可以写一个 Proxy 将这个数组包在里面,不过没有办法修改其他人的代码,没办法修改引用为新的 Proxy .

    我还注意到 typed array 中有一 ArrayBuffer 成员,不过似乎对这个 buffer 注册没有用处.

    求教是否还有其他办法.
    1 条回复    2015-08-25 21:00:35 +08:00
    yqf3139
        1
    yqf3139  
    OP
       2015-08-25 21:00:35 +08:00
    有一个解决方法,想到可以在一开始把 typed array 的构造函数给覆盖重写。就可以实现一个 Proxy 来拦截 set 和 get 了。但直接在 typed array 上动态重写是无效的,不清楚原因。

    实现代码:

    <script src="https://gist.github.com/yqf3139/0f05621ae09be61d373f.js"></script>

    console.time ('a');for (var ii=0;ii<1000000;ii++){bb[ii%10] = bb[ii%10]+ii;};console.timeEnd ('a');
    VM4445:2 a: 4029.594ms
    console.time ('a');for (var ii=0;ii<1000000;ii++){a[ii%10] = a[ii%10]+ii;};console.timeEnd ('a');
    VM4446:2 a: 2374.783ms

    性能损失还好。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1132 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 17:17 PVG 01:17 LAX 09:17 JFK 12:17
    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