Qual é a definição técnica de um Javascript iterável e como você o testa?

Estou implementando uma subclasse útil do ES6Set objeto. Para muitos dos meus novos métodos, quero aceitar um argumento que pode ser outro conjunto ou uma matriz ou realmente qualquer coisa que eu possa iterar. Eu chamo isso de "iterável" na minha interface e apenas uso.forEach() nele (que funciona bem para um conjunto ou uma matriz. Exemplo de código:

// remove items in this set that are in the otherIterable
// returns a count of number of items removed
remove(otherIterable) {
    let cnt = 0;
    otherIterable.forEach(item => {
        if (this.delete(item)) {
            ++cnt;
        }
    });
    return cnt;
}

Ou

// add all items from some other iterable to this set
addTo(iterable) {
    iterable.forEach(item => {
        this.add(item);
    });
}

Mas, suspeito que talvez eu não esteja realmente dando suporte a qualquer iterável da maneira que o ES6 o define, por isso estou interessado no que a definição real de um iterável de Javascript está usando o termo como a especificação do ES6?

Como você faz o teste em Javascript ES6?

Como você deve iterar um iterável genérico?

Encontrei frases como esta na especificação ES6:

Se o parâmetro iterável estiver presente, espera-se que seja um objeto que implemente um método @@ iterator que retorne um objeto iterador que produza um objeto de matriz de dois elementos cujo primeiro elemento seja um valor que será usado como chave WeakMap e cujo segundo elemento é o valor a ser associado a essa chave.

Mas, isso se refere a um@@iterator method que não consigo acessar por meio desse nome de propriedade.

questionAnswers(2)

yourAnswerToTheQuestion