Javascript: как вернуть или проанализировать литерал объекта с помощью eval?

У меня есть небольшая библиотека, которая берет строки и создает из них объекты. Например, '-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" }

person Aage Torleif    schedule 22.07.2016    source источник
comment
{} обрабатывается как блок, а key как метка, так что это оценивается как "val". Чтобы он оценивался как литерал объекта, вам нужно будет заключить его в круглые скобки. По сути, это то, что делает ваше исправление, хотя и запутанным образом. Вместо этого просто выполните eval('(' + arg + ')').   -  person    schedule 22.07.2016


Ответы (2)


{key: "val"} — это блок, а key: — это метка.

Если вы хотите проанализировать его как инициализатор объекта, используйте его в месте, которое ожидает выражения, например.

({key: "val"})
0,{key: "val"}
[{key: "val"}][0]
person Oriol    schedule 22.07.2016

var arg = '{key: "val"}' var result = eval(arg)
когда eval анализирует его, '{' будет рассматриваться как блок кода, а key: - это метка, поэтому я думаю, что вам следует использовать
var arg = '{key:"val"}' var result = eval('('+arg+')') //result {key:"val"}

person hello world    schedule 22.07.2016