Opened 6 years ago
Closed 6 years ago
#18577 closed defect (duplicate)
Not correctly copying arryas in lang.clone
Reported by: | Plamen Lenkov | Owned by: | |
---|---|---|---|
Priority: | undecided | Milestone: | tbd |
Component: | Core | Version: | 1.10.4 |
Keywords: | Cc: | ||
Blocked By: | Blocking: |
Description
If there is undefined index/indexes in an array - the cloned array skips them and then duplicates the values of the last indexes. Example:
var a = []; a[1] = "1"; a[2] = "2"; console.log(a); /* Result is [undefined, "1", "2"] */ var b = lang.clone(a); console.log(b); /* Result is ["1", "1", "2"], expected to be the same as 'a' */
It happens because there is a check in the lang.clone source - if(i in src)
which skips the undefined indexes and the resulting array's length is less than original.
And then at the end there is return lang._mixin(r, src, lang.clone);
which makes the source and resulting array the same size but duplicates the values at the end which were already pushed in the places of the originally undefined indexes.
Maybe the fix is just to remove the check if(i in src)
. At least that was how I expected to work.
Change History (3)
comment:1 Changed 6 years ago by
comment:2 Changed 6 years ago by
This seems like a duplicate of #16257, which contains a patch to fix this.
comment:3 Changed 6 years ago by
Resolution: | → duplicate |
---|---|
Status: | new → closed |
Duplicate of #16257.
I agree, closing as duplicate.
Sounds like a bug to me too. I traced that code back to 3d3d17129ecd99621520e56e7354ebabf8f624b6, to fix #9763, but #9763 was about dojo.clone() and functions, not about arrays.
Alternately to removing
if(i in src)
check, we could do:That avoids setting
r[i]
at all, rather than setting it toundefined
. Might be better?