是否可以使用数组视图?

Are array views possible?

本文关键字:视图 数组 可以使 是否      更新时间:2023-09-26

我想知道是否有可能以跨浏览器兼容的方式模仿ArrayBufferViewArrayBuffer上的约束边界行为(向下说IE8)。

考虑一个像这样的Javascript数组结构:

var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

我想获得a子集的数组视图b。例如,当b的索引发生突变时,a中的索引也会发生突变。

使用例子:

var b = ViewOf(a, 3, 6); // Make a view of a, from index 3 to 6
console.log(b);          // [3, 4, 5, 6]
b[0] = 42;
console.log(a);          // [0, 1, 2, 42, 4, 5, 6, 7, 8, 9]

默认情况下这是不可能的。您可以使用自定义函数模拟它。

var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
ViewOf = function(a, startIdxx, endIdxx){
  return {
    startIdx: startIdxx,
    endIdx: endIdxx,
    set: function(index, value){
      a[index+this.startIdx] = value;
    },
    get: function(index){
      return a[index+this.startIdx];
    }
  }
}

现在可以像下面这样使用上面的函数

b = ViewOf(a, 3, 6);
b.set(0, 42);
console.log(a);

JS小提琴:http://jsfiddle.net/YewC4/4/

我不知道IE8,因为它的Object.defineProperty是janky,但这似乎做你问的,即使你问的不是最好的主意,因为在其他评论中指出的原因:

var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
function ViewOf(orig, from, to){
   var sub=orig.slice(from, to);
   for(var i=0, mx=sub.length;i<mx;i++){(function(i){  var it=sub[i];
     Object.defineProperty(sub, i, { get: function(){ return  it;}, set: function(v){ return it=orig[i+from]=v; }   });
   }(i));}
  return sub;
}
var b = ViewOf(a, 3, 6); // Make a view of a, from index 3 to 6
console.log(b);          // [3, 4, 5, 6]
b[0] = 42;
console.log(a);  //shows: [0, 1, 2, 42, 4, 5, 6, 7, 8, 9]

请看https://github.com/inexorabletash/polyfill。

这个多边形库有typearray .js,它包含了ArrayBuffer和ArrayBufferView的多边形。

我不知道这个lib。只是一个快速谷歌…