Hmmmm... nice, I didn't know of this project "vice-versa"... it covers my needs, indeed... :-)
Thanks, Andrea! Diogo On May 26, 12:54 pm, Andrea Giammarchi <[email protected]> wrote: > I think I have no problems with vice-versa :D > > I use jQuery mainy for Sizzle and some tricky method so I would implement > directly Array.forEach if not present, rather than another jQuery method > which aim is to clone specs ( so it should not be jQuery method ) > > You can simply include only this file at the top of your application > (vice-versa has no dependencies intenrally) and problem solved, isn't it? > > http://vice-versa.googlecode.com/svn/trunk/src/Array.js > > Regards > > 2009/5/26 diogobaeder <[email protected]> > > > > > Hi, Andrea, sorry for being late in my answer... :-( > > > Thanks for the explanation! Well, in my opinion, we would better stick > > with MDC implementation in JS, because this way we can tell exactly > > what the code does to people who want to know what it is, and because > > it has passed by a whole lot of tests - it will be garanteed that we > > will not fall into bugs that the native implementation has not -. > > > Also, I don't know if you guys agree with me, but developers who might > > use a "jQuery.forEach" implementation probably will want to favor > > browsers with the native implementation, because of the performance > > gains, and probably will be aware of the counter-effects in non- > > compliant browsers (like slowdown on IE6 or 7, compared to the > > original "jQuery.each"). > > > Well, it's a more conservative opinion, but I think it's a better > > start point... we could do performance hacks later, when automated > > tests would have already been done... what do you think, Andrea? > > > Diogo > > > On May 23, 7:30 am, Andrea Giammarchi <[email protected]> > > wrote: > > > Ok. This is the point. Array.forEach is mainly used with non Array > > objects. > > > This is because with an Array we'll simply use a.forEach() rather than > > > Array.forEach(a). > > > > The most common case about Array.forEach is with HTMLCollection, a live > > > object. > > > > Array.forEach(document.getElementsByTagName("div"), function(div, i, > > all){ > > > if(div.className == "remove-me") > > > div.parentNode.removeChild(div); > > > else if(div.className == "empty") > > > div.appendChild(document.createTextNode("not anymore")); > > > > }); > > > > Now, if you think how many nested divs we tipically have in our DOM, as > > soon > > > as you remove one of them with className "remove-me" the live object > > > changes. This means that next iteration will be on index + 1 but since we > > > removed a div we do not know which one will be the next one ( how many > > divs > > > have been removed with that operation ? ) > > > > In a classic panorama where the main container is a div itself, with > > other > > > nested main containers populated via Ajax ( or not ) if we remove a > > > container with hundreds of divs the lenght of the loop will be the wrong > > one > > > and for every nested container the loop has to check if(i in list) plus > > an > > > i++ or ++i operation plus the classic (i < len). Retrieve a length is not > > > that expensive as we think, specially because we do not usually deal with > > > 100.000 objects a time. The sum of three operations, described before, > > could > > > be more expensive. My idea is that for DOM collection we could avoid the > > > usage of if(i in this) because broken lists ( with missed indexes ) are > > > extremely rare. If we avoid that theroetically spec compilant check which > > is > > > practically useless, we can boost up performances but we still need to > > avoid > > > modified length problems. This is why in first vice-versa Array file I > > did > > > not care at all about the i in this or the i in list, cause for 1 out of > > > 100000 possibilities the list is broken, other 99999 times we will have a > > > slower loop. If we want a spec compilant implementation, well, the MDC > > > version could be the one, but I would not care about the typeof check ( > > an > > > error will be throwed in any case if the first param is not a function > > and > > > if it is an object with call method the script will not be cross-browser > > ) > > > and I would not cast the lenght at all, first of all because in that way > > we > > > could have cutted lengths ( with extremely long list ) and secondly > > because > > > a length property should always be a number. So, as summary, the only > > check > > > I would do is about typeof obj.lneght == "number" but again, more we > > control > > > all these weird cases that hopefully will never happen, more we slow down > > > the already slow browser: Internet Explorer. > > > > Hope I explained better my points. Regards > > > > 2009/5/23 diogobaeder <[email protected]> > > > > > Andrea, > > > > > I don't think I got your point with live objects and forEach... could > > > > you please give an example where the basic implementation (as shown by > > > > Mozilla) would not be adequate? > > > > > Thanks! > > > > > Diogo > > > > > On May 22, 5:29 am, Andrea Giammarchi <[email protected]> > > > > wrote: > > > > > Ok, MDC specs do not consider the length, so the most close is this > > > > > > Array.forEach = Array.forEach || function(obj, callback, scope){ > > > > > for(var i = 0, length = obj.length; i < length; ++i){ > > > > > if(i in obj) callback.call(scope, > > obj[i], > > > > i, > > > > > obj); > > > > > }; > > > > > > }; > > > > > > Sorry for that :D > > > > > > 2009/5/22 Andrea Giammarchi <[email protected]> > > > > > > > To be honest I wrote something a bit redundant, this one is better > > if > > > > you > > > > > > want to use the length. > > > > > > > Array.forEach = Array.forEach || function(obj, callback, scope){ > > > > > > for(var i = 0; i < obj.length; ++i){ > > > > > > if(i in obj) > > > > > > callback.call(scope, obj[i], i, obj); > > > > > > }; > > > > > > }; > > > > > > even more simple, isn't it? > > > > > > > The scenario with DOM is tipically this one > > > > > > > div > > > > > > div > > > > > > div > > > > > > div > > > > > > div > > > > > > > getElementsByTagName("div") will have length 5, let's say the first > > > > one, > > > > > > the outer div, match something we were looking for and we remove > > it. > > > > With > > > > > > above version of Array.forEach the loop will be instantly stopped > > at > > > > next i > > > > > > < obj.length, because it changed, while with cached length, not > > > > updated, the > > > > > > loop will go on other 4 times and the i in obj will always fail. I > > > > guess > > > > > > then this version is, generally speacking, faster. > > > > > > > I am going to investigate a bit more about FireFox native behaviour > > > > though. > > > > > > > Regards > > > > > > > 2009/5/22 Andrea Giammarchi <[email protected]> > > > > > > > Actually, the main usage of Array.forEach is with non Array, like > > live > > > > > >> objects. Since with DOM is easy to remove a node and the result of > > the > > > > live > > > > > >> object could be completely changed, do you prefere 100 useless if > > I in > > > > obj > > > > > >> or just a loop brek thanks to changed length? Dunno which is > > faster > > > > and the > > > > > >> performance problem is the if, necessary if you want specs like, > > not > > > > the > > > > > >> length. Regards > > > > > > >> On May 22, 2009 1:05 AM, "Robert Katić" <[email protected]> > > > > wrote: > > > > > > >> There is no need to take in consideration eventual length updates; > > > > > >> that slows considerably, and it is not garanted in any/each native > > > > > >> implementation: > > >https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global. > > > > .. > > > > > > >> On May 21, 5:39 pm, Andrea Giammarchi < > > [email protected]> > > > > > >> wrote: > > > > > > >> > IE8? obviously no, how can you pretend a browser that > > implemented > > > > > > >> defineProperty only for Window... > > > > > > >> > On Thu, May 21, 2009 at 4:11 PM, diogobaeder < > > [email protected] > > > > > > >> wrote: > > > Hmmm... close, I... --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---
