2009-10-07 21 views

Respuesta

15

El operador === es tu amigo. Nunca use el operador ==; te morderá, como puedes ver.

+9

pesar de que su respuesta es útil que no responde a la pregunta. –

+3

Es cierto. Los valores que son "falsos" son: indefinido, nulo, falso, 0 y "". Como dice mikesamuel, [] coacciona a "". Tanto para el primero. Y una referencia de objeto no nulo es verdadera, que responde a la segunda. –

10

Una lista vacía, [] debe considerarse un "falsey", sin embargo, en ![] el! está convirtiendo la operación para comprobar si hay una referencia de objeto , donde una no nula no se considera un "falsey".

+5

[] no es falsey. Es un efecto secundario de la coerción de cuerdas. La matriz [''] también es == falsa, pero no es falsey. –

+0

@mikesamuel ¡gracias por la información! – Dave

4

Antes de que [] se compare con falso, se lo coacciona a una cadena que se fuerza a un número, la cadena vacía en el caso de la matriz vacía. La cadena vacía coacciona a 0, que es el mismo valor que falsifica coercientemente a numéricamente.

Uso === == en lugar de evitar este problema

Estas otras matrices también son Falsey-:

[''] 
    [[[]]] 
    (function() { var arr = []; arr[0] = arr; })() 
    [0] 
    ['-0.0'] 
+0

¿por qué una lista se forzará a la cadena cuando se compara con un valor booleano? ¿Alguna fuente? – luntain

+0

De la sección 11.9.3 de EcmaScript 262: 18. Si Type (x) es booleano, devuelva el resultado de la comparación ToNumber (x) == y. 19. Si Type (y) es booleano, devuelva el resultado de la comparación x == ToNumber (y). Luego, forzar una matriz a un número consiste en forzarla primero a una cadena y luego forzarla a un número. Para la mayoría de las matrices, eso producirá el valor NaN no comparable, pero para algunas matrices, [], [0], [[0]], ['0.0'], etc. se compararán sinceramente con falso. Puede experimient con el comportamiento de coerción evaluando (+ [0]) etc. –

Cuestiones relacionadas