Maison  >  Article  >  interface Web  >  Un petit problème avec Eval analysant les chaînes JSON dans les compétences JS_javascript

Un petit problème avec Eval analysant les chaînes JSON dans les compétences JS_javascript

WBOY
WBOYoriginal
2016-05-16 15:14:311517parcourir

J'ai déjà écrit un article d'introduction sur JSON, qui parlait de l'analyse de JSON. Nous savons tous que les navigateurs avancés peuvent utiliser l'API JSON.parse() pour analyser une chaîne JSON en données JSON. Pour une approche légèrement moins appropriée, nous pouvons utiliser la fonction eval().

JSON (JavaScript Object Notation) est un format de données simple qui est plus léger que XML. JSON est un format JavaScript natif, ce qui signifie que le traitement des données JSON en JavaScript ne nécessite aucune API ou boîte à outils spéciale.

Les règles de JSON sont simples : un objet est une collection non ordonnée de « paires nom/valeur ». Un objet commence par "{" (crochet gauche) et se termine par "}" (crochet droit). Chaque "nom" est suivi d'un ":" (deux-points) ; les paires "nom/valeur" sont séparées par "," (virgule)

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval('(' + str + ')');
console.log(obj); // Object {name: "hanzichi", age: 10}

Avez-vous remarqué que lors du passage de paramètres à eval(), la variable str est placée entre parenthèses ? Pourquoi faire ça ?

Regardons d'abord la définition et l'utilisation de la fonction eval.

Le paramètre de eval() est une chaîne. Si la chaîne représente une expression, eval() évalue l'expression. Si l'argument représente une ou plusieurs déclarations JavaScript, alors eval() exécute les déclarations. N'appelez pas eval() pour évaluer les expressions arithmétiques ; JavaScript évalue automatiquement les expressions arithmétiques.

Pour faire simple, le paramètre de la fonction eval est une chaîne. Si la chaîne est "noString", le résultat sera une instruction JavaScript normale qui peut être exécutée.

Comment dire ? Par exemple, le code suivant :

var str = "alert('hello world')";
eval(str);

"hello world" apparaît après l'exécution. Nous transformons la variable str en "noString". Une approche approximative consiste à supprimer les guillemets externes et à effectuer des ajustements internes (échappement, etc.), et cela devient alors :

alert('hello world')

très bien ! Il s'agit d'une instruction JavaScript normale qui fonctionne ! Exécutez-le !

Pour en revenir à la question initiale, pourquoi les chaînes JSON doivent-elles être placées entre parenthèses ? Si vous ne l'ajoutez pas, cela ressemblera à ceci :

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :

Eh bien, une erreur a été signalée. Pourquoi une erreur est-elle signalée ? Essayez de convertir str en "noString" et exécutez :

{"name": "hanzichi", "age": 10}; // Uncaught SyntaxError: Unexpected token :

Il ne fait aucun doute qu'un objet JSON ou un objet n'est pas du tout une instruction JavaScript exécutable ! Attendez, essayez le code suivant :

var str = '{name: "hanzichi"}';
var obj = eval(str);
console.log(obj); // hanzichi

Qu'est-ce que c'est que ça ? Mais ajouter "" au nom renvoie une erreur ?

var str = '{"name": "hanzichi"}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
console.log(obj); 

D'accord, j'ai presque le vertige. En fait, vous pouvez toujours "nostring" str pour voir s'il s'agit d'une instruction JavaScript qui peut être exécutée correctement. Le résultat du premier est :

{name: "hanzichi"}

Il s'agit bien d'une déclaration JavaScript légale. {} Nous pouvons l'utiliser non seulement dans des scénarios tels que les instructions if et for, mais également à tout moment, car avant ES6, JavaScript n'avait qu'une portée au niveau du bloc, il n'y aurait donc aucun conflit avec la portée. Après avoir supprimé {}, name : "hanzichi" est également une instruction d'étiquette. L'instruction d'étiquette est très utile pour sortir des boucles imbriquées. Pour plus de détails, veuillez vous référer à l'instruction d'étiquette. , le nom ne peut pas être cité. Les balises peuvent être placées n'importe où dans le code JavaScript, même si elles ne sont pas utilisées.

Une fois qu'un objet a deux clés, telles que {name : "hanzichi", age : 10}, ok, deux instructions d'étiquette ? Traitez respectivement « hanzhichi » et 10 comme des déclarations, mais les déclarations ne peuvent être liées qu'à des numéros de sceau ! (Seules des virgules peuvent être utilisées entre les expressions). Vous pouvez donc le remplacer par ce qui suit :

var str = '{name: "hanzichi"; age: 10}';
var obj = eval(str); 
console.log(obj); // 10

Plus on avance, la cause de l'erreur dans le code en début d'article a été trouvée. Pourquoi peut-on la résoudre en mettant des parenthèses ? En termes simples, () convertit une instruction en une expression, appelée expression d'instruction. Le code entre parenthèses sera converti en évaluation d'expression et renvoyé Le littéral d'objet doit exister en tant qu'expression.

Cet article ne parlera pas des expressions. Pour les expressions, vous pouvez vous référer au lien en fin d'article. Il convient de rappeler que les expressions ont toujours une valeur de retour. La plupart des expressions seront entourées de () et les parenthèses ne peuvent pas être vides. S'il existe plusieurs expressions séparées par des virgules, ce qu'on appelle l'expression virgule, la valeur de la dernière sera renvoyée.

Ce qui précède est un petit problème que l'éditeur vous présente à propos de l'analyse des chaînes JSON par Eval dans JS. J'espère que cela sera utile à tout le monde !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn