早上好。我想咨询一下Symbol.iterator。
interface IterableIterator<T> extends Iterator<T>{
[Symbol.iterator](): IterableIterator<T>;
};
许多示例使用与上面相同的语法。
但是我知道[]是一个数组,而()是一个函数运算符。
[Symbol.iterator](): IterableIterator<T>;
我知道IterableIterator
在它前面是变量名。
[Symbol.iterator]()
此语法是否特定于实现原型的Symbol.iterator?
答案 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循环的工具。