2011-08-14 14 views
27

he encontrado que en Opera 11.50 la expresión¿Es correcto que JSON.stringify (2) == "2" pueda devolver false?

JSON.stringify(2) 

devuelve un objeto para el que

  • typeof vuelve "string"
  • constructor.name es String
  • charCodeAt(0) es 50
  • length es 1

Pero aún

alert(JSON.stringify(2) == "2") 

muestra "falso" en Opera (y lo mismo sucede usando ===).

¿Esto es un error o qué?

La única forma que encontré para hacer que compare igual a "2" es llamando a .substr(0) (por ejemplo, incluso agregar una cadena vacía todavía se compara diferente).

+4

Si es así, entonces es un error. Una muestra minimalista para probar sería útil para decirlo con certeza. –

+3

Interesante, '== 2' produce' verdadero' ... –

+0

parece un error, sin embargo, encontré que esto es cierto: 'JSON.stringify (2) == 2' – Sheepy

Respuesta

7

Eso definitivamente parece un error.

partir de la especificación ECMAScript 5.1:

Conforme implementaciones de JSON.parse y JSON.stringify deben soportar el formato de intercambio exacta descrita en esta memoria sin deleciones o extensiones al formato. Esto difiere del RFC 4627 que permite que un analizador JSON acepte formularios y extensiones que no sean JSON.

Y:

JSON.stringify produce una cadena que se ajusta a la siguiente gramática JSON. JSON.parse acepta una cadena que se ajusta a la gramática JSON

Puede ser que de alguna manera se envuelve la cadena en un objeto de tipo "JSONText" que todavía tiene un typeof de string pero que parece muy extraño.

sin duda creo que la siguiente aplicación en este caso es la correcta:

JSON.stringify(2) == "2" && JSON.stringify(2) === "2" && JSON.stringify(2) == 2 && JSON.stringify(2) !== 2; 
true 

De acuerdo a @ 6502 (ver comentario) esto es true en:
cromo; Firefox; IE9; iPad Safari; OsX Safari; el navegador Android N1

El documento de especificación de ECMAScript 5.1: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

+1

Actualmente funciona correctamente en las versiones de Safari de Chrome, Firefox, IE9, iPad y OsX e incluso en el navegador N1 de Android. El hecho de que esto solo ocurra con números de un solo dígito me hace preguntarme si es por algún tipo de truco de optimización ... – 6502

+0

¿Ya publicaste [un informe de error] (https://bugs.opera.com/wizarddesktop/)? En lugar de un truco de optimización, supongo que hay un error en algún bucle en el algoritmo de stringify, pero nunca lo sabremos, ya que el código fuente de Opera no está disponible públicamente. – user123444555621

+2

Sí, es molesto que no podamos simplemente mirar el código. Aunque no podría molestarme de todos modos. No he enviado un informe de error ya que no utilizo la ópera y no observé el error yo mismo. Creo que el OP debería hacerlo. –

Cuestiones relacionadas