@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-0JSON.stringify(-0) === "0"
-
Returns
"null"forNaNJSON.stringify(NaN) === "null"
-
Returns
"null"forInfinityJSON.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