为什么通过括号访问Symbol.iterator?

ako*_*tch 5 javascript iterator symbols

例如,如果我创建了一个数组var array=[1,2,3,4];来返回迭代器,我会var iterator=array[Symbol.iterator]();不明白为什么你通过括号访问Symbol.iterator属性?为什么它不仅仅是array.Symbol.iterator?

Mar*_*yer 4

名为的数组上没有属性Symbol(除非您在那里放置一个属性)。相反,您正在查找其键是Symbol.iterator指向的符号基元的值。Symbol.iterator返回一个符号,您可以使用该符号作为查找键。这有点像用变量查找属性:

let a = [1, 2, 3]
a.someProp = "hello"

let key = "someProp"

// this doesn't work for the same reason s.Symbol.iterator doesn't:
// a.key

// but this does:
console.log(a[key])

// So with a Symbol:

let k = Symbol.iterator
console.log(typeof k)
// k is now a reference to the symbol that is the key
// you can use that to returns the iterator function
console.log(a[k])    // <-- that returns your iterator function
console.log([...a[k]()])

// equivalent to:
console.log([...a[Symbol.iterator]()])
Run Code Online (Sandbox Code Playgroud)