Description
In #12 (comment), it's proposed that replacer functions would be provided a unique-per-invocation rawTag
symbol which would be used like
function replacer(key, val, {rawTag}) {
if ( typeof val !== "bigint" ) return val;
return {[rawTag]: String(val)};
}
assert.strictEqual(JSON.stringify([1n], replacer), "[1]");
I like the design goals but the design itself is somewhat clunky to use. Can I propose instead providing a per-invocation function which would perform the marking? That is:
function replacer(key, val, {raw}) {
if ( typeof val !== "bigint" ) return val;
return raw(String(val));
}
assert.strictEqual(JSON.stringify([1n], replacer), "[1]");
I think that ends up being a lot nicer to use while accomplishing the same goals. It's also more in line with what I've seen in the ecosystem when the problem of marking particular values arises in other context - e.g. the tag
function in this library.
Under the hood I'm fine if the implementation of raw
is to return an object with a particular unique-per-invocation symbol-named property, though it's probably nicer to have it return some new opaque object (and have the JSON.stringify
throw if it encounters such an opaque object produced from something other than the current invocation's raw
).
Activity