У меня есть небольшая библиотека, которая берет строки и создает из них объекты. Например, '-key val'
создает {"key": "val"}
. Однако я пытаюсь расширить синтаксис входной строки, чтобы также принимать простые литералы объектов, такие как '-key "{key: 'val'}"'
, который должен давать {"key" : {"key" : "val"}}
, однако результат только {"key" : "val"}
.
Почему 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" }
{}
обрабатывается как блок, аkey
как метка, так что это оценивается как"val"
. Чтобы он оценивался как литерал объекта, вам нужно будет заключить его в круглые скобки. По сути, это то, что делает ваше исправление, хотя и запутанным образом. Вместо этого просто выполнитеeval('(' + arg + ')')
. - person   schedule 22.07.2016