<div dir="ltr"><div>Have you ever encountered performance issue because of copying object on deserialization?<br><br></div><div><a href="https://gist.github.com/Ginden/381448a17f50c7669b9a3693742e3a3d">https://gist.github.com/Ginden/381448a17f50c7669b9a3693742e3a3d</a> For me results are:<br><span style="font-family:monospace,monospace"><br>Simple JSON.parse, 100000 iterations: 39.594999999997526ms<br>JSON.parse with copy, 100000 iterations: 184.5699999999997ms<br>JSON.parse with __proto__ change, 100000 iterations: 89.75500000000102ms</span><br><br><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 28, 2016 at 5:49 PM, 段垚 <span dir="ltr"><<a href="mailto:duanyao@ustc.edu" target="_blank">duanyao@ustc.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">在 2016/9/28 22:59, Danielle McLean 写道:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
From: 段垚 (mailto:<a href="mailto:duanyao@ustc.edu" target="_blank">duanyao@ustc.edu</a>)<br>
Date: 28 September 2016 at 16:36:52<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
[I]mplementors warn that mutating prototype causes "performance<br>
hazards".<br>
</blockquote>
You don't actually need to mutate any prototypes to get prototypeless<br>
objects out of `JSON.parse` - the reviver function is allowed to<br>
return a new object instead, so you can create a fresh one with the<br>
correct prototype. For example:<br>
<br>
```js<br>
JSON.parse(string, function(k, v) {<br>
   if (v && typeof v === 'object' && !Array.isArray(v)) {<br>
     return Object.assign(Object.create(nu<wbr>ll), v);<br>
   }<br>
   return v;<br>
});<br>
```<br>
</blockquote>
<br></span>
Yes, but creating a copy also has performance penalty. This proposal is made for performance.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
How about adding an option to omit prototype of objects created by<br>
JSON.parse()?<br>
<br>
JSON.parse(str, { noPrototype: true });<br>
</blockquote>
While you can achieve the appropriate result already without extra<br>
language support, I think this particular situation is common enough<br>
that such an option might be a good idea.<br>
<br>
How would you expect this new parameter to interact with the existing<br>
second parameter to `JSON.parse`, the reviver function? I'd suggest<br>
that the cleanest way to add the options would be for the second<br>
parameter to be either an object or function, like this:<br>
<br>
```js<br>
JSON.parse(str, someFunc);<br>
// equivalent to<br>
JSON.parse(str, {reviver: someFunc});<br>
```<br>
</blockquote></span>
Looks reasonable.<br>
<br>
Maybe we can simply add another method, say `JSON.parseWithoutPrototype()`<wbr>. This makes feature detection easier.<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listi<wbr>nfo/es-discuss</a><br>
</div></div></blockquote></div><br></div>