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().
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. Une chose à retenir est 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.