Given this set, the iterator functions are strictly equal, but not when called:
let set = new Set([1,2,'3']);
console.log(set.keys === set.values); // true
console.log(set.keys === set[Symbol.iterator]); // true
console.log(set.values === set[Symbol.iterator]); // true
console.log(set.keys() === set.values()); // false
// console.log prints them the same way
console.log(set.keys()); // [Set Iterator] { 1, 2, '3' }
console.log(set.values()); // [Set Iterator] { 1, 2, '3' }
// Set iterator does not equal itself
let keys1 = set[Symbol.iterator]();
let keys2 = set[Symbol.iterator]();
console.log(keys1 === keys2); // false
Per latest ECMAScript 2021 on Set.prototype.keys,
The initial value of the "keys" property is the same function object as the initial value of the "values" property.
This is the definition of Set.prototype.values() for point of comparison:
24.2.3.10 Set.prototype.values ( ) The following steps are taken:
- Let S be the this value.
- Return ? CreateSetIterator(S, value).
Question
Why is a set iterator not strictly equal to another set iterator generated in the same way from the same set object?