¿Se requiere alguna vez igualdad estricta ( === ) al comparar cualquier entidad con un símbolo? Ninguna de las reglas de conversión de tipos en MDN indica ninguna conversión a/desde un Símbolo y una lectura de ellas indica que siempre debería estar bien (¿aparte de quizás estropear la uniformidad del código?) para usar == cuando una de las entidades es un Símbolo.
Entonces, ¿puede algo como
function foo(x) { return x == somePredefinedSymbol; } alguna vez salió mal, porque, según tengo entendido, la igualdad anterior solo puede devolver verdadero si x es somePredefinedSymbol ?
PD: Esto es solo por curiosidad técnica. No pretendo recomendar el uso de == .
Entonces, ¿puede algo como
function foo(x) { return x == somePredefinedSymbol; }alguna vez sale mal,
Sí, este es un ejemplo algo construido, pero muestra un escenario de falla:
const predefinedSymbol = Symbol("foo"); const someObject = { value: "bar", // some unrelated values [Symbol.toPrimitive]() { // override primitive conversion return predefinedSymbol; } } console.log(someObject == predefinedSymbol); //true console.log(someObject === predefinedSymbol); //falseA partir de ES6, la igualdad flexible tendrá en cuenta los símbolos en comparación con un objeto. De la especificación ECMAScript 6, 7.2.12 Comparación de igualdad abstracta :
- Si Tipo(x) es Cadena, Número o Símbolo y Tipo(y) es Objeto, entonces
devuelve el resultado de la comparación x == ToPrimitive(y).- Si Tipo(x) es Objeto y Tipo(y) es Cadena, Número o Símbolo, entonces
devuelve el resultado de la comparación ToPrimitive(x) == y.
Por lo tanto, si un objeto convertido en un primitivo produce un símbolo y ese es el mismo símbolo con el que se compara, entonces la igualdad laxa producirá true pero usando igualdad estricta el resultado será false .