Symbol.iterator的语法很困难

时间:2018-09-14 07:09:46

标签: typescript

早上好。我想咨询一下Symbol.iterator。

interface IterableIterator<T> extends Iterator<T>{
    [Symbol.iterator](): IterableIterator<T>;
};

许多示例使用与上面相同的语法。

但是我知道[]是一个数组,而()是一个函数运算符。

[Symbol.iterator](): IterableIterator<T>;

我知道IterableIterator 是一种类型。

在它前面是变量名。

[Symbol.iterator]()

此语法是否特定于实现原型的Symbol.iterator?

2 个答案:

答案 0 :(得分:2)

要回答此问题,我将需要解释ES6中ECMAScript的一些新增功能(因为TypeScript是ECMAScript的超集)。

计算出的属性名称

在ES5(普通的旧JavaScript)中定义对象文字时,只能使用固定的属性名称:

var key = 'superKey';

var a = {
    key: 1
}
上面的

key是按字面使用的,变量key的值将被忽略,因此对象字面量将等效于

var a = {
    'key': 1
}

如果要动态使用key变量中的字符串作为对象属性名称,则必须编写:

var key = 'superKey';
var a = {};
a[key] = 1;

ES6提供了解决此问题的方法:现在,在定义对象文字时,可以将任意表达式用作computed property name

let key = 'superKey';
let a = {
    [key]: 1,
    [key + key]: 2
}

这同样适用于ES6类和TypeScript类和接口:

const s = 'foo';

interface IFoo {
    [s](): number;
}

class Foo implements IFoo {
    [s]() {
        return 1;
    }
}

符号

符号是ES6中引入的一种新的原始类型,可用于对对象和字符串进行索引:

let s = Symbol();
let a = {
    [s]: 1
}
a[s] === 1

有一些知名符号,用于查找某些特殊情况下的方法。这些符号被定义为全局Symbol函数的属性。

这些著名的符号之一是Symbol.iterator:当您写for item of someObject时,内部会调用someObject[Symbol.iterator]

总结

interface IterableIterator<T> extends Iterator<T>{
    [Symbol.iterator](): IterableIterator<T>;
};

这定义了一个接口,该接口的方法可以作为obj[Symbol.iterator]访问,并返回类型为IterableIterator<T>的对象。

答案 1 :(得分:0)

您看到[]放在其中的[Symbol.iterator]对于ES6来说是新的,它称为键插值。因此,如果您想要动态生成的密钥,可以将其包装在方括号中。因此,这是一个完全正常的密钥。

我对[Symbol.iterator]的理解和经验是,它是一个教对象如何响应for循环的工具。