B1KMusic

(JS) Strange behavior with forEach/shift

Dec 18th, 2017
660
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.54 KB | None | 0 0
  1. Relevant links:
  2.  
  3. JSFiddle playing with "secret santa":
  4. https://jsfiddle.net/B1KMusic/gu4ofjre/3/embedded/result%2Cjs/
  5.  
  6. Modified version to scale it up, expanding on the "small number of chains" peculiarity:
  7. https://pastebin.com/VUfbVGg5
  8.  
  9. While I was playing with the code to generate a huge string of unique names, I decided to see what happens if I replace arr[l-1] (the last element of the current generation, nondestructive) with arr.shift() (the first element, destructive)
  10.  
  11. arr = "abcdefghijklmnopqrstuvwxyz".split("");
  12.  
  13. for(let i = 0; i < 6; i++)
  14. arr.forEach(function(el){
  15. arr.push(el + arr.shift());
  16. });
  17.  
  18. arr.join(",");
  19.  
  20. The results were quite surprising:
  21.  
  22. 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,ymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececcb,ukswyymymmgymmgmgqymmgmgqmgqqiymmgmgqmgqqimgqqiqiieymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieec,ieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmgecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmggd,ecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqukswyymymmgymmgmgqymmgmgqmgqqiukswyymymmgymmgmgqymmgmgqmgqqiymmgmgqmgqqimgqqiqiie,mgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukukkf,qiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmg,ymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecooh,ieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmgecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqukswyymymmgymmgmgqymmgmgqmgqqi,mgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukssj,ymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecoumgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouuk,mgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswwl,mgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyym,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaan,ukswyymymmgymmgmgqymmgmgqmgqqiymmgmgqmgqqimgqqiqiieymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececo,ecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqukswyymymmgymmgmgqymmgmgqmgqqiukswyymymmgymmgmgqymmgmgqmgqqiymmgmgqmgqqimgqqiqiieukswyymymmgymmgmgqymmgmgqmgqqiymmgmgqmgqqimgqqiqiieymmgmgqmgqqimgqqiqiiemgqqiqiieqiieiep,qiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmgieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmgecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgq,ieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmgecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqukswyymymmgymmgmgqymmgmgqmgqqiecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqukswyymymmgymmgmgqymmgmgqmgqqiukswyymymmgymmgmgqymmgmgqmgqqiymmgmgqmgqqimgqqiqir,ymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecoumgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuks,mgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymt,ukswyymymmgymmgmgqymmgmgqmgqqiymmgmgqmgqqimgqqiqiieymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececoymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecou,qiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmgieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmgecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyymecouukuksukswukswyukswyymukswyymymmgecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqecouukuksukswukswyukswyymukswyymymmgukswyymymmgymmgmgqukswyymymmgymmgmgqymmgmgqmgqv,ymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecoumgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksuksw,ukswyymymmgymmgmgqymmgmgqmgqqiymmgmgqmgqqimgqqiqiieymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececoymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecoumgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecoux,ymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecoumgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswy,ymmgmgqmgqqimgqqiqiiemgqqiqiieqiieieecmgqqiqiieqiieieecqiieieecieececomgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecoumgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswmgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswymgqqiqiieqiieieecqiieieecieececoqiieieecieececoieececoecouqiieieecieececoieececoecouieececoecouecouukqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyqiieieecieececoieececoecouieececoecouecouukieececoecouecouukecouukuksieececoecouecouukecouukuksecouukuksukswieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyieececoecouecouukecouukuksecouukuksukswecouukuksukswukswyecouukuksukswukswyukswyz'
  23.  
  24. How does this happen? keep in mind that we start with [a,b,c,...x,y,z] as iteration 0, and the following iterations are, at least theoretically:
  25.  
  26. [b,c,d,...x,y,z,aa]
  27. [c,d,e,...x,y,z,aa,bb]
  28. [d,e,f,...x,y,z,aa,bb,cc]
  29.  
  30. and so on until you have generation #2:
  31.  
  32. [aa,bb,cc,...xx,yy,zz]
  33.  
  34. and this goes on for only 6 generations to end up with the monstrosity above.
  35.  
  36. Have I discovered something vaguely reminiscent of undefined behavior (like how using memcpy or memmove in C results in UB if the regions overlap)? Does forEach have some strange nuance when it comes to modifying the list *while* iterating through it? Or is there something else going on?
  37.  
  38. Note: I am aware that generation #2 actually looks like this: [aa,cb,ec,gd,ie,kf,mg,oh,qi,sj,uk,wl,ym,aan,eco,iep,mgq,qir,uks,ymt,ecou,mgqv,uksw,ecoux,ukswy,ukswyz]. This question is about expected behavior vs actual behavior and how/why the results come about.
Advertisement
Add Comment
Please, Sign In to add comment