我想创建一个无限的64位数组。但是32位数组限制为仅4,294,967,295个对象。在长度为4,294,967,295的数组上使用push函数时,也会出现错误:Invalid array length
如何创建64位数组?
答案 0 :(得分:1)
根据ECMAScript definition,这是最大长度:
整数索引是一个字符串值的属性键,它是规范的 数字字符串(请参见7.1.16),其数字值为+0或a 正整数≤2 53 -1。数组索引是一个整数索引,其 数值i的范围是+0≤i <2 32 −1。
处理两个数组可能是个好主意。
答案 1 :(得分:0)
这是不可能的,因为您已经从@Amy和@sumitani找到了。但是,您可以根据需要实现自己的对象或“数组容器”或数组包装器。
我在这里提出了一个基本示例:
var MyArray = function(){
var arr1 = [];
var arr2 = [];
this.push = function(element){
if(arr1.length < 4294967296){
arr1.push(element);
}else if(arr2.length < 8589934592){
arr2.push(element);
}else{
throw "Invalid array length";
}
}
this.get = function(index){
if(index <= 4294967296){
return arr1[index];
}else if(index <= 8589934592){
return arr2[Math.floor(index / 4294967296)];
}else{
throw "Invalid Index";
}
}
Object.defineProperty(this, 'length', {get: function() {
return arr1.length + arr2.length;
}});
};
var arr = new MyArray();
for(var i = 0; i < 8589934592; i++){
arr.push(i);
}
console.log(arr.get(5));
console.log(arr.length);
因此,从理论上讲,有可能使一个对象充当由多个数组组成的数组,而您只是为正确的数组“计算”正确的索引。
我说理论上是因为该方法在客户端不起作用,因为大多数浏览器的窗口/选项卡都限制在特定的MB / GB内存(例如chrome和firefox)上。
但是Firefox中的限制更大,这就是我进行测试的地方。
之所以给出这个答案,是因为OP首先将这样数量的数据存储在客户端(我只假设它是客户端)是没有意义的,并且对于混合应用程序(可能)。
可以轻松扩展此方法以利用更多的空间(和内存)。也许有更好的方法,但这就是我的零花钱2美分。