今天上午我们就简单的介绍下 String 类型的迭代器属性。
String.prototype [ @@iterator ] ( )
首先我们先看下原文是怎么描述它的:
When the @@iterator method is called it returns an Iterator object that iterates over the code points of a String value, returning each code point as a String value.
简单的翻译过来就是说:
当调用 @@ iterator 方法时,它返回一个 Iterator对象,它迭代一个 String 值的代码点,返回每个代码点作为 所需的 String 值。
内部的解释过程就是调用 CreateStringIterator(S)
抽象操作。
此函数的 name 属性的值为 “[Symbol.iterator]”。这个东西大家看下就好,我们后面会有具体的解释。
那我们说 CreateStringIterator(S)
抽象操作到底做了什么呢?这是官方文档的说明:String 对象的几个方法返回 Iterator对象。 带有参数字符串的抽象操作 CreateStringIterator 用于创建这样的迭代器对象。下面是内部解释过程:
首先判断类型是否为 String 类型;其次,使 iterator 参数变为(%StringIteratorPrototype%, « [[IteratedString]], [[StringIteratorNextIndex]] ») (前者为原型,后者为内部插槽作为一个 List);设置 iterator.[[IteratedString]] 为string 值, iterator.[[StringIteratorNextIndex]] 为 0;最后返回 iterator 参数。
看不懂没关系,当我们讲到迭代器的时候,再回头看就很清楚了。
String 实例
什么是 String 实例呢?我们所创建的字符串就是一个实例。这个相信大家都知道。那么字符串实例都有哪些特点呢?以下是官方的说明:
String 实例是 String 异常对象,并具有为这些对象指定的内部方法。 String 实例从 String 原型对象继承属性。 字符串实例也有一个 [[StringData]] 内部插槽。
String 实例具有 length 属性,以及一组具有整数索引名称的可枚举属性。
关于异常对象(exotic objects),我们暂时不需要了解。官方说明:只要不是普通对象,那么都是异常对象。
这就是我们创建的 String 实例所存在一切属性和特点。它继承了 String 的 Function.prototype
和 String.prototype
上的方法。也具有整数的索引值。可枚举指的是我们可以使用方法选取我们需要的 UTF-16 编码单元对应的字符;[[StringData]] 内部插槽,我们作为了解吧。它指的就是一个放置 String 数据的场所,如果不存在这个插槽,那么也不能够存储 String 数据值。
String 迭代器对象
官方文档是这么说明的:
An String Iterator is an object, that represents a specific iteration over some specific String instance object. There is not a named constructor for String Iterator objects. Instead, String iterator objects are created by calling certain methods of String instance objects.
也就是说:
String 迭代器是一个对象,它表示一些特定的 String 实例对象的特定迭代。 String 迭代器对象没有命名的构造函数。 相反,String 迭代器对象通过调用 String 实例对象的某些方法创建。
这也是我们在 ES6 的 Class 的构造函数的示例中所经常看到的写法,使用的就是上面提到的 “[Symbol.iterator]”。不过暂时还是有点深入了,当我们学习到迭代器那节我们就清楚了它是什么。
在 String 中迭代器目前只有一个方法:%StringIteratorPrototype%.next ( )
示例:
var string = 'A\uD835\uDC68';
var strIter = string[Symbol.iterator]();
console.log( strIter.next().value ); // "A"
console.log( strIter.next().value ); // "\uD835\uDC68"
其实不难理解,next() 就是迭代下一个的意思。
同样的也可以使用在 for-of 中。
let str1 = 'Hello';
for (let a of str1) {
console.log(a);
}
// H
// e
// l
// l
// o
这就是 Sting 迭代器的使用。我们之前讲到过拥有迭代器属性的对象都可以使用 for-of 方法。
总结
本小节算是对 String 类型的一个圆满结束吧。这节的内容比较难理解,我也没有办法讲的很深,暂时作为了解内容。未来我们将这个系列讲完以后,大家对这门语言有了全面和深刻的认识后,我们就清楚它们彼此间的关系啦。
我们下面开始另一个重要的类型 —— Number 类型。
相关链接
基础类型之 String(一)
基础类型之 String(二)
基础类型之 String(三)
基础类型之 String(四)