justmoon/node-extend

Arrays are not replaced on deep copies

Closed this issue · 4 comments

I imagine that this is inherited from the jQuery implementation of extend, but I'm experiencing the exact same behavior described here:

http://forum.jquery.com/topic/jquery-extend-modifies-but-not-replaces-array-properties-on-deep-copy

In my opinion, the inclusion of array extending may be more problematic then helpful. Would you consider a deviation on this from what the jQuery folks chose to do?

EDIT: Been giving this some thought, and perhaps consistency is more important in a "port." I can certainly live with the current approach knowing that the overall behavior matches up with jQuery. Still, I'd be interested in your thoughts.

Arrays are objects too, and although I can certainly see the usefulness of replacing them, I think that "deep extend" should apply to all objects. In addition, I think consistency with jQuery is important here.

Either way, $.extend/_.extend, and all of their brethren, including this module, will soon be obsolete for shallow copies, now that Object.assign is in ES6.

I can certainly see the value of an Object.assign wrapper that both deeply copies objects, and replaces arrays rather than merges them - but I think it should be a separate module, not configured through a flag (the deep param imo was a mistake - it should have been $.extend and $.deepExtend from the start)

Indeed, we shouldn't discriminate. Arrays are objects too! I don't know if you saw my edit but I arrived at the same conclusion shortly after posting the issue. I almost closed it but elected not to so that I could get your thoughts. Thanks!

On Jul 2, 2014, at 6:49 PM, Jordan Harband notifications@github.com wrote:

Arrays are objects too, and although I can certainly see the usefulness of replacing them, I think that "deep extend" should apply to all objects. In addition, I think consistency with jQuery is important here.

Either way, $.extend/_.extend, and all of their brethren, including this module, will soon be obsolete for shallow copies, now that Object.assign is in ES6.

I can certainly see the value of an Object.assign wrapper that both deeply copies objects, and replaces arrays rather than merges them - but I think it should be a separate module, not configured through a flag (the deep param imo was a mistake - it should have been $.extend and $.deepExtend from the start)


Reply to this email directly or view it on GitHub.

BTW - I agree with the $.extend and $.deepExtend approach. That's the way it should have been.

On Jul 2, 2014, at 7:42 PM, Dale Shaw dale@xiatron.com wrote:

Indeed, we shouldn't discriminate. Arrays are objects too! I don't know if you saw my edit but I arrived at the same conclusion shortly after posting the issue. I almost closed it but elected not to so that I could get your thoughts. Thanks!

On Jul 2, 2014, at 6:49 PM, Jordan Harband notifications@github.com wrote:

Arrays are objects too, and although I can certainly see the usefulness of replacing them, I think that "deep extend" should apply to all objects. In addition, I think consistency with jQuery is important here.

Either way, $.extend/_.extend, and all of their brethren, including this module, will soon be obsolete for shallow copies, now that Object.assign is in ES6.

I can certainly see the value of an Object.assign wrapper that both deeply copies objects, and replaces arrays rather than merges them - but I think it should be a separate module, not configured through a flag (the deep param imo was a mistake - it should have been $.extend and $.deepExtend from the start)


Reply to this email directly or view it on GitHub.

Thanks for the input! Ideas are always welcome :-)