稀疏数组比(常规)对象更好的编程用途是什么?
我所说的稀疏数组是指:
arr = []; //Initialize
arr[0] = 'W';
arr[1] = 'T';
arr[3] = 'F';
console.log(arr[0] !== undefined) //true
console.log(arr[1] !== undefined) //true
console.log(arr[2] === undefined) //true
console.log(arr[3] !== undefined) //true
或者更正式地说:
An object, O, is said to be sparse if the following algorithm returns true:
1. Let len be the result of calling the [[Get]] internal method of O with argument
"length".
2. For each integer i in the range 0≤i<ToUint32(len)
a. Let elem be the result of calling the [[GetOwnProperty]] internal method of O
with argument ToString(i).
b. If elem is undefined, return true.
3. Return false.
ECMA 262 5.1 - 15.4 Array Objects
此外,ECMA 262 5.1 标准进一步定义length
具体为:
The length property of this Array object is a data property whose value is always numerically greater than the name of every deletable property whose name is an array index.
所以上面的例子,arr.length === 4
尽管只定义了三个元素。
事实上,根据标准,任何大于3
的Number
都是arr
的有效length
,包括 Math.PI
。
因此,这是否意味着任何人都不应该使用:
for(var i=0; i<arr.length; i++)
//Cannot trust arr[i] exists
相反,使用它会更合适
for(key in arr)
//Always exists
我从来没有在野外遇到过故意的,真的只是在阅读这里的一个奇怪的问答时才开始思考它,现在我有点不安。
我早就知道没有一种巧妙的方法可以从 Array
中删除一个元素,但现在我更加困惑为什么你会故意留下一个洞,更不用说定义了一个标准,其中长度可以是大于最后定义的元素的任何数字。
如果我想要随机键值对,我会使用对象
。如果我希望能够干净地迭代,我会使用 Array
。我错过了什么吗?
请注意,我正在寻找一个特定的用例,或者一类通用的用例,而不是对标准或意见的引用。我知道这是允许的,我已经有意见了。 :)
要添加测试或查看一些我见过的 Array 标准以意想不到的方式工作的测试,请查看此 fiddle
对不起,如果这有点抽象。想了一个晚上。
最佳答案
我在实际使用中遇到的稀疏数组的一个可能用例是热图。
开始时,您的 map 是一个包含 X × Y 元素的空数组。加载您的数据,并通过递增相关坐标处的数组元素将其填充到 map 中。
另一个类似的例子可能是战舰游戏,通过在适当的坐标处填充数组元素,将船只放置在空网格中。
这并不是说这是做到这一点的唯一方法,甚至是最好的方法——这两个例子都可以在不使用稀疏数组的情况下很容易地实现——但问题是询问用例,所以你去吧.
关于javascript - 稀疏数组在 JavaScript 中有哪些用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126593/