digressing a bit, but once you get used to the idea of deep-copying objects 
using JSON.parse(JSON.stringify(x)), you also realize web-projects are alot 
simpler if you keep many non-JSON-datatypes in string-form by default (BigInt, 
Date, CivilXxx, etc.), since the use-case to copy/serialize data between 
web-components is far more common than the need to actually revive data for use 
in low-level business-logic.

kai zhu
[email protected]



> On 24 Oct 2018, at 2:22 AM, Jamie <[email protected]> wrote:
> 
> 4 dots is already valid syntax when it has a number after it
> 
> let o = { ....4 }
> 
> 
> On Tue, Oct 23, 2018 at 9:05 AM kai zhu <[email protected] 
> <mailto:[email protected]>> wrote:
> hi Bilai, there’s no reliable way to deep-copy arbitrary js-objects. the most 
> practical “general” solution is two-step:
> 
> 1. deep-copy JSON-data first, e.g. ```var bb = 
> JSON.parse(JSON.stringify(aa))```
> 2. custom-copy non-JSON-data in a second-pass, e.g. ```bb.innerObj.func = 
> aa.innerObj.func```
> 
> like this real-world example [1]:
> 
> ```javascript
> local.jsonCopy = function (obj) {
> /*
>  * this function will [JSON] deep-copy obj
>  */
>     return obj === undefined
>     ? undefined
>     : JSON.parse(JSON.stringify(obj));
> };
> ...
> // update apiDict
> self = local.apiDict[key.join('.')] = local.apiDict[self._methodPath] =
>     local.jsonCopy(self); // step 1 - deep-copy JSON-data first
> // init ajax
> self.ajax = function (swaggerJson, onError) { // step 2 - custom-copy/add 
> non-JSON-data in second-pass
>     return local.apiAjax(self, swaggerJson, onError);
> };
> ```
> 
> [1] deep-copy swagger client-object with functions
> https://github.com/kaizhu256/node-swgg/blob/2018.9.8/lib.swgg.js#L2181 
> <https://github.com/kaizhu256/node-swgg/blob/2018.9.8/lib.swgg.js#L2181>
> 
> kai zhu
> [email protected] <mailto:[email protected]>
> 
> 
> 
>> On 23 Oct 2018, at 10:25 PM, Naveen Chawla <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Correction, suppose const b = { a : b } . Circular references can be cloned 
>> trivially, as far as I can tell
>> 
>> On Tue, 23 Oct 2018 at 20:52 Naveen Chawla <[email protected] 
>> <mailto:[email protected]>> wrote:
>> Is there any real problem with circular reference cloning? I don't see any, 
>> Please let me know in the simplest case e.g. { a: a } (obviously contrived 
>> syntax here)
>> 
>> Otherwise, I agree completely about the 4 dots being the wrong syntax for 
>> this, precisely for the reason you gave
>> 
>> On Tue, 23 Oct 2018 at 18:18 Henrique Barcelos <[email protected] 
>> <mailto:[email protected]>> wrote:
>> IMO, this would be very problematic.
>> 
>> 1. 4 dots are visually almost identical to 3 dots. This could introduce 
>> severe bugs because of a simple hard to spot typo.
>> 
>> 2. Deep traversing will always have performance problems in some cases. 
>> Dealing with circular references can take this issue even further.
>> 
>> I believe such functionality should be used in very specific situations, 
>> where object shape is well-known, not very deep and definitely not circular. 
>> So, supporting this at the core of the language will probably be frowned 
>> upon by the community.
>> 
>> Em ter, 23 de out de 2018 08:57, Ahad Cove <[email protected] 
>> <mailto:[email protected]>> escreveu:
>> Hello Scripters,
>> 
>> I really appreciate everything you all have done for the language and have 
>> no complaints over here.
>> I do have a suggestion though :)
>> 
>> At work we’ve almost got rid of lodash, except we still need it for DeepCopy 
>> vs rolling our own.
>> It’s the same with my side projects. I don’t use lodash because the main 
>> times that I need deep copy is when I’m either digging into the Redux store 
>> using React, or copying an observable in the Angular world.
>> 
>> I believe ES Script users would appreciate having a deep copy spread 
>> operator tremendously.
>> 
>> My proposal is to go off of the current spread operator we currently have in 
>> ES and make it 4 dots for a deep spread. This can be used on Objects or 
>> Arrays.
>> 
>> ‘’’js
>> const oldDeepObj = {
>>   InnerObj: {
>>        func: () => return ‘wow’
>>    }
>> }
>> 
>> const obj = {....oldDeepObj}
>> obj.innerObj.func = () => return ‘nice’
>> 
>> oldDeepObj.innerObj.func()
>> > wow
>> ‘’’
>> 
>> Thank you!
>> Looking forward to hearing back from you all.
>> If there’s any other questions let me know
>> 
>> - Bilal Abdullah
>> _______________________________________________
>> es-discuss mailing list
>> [email protected] <mailto:[email protected]>
>> https://mail.mozilla.org/listinfo/es-discuss 
>> <https://mail.mozilla.org/listinfo/es-discuss>
>> -- 
>> Henrique
>> 
>> _______________________________________________
>> es-discuss mailing list
>> [email protected] <mailto:[email protected]>
>> https://mail.mozilla.org/listinfo/es-discuss 
>> <https://mail.mozilla.org/listinfo/es-discuss>
>> _______________________________________________
>> es-discuss mailing list
>> [email protected] <mailto:[email protected]>
>> https://mail.mozilla.org/listinfo/es-discuss 
>> <https://mail.mozilla.org/listinfo/es-discuss>
> 
> _______________________________________________
> es-discuss mailing list
> [email protected] <mailto:[email protected]>
> https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to