如何创建内容相同的新数组,使next()函数可将其识别为新数组?
问题原因
你使用的数组工具库的next()方法内部未按数组实例的引用地址区分不同数组,而是以数组内容作为判断依据。你两次赋值的数组内容均为['item1'],库会误判为同一个数组,复用了之前已经遍历到末尾的指针,因此第二次调用next()返回false。
可行解决方案
以下方案均不会引入需要额外处理的冗余数组元素:
- 方案1:给每个新数组实例添加唯一标识属性
使用Symbol类型作为唯一标记,该类型属性不会被forEach/map等常规数组遍历方法枚举,完全不影响原有业务逻辑:var a = ['item1']; a._uniqueSign = Symbol(); a.next(); // 正常返回 'item1' // 重复赋值时新增不同的唯一标识 a = ['item1']; a._uniqueSign = Symbol(); a.next(); // 符合预期返回 'item1' - 方案2:调用库自带的遍历重置方法
若该数组库提供了重置遍历指针的配套方法(通常命名为reset()),每次赋值后主动调用重置即可:a = ['item1']; a.reset(); a.next(); // 正常返回第一项 - 方案3:每次创建数组时修改内部特征值
如果不想额外加自定义属性,可以每次创建数组时先新增一个临时元素再删除,改变库识别数组的特征值:a = ['item1']; a.push(1); a.pop(); a.next(); // 可正常识别为新数组
内容的提问来源于stack exchange,提问作者LA_
相关产品推荐
相关产品推荐

