Por tantoJavascript Gotcha: lista vacía a la conversión booleana
[] == false
y
![] == false
son verdaderas?
Por tantoJavascript Gotcha: lista vacía a la conversión booleana
[] == false
y
![] == false
son verdaderas?
El operador === es tu amigo. Nunca use el operador ==; te morderá, como puedes ver.
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".
[] no es falsey. Es un efecto secundario de la coerción de cuerdas. La matriz [''] también es == falsa, pero no es falsey. –
@mikesamuel ¡gracias por la información! – Dave
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']
¿por qué una lista se forzará a la cadena cuando se compara con un valor booleano? ¿Alguna fuente? – luntain
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. –
pesar de que su respuesta es útil que no responde a la pregunta. –
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. –