2016-07-22 15 views
0

Ich habe eine kleine Bibliothek, die Strings nimmt und Objekte daraus konstruiert. Zum Beispiel '-key val' erstellt {"key": "val"}. Ich versuche jedoch, die Syntax der Eingabezeichenfolge zu erweitern, um auch einfache Objektliterale zu verwenden, z. B. '-key "{key: 'val'}"', die {"key" : {"key" : "val"}} ergeben sollte, jedoch ist das Ergebnis nur {"key" : "val"}.Javascript: Wie man ein Objektliteral mit Eval zurückgibt oder analysiert?

Warum gibt eval nur "val" zurück und nicht das gesamte Objekt? Und gibt es eine sicherere Alternative als meine Lösung?

// my code before the fix 
var arg = '{key: "val"}' 
var result = eval(arg) 
// result is "val" 

Unten ist meine Lösung, die sehr unsicher ist!

const fmt = require('util').format 
var arg = '{key: "val"}' 
var result = eval(fmt('()=>(%s)', arg))() 
// result is { key : "val" } 
+2

verwenden sollten Die '{}' wird als ein Block behandelt, und 'Schlüssel' als eine Bezeichnung, so wird dies zu" val "' ausgewertet. Um es als Objektliteral auswerten zu können, müssen Sie es in runde Klammern setzen. Das ist im Wesentlichen, was Ihr Fix, wenn auch in einer verschlungenen Art und Weise tut. Stattdessen tun Sie einfach 'eval ('(' + arg + ')')'. –

Antwort

3

{key: "val"} ist ein Block und key: ist ein Label.

Wenn Sie es als Objektinitialisierer analysieren möchten, verwenden Sie es an einer Stelle, die einen Ausdruck erwartet, z.

({key: "val"}) 
0,{key: "val"} 
[{key: "val"}][0] 
0

var arg = '{key: "val"}' var result = eval(arg)
wenn eval es analysieren, die '{' wird als Codeblock gedacht werden, und key: ist ein Label so denke ich, Sie
var arg = '{key:"val"}' var result = eval('('+arg+')') //result {key:"val"}