带有* [Symbol.iterator]的预期标识符,字符串或数字

时间:2016-08-13 18:00:04

标签: javascript visual-studio iterator

以下是我的演示版jsfiddle



class Animal {
    constructor(...names) {
        this.animals = names
    }
    *[Symbol.iterator]() {
        for (let animal of this.animals) {
            yield animal
        }
    }
}
var animals = new Animal('cat', 'dog', 'tiger');
for (let animal of animals) {
    console.log(animal)
}




但是当我在Visual Studio中重写它时:

class Animal {
    *[Symbol.iterator]() {

    }
}

我收到此错误消息:

  

预期的标识符,字符串或数字

1

所以,我的问题:如何修复它?

1 个答案:

答案 0 :(得分:1)

您无法使用class语法定义生成器。这是将代码直接转换为实际运行的ES6。

class Animal {
  constructor(...names) {
    this.animals = names
  }
}

// you could define the generator on the prototype here ...
// but make sure you read the second half of this answer
Animal.prototype[Symbol.iterator] = function* () {
  for (let animal of this.animals) {
    yield animal
  }
}

var animals = new Animal('cat', 'dog', 'tiger');
for (let animal of animals) {
  console.log(animal)
}

// cat
// dog
// tiger

但那不是你应该做的事情。 Symbol.iterator只需要解析可迭代值 - Array.prototype.values将提供您需要的东西

class Animal {
  constructor(...names) {
    this.animals = names
  }
  [Symbol.iterator]() {
    return this.animals.values()
  }
}

var animals = new Animal('cat', 'dog', 'tiger');
for (let animal of animals) {
  console.log(animal)
}

// cat
// dog
// tiger

可以将迭代器定义为生成器,就像在OP中一样,但是你必须使用委托yield*)来获取行为你渴望 -

class Animal {
  constructor(...names) {
    this.animals = names
  }
  *[Symbol.iterator]() {
    yield* this.animals
  }
}

var animals = new Animal('cat', 'dog', 'tiger');
for (let animal of animals) {
  console.log(animal)
}

// cat
// dog
// tiger