2010-09-29 9 views
5

Warum muss der folgende Code ( und ) für eval hinzufügen?Warum müssen wir eval JSON Klammern hinzufügen?

var strJson = eval("(" + $("#status").val().replace(";","") + ")"); 

PS: $("#status").val() kehrt so etwas wie {"10000048":"1","25000175":"2","25000268":"3"};

+0

Warum verwenden Sie 'eval' an erster Stelle? Bleib einfach dabei: 'var strJson = $ (" # status "). Val(). Replace ("; "," ");' –

Antwort

3

eval eine JavaScript-Anweisung oder ein Ausdruck, aber {...} wäre als eine Anweisung oder ein Ausdruck gültig, und die Grammatik von JavaScript bevorzugt eine Anweisung.

Als Ausdruck:

{"10000048":"1","25000175":"2","25000268":"3"} 

ist ein Objekt mit einigen Eigenschaften (was du willst).

Als Erklärung ist es ein Block:

{      // begin Block 
    "10000048":   // LabelledStatement (but the quotes are invalid) 
     "1",   // Expression, calculate string "1" then discard it, then 
      "25000175": // you can't put a label inside an expression 

, die einen Fehler gibt.

(JavaScript-Etiketten können eine bestimmte Aussage zu beschriften für die Verwendung mit break/continue verwendet werden. Sie sind ein bisschen sinnlos und fast nie benutzt.)

So durch die Klammern Hinzufügen Sie die Mehrdeutigkeit aufzulösen. Nur ein Ausdruck kann mit ( beginnen, daher werden die Inhalte in einem Ausdruckskontext analysiert, wobei ein Objektliteral und kein Anweisungskontext angegeben wird.

Übrigens ist dies nicht ziemlich genug, um alle möglichen JSON-Werte richtig zu interpretieren. Aufgrund eines Versehens in JSONs Design sind die zwei unvergänglichen Unicode-Zeilenende-Zeichen U + 2028 und U + 2029 dazu berechtigt, in einem JSON-String-Literal, aber nicht in einem JavaScript-String-Literal uncapsiert zu setzen.Wenn Sie sicher sein wollen, können Sie ihnen entkommen, zB:

function parseJSON(s) { 
    if ('JSON' in window) return JSON.parse(s); 
    return eval('('+s.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029')+')'); 
} 
4

Es hängt davon ab, was der Wert in diesem Element ist (ein unbekannter), ist es in () Verpackung ist der sichere Weg für möglicherweise von kein Eingang zu berücksichtigen da sein.

Edit: Jetzt, wo Sie es JSON geklärt haben, ist dies nicht gültig:

eval('{"10000048":"1","25000175":"2","25000268":"3"}'); 

Aber das wird in einem gültigen Objekt führt zurückgegeben werden:

eval('({"10000048":"1","25000175":"2","25000268":"3"})'); 
//effectively: 
eval('return {"10000048":"1","25000175":"2","25000268":"3"};'); 

Bild in einem JavaScript-Datei:

<script type="text/javascript"> 
    {"10000048":"1","25000175":"2","25000268":"3"} 
</script> 

Dies wird fehlschlagen, es ist nur ein Objekt inline deklariert, aber nicht die richtige Syntax ... die Der gleiche Grund ein Server hat, um JSONP zu unterstützen, damit es funktioniert.


Ein bisschen tangential zur Frage, aber da Sie jQuery sind darunter, dann kann man auch verwenden $.parseJSON() (die den nativen JSON.parse(), sofern diese verfügbar werden) dafür: nimmt

var strJson = $.parseJSON($("#status").val().replace(";","")); 
+0

Hi das zurückgegebene val() ist etwas wie {"10000048": "1 "," 25000175 ":" 2 "," 25000268 ":" 3 "}; – Ricky

+0

Warum die erste Anweisung ungültig ist – Ricky

+0

@Ricky - Es ist einfach keine gültige Syntax aus dem gleichen Grund, weil es nicht direkt im Skript ist, da der Parser es nicht als Ausdruck betrachtet, während das '()' effektiv zu addieren ist (da es auf einen Ausdruck umschaltet, erkennt er '{' als Objektanfang, erhält/gibt das Objekt zurück, das Ihnen wichtig ist). –

Verwandte Themen