2011-09-12 10 views
6

He estado buscando en la función de _.isEqual Underscore.js y una sección del código dice así:¿Es esta línea de Underscore.js realmente necesaria la comprobación de igualdad?

if (a === b) return true; 

if (typeof a !== typeof b) return false; 

if (a == b) return true; 

Me pregunto si hay algún caso en el que se pudo llegar a la tercera declaración y evaluar a true?

Edit: Para que quede claro, este no es mi propio código, estoy leyendo, estoy leyendo la fuente de Underscore, en particular, this line y tenía curiosidad sobre por qué lo están haciendo.

+1

Tiene que haber un caso de bordes extraños donde esto es posible ... –

+0

@nickf: Teniendo en cuenta que '==' y '===' son idénticos cuando los tipos son iguales, no puedo ver cómo la primera y la tercera prueba proporcionarán un resultado diferente. Incluso en el caso de 'null' donde el' typeof' difiere del 'Type' interno, no coacciona a ningún valor excepto' undefined', que tiene un valor 'typeof' diferente. Y si hay * algún * caso marginal, ¿cómo sabes que querrías * obligarlo? Parece extraño tener una prueba '==' y una '===' de los mismos valores. O bien quieres una coerción de tipo o no. – user113716

+0

... Debo aclarar que con * "usted" * en el comentario anterior, no quise dar a entender * nickf *, sino * persona *. – user113716

Respuesta

3

He estado navegando por el repositorio Underscore y encontré una breve discusión donde alguien me preguntó the exact same thing, y parece que en realidad no es necesario.

El siguiente algoritmo definido por la especificación de idioma ECMAScript en section 11.9.6 y section 11.9.3 parece mostrar que ningún par de valores debe devolver verdadero en el caso anterior.

Así que, en resumen, no, esa situación no es posible.

+0

+1 Buen hallazgo en esa discusión – user113716

1

La única situación donde == y === reaccionan de forma inesperada es cuando la comparación de una cadena literal ("123") a una cadena construida (new String("123")), que fallaría la primera prueba.

Sin embargo, en la segunda prueba se detecta porque la cadena construida tiene el tipo object, pero el literal tiene el tipo string.

Basado en eso, diría que no, nunca se puede llegar al tercer enunciado y se evalúa como verdadero.

1

Cuando utiliza el operador == y las expresiones son de tipos diferentes, JavaScript generalmente convertirá las dos en el mismo tipo antes de comparar.

Por ejemplo, esto puede suceder con null y undefined. null == undefined es verdadero, aunque null === undefined es falso. Sin embargo, typeof null es "object", mientras que typeof undefined es "undefined". Entonces, en este caso, debe devolver falso en la segunda declaración.

Usted puede leer todos los detalles en la especificación (sección 11.9.3), está muy involucrado: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

1

Mi suposición inicial fue que era para trabajar en torno a una aplicación de navegador roto.

Sin embargo, después de excavar en los registros de git para ese archivo, parece que la línea correspondiente estaba en el primer registro underscore.js. (No voy a cazar en el documento padrecloud core.js repo ...) Puede verlo en la línea 334 de https://github.com/documentcloud/underscore/commit/02ede85b539a89a44a71ce098f09a9553a3a6890.

Así que ahora mi conjetura es que es simplemente cruft que se quedó, nunca completamente probado y nunca se limpió.

Cuestiones relacionadas