@jsenv/uneval
turns a JavaScript value into a string that can be evaluated. It exists to overcome JSON.stringify
limitations.
Using @jsenv/uneval
+ eval
is more powerful and accurate than JSON.stringify
+ JSON.parse
. It supports circular structure and preserves types like Date
, Infinity
, -0
, BigInt
and more.
However JSON.stringify
is way faster and is safe (it cannot execute arbitrary code). So prefer JSON.stringify + JSON.parse
over uneval + eval
when you can.
-
Returns
"{}"
for a regexpJSON.stringify(/foo/) === "{}"
-
Returns
"0"
for-0
JSON.stringify(-0) === "0"
-
Returns
"null"
forNaN
JSON.stringify(NaN) === "null"
-
Returns
"null"
forInfinity
JSON.stringify(Infinity) === "null"
-
Returns a string for a date
JSON.stringify(new Date(0)) === `"1970-01-01T00:00:00.000Z"`
-
Throws on BigInt
try { JSON.stringify(1n) } catch (e) { e.type // "TypeError" e.message // "Do not know how to serialize a BigInt" }
-
Throws on circular structure
const value = {} value.self = value try { JSON.stringify(value) } catch (error) { error.name // "TypeError" error.message // "Converting circular structure to JSON" }
-
Ignores non enumerable properties
JSON.stringify(Object.defineProperty({}, "foo", { enumerable: false })) === "{}"
-
Is not optimized for repetitive structure
const value = "a-very-long-string" JSON.stringify([value, value])
"a-very-long-string"
would be repeated twice the string.
<script src="https://unpkg.com/@jsenv/[email protected]/dist/global/main.js"></script>
<script>
const { uneval } = window.__jsenv_uneval__
console.log(eval(uneval({ answer: 42 })))
</script>
— see also https://jsenv.github.io/jsenv-uneval/browser-example.
const { uneval } = require("@jsenv/uneval")
console.log(eval(uneval({ answer: 42 })))
— see also https://jsenv.github.io/jsenv-uneval/node-example.
npm install @jsenv/uneval