基础类型之 String(五)

今天上午我们就简单的介绍下 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.prototypeString.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(四)

    原文作者:Hushaby丶
    原文地址: https://www.jianshu.com/p/9de6f6b513cb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞