2011-08-14 2 views
27

J'ai trouvé que sur Opera 11.50 l'expressionEst-il correct que JSON.stringify (2) == "2" renvoie false?

JSON.stringify(2) 

retourne un objet pour lequel

  • typeof retours "string"
  • constructor.name est String
  • charCodeAt(0) est 50
  • length est 1

Mais encore

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

montre dans Opera "false" (et la même chose se produit en utilisant ===).

Est-ce un bug ou quoi?

La seule façon que j'ai trouvé pour faire la comparaison égale à "2" appelle .substr(0) (par exemple même en ajoutant une chaîne vide est encore différente).

+4

S'il est si il est un bug. Échantillon minimaliste à essayer serait utile de dire à coup sûr. –

+3

Intéressant, '== 2' renvoie' true' ... –

+0

ressemble à un bug, mais j'ai trouvé que c'est vrai: 'JSON.stringify (2) == 2' – Sheepy

Répondre

7

Cela ressemble vraiment à un bug.

De la spécification ECMAScript 5.1:

implémentations de JSON.parse et Conformes JSON.stringify doivent prendre en charge le format d'échange exact décrit dans cette spécification sans suppressions ou des extensions au format. Cela diffère de la RFC 4627 qui permet à un analyseur JSON d'accepter des formulaires et des extensions non-JSON.

Et:

JSON.stringify produit une chaîne qui est conforme à la grammaire JSON suivante. JSON.parse accepte une chaîne qui est conforme à la grammaire JSON

Il se peut qu'il enveloppe en quelque sorte la chaîne dans un objet de type « JSONText » qui a encore une typeof de string mais qui semble très étrange.

Je pense vraiment que la mise en œuvre suivante dans ce cas est le bon:

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

Selon @ 6502 (voir le commentaire) est ce true dans:
Chrome; Firefox IE9; iPad Safari; Safari OsX; le navigateur N1 Android

Le document de spécification ECMAScript 5.1: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

+1

En fait cela fonctionne correctement sur les versions chrome, firefox, IE9, iPad et OsX de Safari et même le navigateur N1 Android. Le fait que cela n'arrive qu'avec des nombres à un chiffre me fait me demander si c'est à cause d'une sorte d'optimisation ... – 6502

+0

Avez-vous déjà posté [un rapport de bogue] (https://bugs.opera.com/wizarddesktop/)? Plutôt qu'un truc d'optimisation, j'assume un bug dans une boucle de l'algorithme stringify, mais nous ne le saurons jamais puisque le code source d'Opera n'est pas disponible publiquement. – user123444555621

+2

Oui c'est embêtant qu'on ne puisse pas regarder dans le code. Bien que je ne pouvais pas être dérangé de toute façon. Je n'ai pas soumis de rapport de bug car je n'utilise pas d'opéra et n'ai pas observé le bug moi-même. Je pense que le PO devrait le faire. –