Javascript数组是稀疏的吗?

也就是说,如果我使用当前时间作为数组的索引:

array[Date.getTime()] = value; 

将解释器实例化所有元素从0到现在? 不同的浏览器做不同的做法吗?

我记得在AIX内核中曾经有一个bug,它会根据请求创建伪ttys,但是如果你这样做了,例如“echo> / dev / pty10000000000”,它会创建/ dev / pty0,/ dev / pty1, ….然后摔死了。 在贸易展上很有趣,但我不希望这发生在我的客户身上。

如何实现JavaScript数组不同的浏览器不同浏览器,但他们通常回落到一个稀疏的实现 – 最有可能是用于常规对象的属性访问相同 – 如果使用实际的数组将是低效的。

你将不得不询问有关具体实现的更多知识的人来回答激动地从密集到稀疏的转变,但是你的例子应该是完全安全的。 如果你想得到一个密集的数组,你应该用一个明确的长度参数来调用构造函数,并且希望你能得到一个。

看到这个答案 olliej更详细的描述。

对,他们是。 它们实际上是内部的哈希表,所以你不仅可以使用大整数,还可以使用字符串,浮点数或其他对象。 在添加到散列之前,所有的键都通过toString()转换为字符串。 你可以用一些测试代码来证实这一点:

 <script> var array = []; array[0] = "zero"; array[new Date().getTime()] = "now"; array[3.14] = "pi"; for (var i in array) { alert("array["+i+"] = " + array[i] + ", typeof("+i+") == " + typeof(i)); } </script> 

显示:

 array[0] = zero, typeof(0) == string array[1254503972355] = now, typeof(1254503972355) == string array[3.14] = pi, typeof(3.14) == string 

请注意我for...in如何用于for...in语法,它只给你实际定义的索引。 如果你使用更常见for (var i = 0; i < array.length; ++i)迭代风格,那么你显然会遇到非标准数组索引的问题。

你可以通过使用为这种事情设计的JavaScript语法来避免这个问题。 你可以把它当作字典来处理,但是“for … in …”语法可以让你抓住所有的东西。

 var sparse = {}; // not [] sparse["whatever"] = "something"; 

Javascript对象是稀疏的,数组只是一个具有自动维护长度属性(实际上比最大索引大一些, 而不是定义元素数量)和一些附加方法的专用对象。 你无论如何都是安全的。 如果您需要额外的功能,请使用数组,否则使用对象。

一般来说,JavaScript中的数组是稀疏的,但我们可以使它们像以下一样密集:

备用阵列:

 var a = new Array(3); > a [ , , ] > a.length 3 > a[0] undefined 

您可以使用HTML5 localStorage或sessionStorage。

 var date=Date.getTime(),value='1234567890'; date=date.toString(); localStorage.setItem(date, value); 

* sessionStorage对象等同于localStorage对象,除了它只存储一个会话的数据。 当用户关闭特定浏览器选项卡时,数据将被删除。 要了解更多信息,请访问w3schools.com

Interesting Posts