Hey Allen, thanks for clarifying. What will happen to other Array methods which currently return Arrays? `filter` is the primary one that comes to mind. Will `uint32array.filter((v) => v != 0)` return a Uint32Array? (I think it should behave the same way `map` does.)
Additionally, what will happen with the return values of `slice`, `splice`, and `reverse`?.. not to mention `concat`, which I know is a much more complex beast. Nathan ---------------------------------------- > Subject: Re: Array subclassing, .map and iterables (Re: Jan 30 TC39 Meeting > Notes) > From: al...@wirfs-brock.com > Date: Wed, 13 Feb 2013 17:49:27 -0700 > CC: claus.rei...@talk21.com; e-t...@ecma-international.org; > es-discuss@mozilla.org > To: nathan.w...@live.com > > > On Feb 11, 2013, at 7:13 PM, Nathan Wall wrote: > > > Thank you for this explanation. This is very interesting! If you don't > > mind, I have some questions/concerns I'd like to clear up. (In particular I > > want to make sure I understand; I don't intend to argue for one side or the > > other ATM, but this change may require me to refactor some old code to be > > future-ready). > > > > Allen Wirfs-Brock wrote: > >> The choice we agreed to, at the meeting is > >> > >> 1) Array.prototype.map produces the same kind of array that it was applied > >> to, so: > >> > >> for the above example > >> m instance of V will be true. > >> intArray.map(v=>v.toSring()) produces an Int32Array. The strings produced > >> by the map function get converted back to numbers. > > > > Sounds cool! Does it work? > > > > I rely on the genericness of Array methods quite a lot. For example, it's > > fairly common for me to write something like the following: > > > > var map = Function.prototype.call.bind(Array.prototype.map), > > select = document.querySelectorAll.bind(document); > > > > var ids = map(select('div'), function(el) { return el.id; }); > > > > Currently this would get me an array of string ids for every div on a page. > > In a future ES6 with a future DOM where NodeList extends Array, will `ids` > > no longer hold an array of strings but try to remain a NodeList? > > Anything that works with ES5 semantics should continue to work, assuming > nothing else changes. > > If NodeList was turned into an actual subclass of Array, then the default > behavior of Array.prototype.map when applied to a NodeList will be to create > a new NodeList, assuming that NodeList supports all the mechanism that map > uses to create its result object. Of course, the design of this new NodeList > has the option of over-riding the inherited definition of map and/or opt-ing > out of the create something other than Array instance behavior. > > Regardless, because of backwards compatibility concerns, I'm skeptical that > NodeList could ever be made into an Array subclass. It seems more likely that > a new kind of DOM Node collection that was an Array subclass might be > introduced > > > > > There's a good chance this will break some of my code. I'm capable of > > changing my code and writing this to be more future-friendly from now on > > (I'm not one who prefers backwards compatibility over a better language). > > But I would have always assumed I was doing things correctly before, and > > I'm curious if the rest of the internet will be okay..? > > We can't break existing code. Where things get messy is when old code is > combined with new code that uses new features. For example, you map function > will produce a SubArray instance if it is called with a SubArray instance > assuming that SubArray is a real ES6 subclass of Array as its first argument. > > Allen _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss