2016-07-22 75 views
0

我有一個小型的庫,它接受字符串並構造它們之外的對象。例如,'-key val'創建了{"key": "val"}。然而,我試圖擴展輸入字符串的語法以獲取簡單的對象文字,例如'-key "{key: 'val'}"',它應該產生{"key" : {"key" : "val"}}但是結果只有{"key" : "val"}Javascript:如何使用eval返回或解析對象字面值?

爲什麼eval只返回「val」而不是整個對象?那麼我的解決方案是否有更安全的選擇?

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

下面是我的修復,這是非常不安全的!

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

的'{}'被視爲一個塊,'key'作爲標籤,所以這個評估爲'「val」'。要將其評估爲對象文字,您需要將其包裝在括號中。這基本上就是你的修補程序所做的,儘管是以一種複雜的方式。相反,只要執行'eval('('+ arg +')')'。 – 2016-07-22 03:02:14

回答

3

{key: "val"}是塊,key:是標籤。

如果您想將其解析爲對象初始值設定項,請在需要表達式的位置使用它,例如,

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

var arg = '{key: "val"}' var result = eval(arg)
時的eval解析它,在 '{' 將被認爲是代碼塊,並key:是一個標籤 所以我認爲你應該使用
var arg = '{key:"val"}' var result = eval('('+arg+')') //result {key:"val"}