作者回复: 对于JavaScript来说,索引数组的连续性意义不大。不过也正是为了解决这个问题才引用了TypedArray。
对于你开始的问题,其实没有太好的答案。在本文里面,这种可替代性更多的是一种尝试。真正有用的是用户自定义的Symbol.iterator,而不是直接引用Array.prototype中的。然而一旦是用户自定义,就与确定的需求和场景有关了。
另外,事实上字符串也有这样的性质,亦即是字符串可用"...str"这样的语法。所以一个非常有趣的例子就是把一个字符串塞给Set,利用Set没有重复元素的特性来得到“字符串中的有效字符统计”。例如:
```
str='abccccd';
console.log((new Set(str)).size); // 4
console.log(...new Set(str)); // a b c d
```
所以,我想用这个例子来说明的是:很难确定地讲这个东西在“哪些场合”下有用。理解它的性质和本质,在需要的时候能找到高效的解,就可以了。
作者回复: 1、同一个东西。
2、抽象概念上叫散列表或关联数组,并不意味着它一定要在连续存储中实现。索引数组与关联数组存在“连续/不连续”的概念,也只是在逻辑层面上说明它们是否是顺序的,或者有序的,而并不表明当它们实现在物理层面上时,“必须是”连续存储。
3、就好象JavaScript中的索引数组,在概念上它的确是连续的,但它的实现,却是用非连续索引的、非连续存储的关联数组来做到的,并不矛盾。
4、对于JavaScript的数组(Array)来说,意义不大。不过为了解决你说的问题,JavaScript中有类型化数组(TypedArray),这就是连续存储的了,并且,索引+连续在它的应用中就有很重要的价值。
5、不要死学。理解原理,比理解它的应用重要。但是,在应用中还是要“因地制宜”,不同的引擎/环境/语言等等,对不同的“概念”的实现并不一样,要活用。
作者回复: 是的,不确定
作者回复: 不能的呢。左侧在语法解析阶段就会被理解为“数据模板的‘语法’”,它不是一个动态执行的东西。
在语法形式上,下面的代码必须有一个单一的、明确的语义:
```
var a = 100, b = 200;
[a, b] = new Object;
```
如果左侧被解释成“表达式”,那么它一定是一个数组,但这并不成立。左侧必须是一个“赋值模板(语法)”,才能让上述代码成立。不可能让左侧存在二义性的解释,它“既能执行”,又“不是表达式”,这个在语义上是不成立的。