在稀疏数组优于(常规)对象的情况下,您可以使用哪种编程方法?
通过稀疏数组我的意思是:
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标准进一步将长度定义为:
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的数字都是arr的有效长度,包括Math.PI.
因此,这是否意味着没有人应该使用:
for(var i=0; i<arr.length; i++)
//Cannot trust arr[i] exists
相反,它更适合使用
for(key in arr)
//Always exists
我从来没有在野外遇到过故意的人,而且在读这个奇怪的Q& A时真的才开始考虑它,现在我有点不稳定了.
我早就知道没有一种简洁的方法可以从数组中删除一个元素,但现在我更加困惑为什么你会故意留下一个洞,更不用说定义一个标准,其中长度可以是任何数字大于最后定义的元素.
如果我想要随机键值对,我会使用一个Object.如果我想能够干净地迭代,我使用一个数组.我错过了什么吗?
注意,我正在寻找一个特定的用例,或一类不是对标准或意见的参考的一般用例.我知道这是允许的,我已经有了意见. 🙂
要添加测试或查看我看到的Array标准以意想不到的方式工作的一些测试,请查看此fiddle
对不起,如果这有点抽象.整晚都在考虑它.
最佳答案 我在实际使用中遇到的稀疏阵列的一个可能用例是热图.
从地图开始是一个空的X×Y元素数组.加载数据,并通过递增相关联合的数组元素将其填充到地图中.
另一个类似的例子可能是战舰游戏,其中通过在适当的坐标处填充阵列元素将船放入空网格中.
这并不是说这是实现这一目标的唯一方法,甚至是最好的方式 – 两个例子都可以很容易地实现而不使用稀疏数组 – 但问题是要求用例,所以你去了.