<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Sep 28, 2011, at 11:21 AM, Dean Landolt wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div>Hmm, I think I see what you mean, but the hole case is different enough and anyway it has been in the language for 12 years.</div></div></blockquote><div> </div><div><br></div><div>
True enough, but wouldn't you say it's still commonly misunderstood?</div></div></blockquote><div><br></div>I don't hear enough about hole literal syntax to say that.</div><div><br></div><div><br><blockquote type="cite"><div class="gmail_quote"><div>Same here, but in comma-first it's not always adjacent:</div><div><br></div><div><div><font class="Apple-style-span" face="'courier new', monospace">var middleware = [ context,</font></div><div><font class="Apple-style-span" face="'courier new', monospace">                 , csrf</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">                 , xsite</font></div><div><font class="Apple-style-span" face="'courier new', monospace">                 , head</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">                 , considtional</font></div><div><font class="Apple-style-span" face="'courier new', monospace">                 , error</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">                 ]</font></div></div><div><br></div><div>You've got to squint a little to see that hole, right?</div></div></blockquote><div><br></div>That is horrible, and a reason to reject comma first. It mixes badly with comma last, and mixing is inevitable -- and I agree, hard to see due to separation onto two or more lines.</div><div><br></div><div><br><blockquote type="cite"><div class="gmail_quote"><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div style="word-wrap:break-word"><div><div class="im"><blockquote type="cite"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204, 204, 204);border-left-style:solid;padding-left:1ex">
So, if we still have holes, is it really worth getting rid of ArrayLiteral support for them? I think not.<br></blockquote><div> </div><div><br></div><div>But are they of any real use for ArrayLiterals? IMHO a hole in a small array (i.e. an ArrayLiteral) is almost always a mistake,</div>
</div></blockquote><div><br></div></div>Or a testcase for the otherwise unwanted feature:</div><div><br></div><div><a href="http://codesearch.google.com/#search/&q=%22,%20,%22%20lang:%5Ejavascript$&type=cs" target="_blank">http://codesearch.google.com/#search/&q=%22,%20,%22%20lang:^javascript$&type=cs</a></div>
<div><br></div><div>Some of those look intentional, and non-testy, though.</div></div></blockquote><div> </div><div> </div><div>But what does it say that the so many are just explicitly testing this edge case? And an entry from wtfjs, right there on the first page :)</div></div></blockquote><div><br></div>I already noted those, but did you look at the ones that looked intentional? We don't get to kick stuff out lightly.</div><div><br></div><div><br><blockquote type="cite"><div class="gmail_quote">
<div><br></div><div>Another wart that springs to mind is the fact that a hole === void 0 but is, in fact, not void 0. I guess technically this is correct -- reifying the index gets you void 0 -- but it's still odd.</div></div></blockquote><div><br></div>This is true with missing properties of any kind.</div><div><br></div><div><br><blockquote type="cite"><div class="gmail_quote"><div> If there were a way to indexOf for the first hole, for instance, this would at least allow them to be exploited in userland code for more efficiently spare array looping constructs -- that alone would be a win.</div></div></blockquote><div><br></div>Holes are not going away, we agree. Seems to me you're objecting to consequences of holes we can't eliminate without runtime-only compatibility breaks.</div><div><br></div><div><br><blockquote type="cite"><div class="gmail_quote">
<div>But really, my real beef is with the variance in behaviors for the array extras. IMHO the best bet would be for these APIs to grow an opt-in option to skip holes, but that ship probably sailed: an opt-in would be breaking and not statically analyzable; an opt-out would defeat the purpose -- if you're aware of holes you'd almost always want to skip over them, right?</div></div></blockquote><div><br></div>Right, and who wants more knobs on existing APIs.</div><div><br></div><div>Probably we should write generic functions in modules, a la itertools2. Let the old stuff on Array.prototype lie still.</div><div><br></div><div><br></div><div><blockquote type="cite"><div class="gmail_quote">
<div>So one reasonable alternative would be to promote holes into a real language construct we can both <i>visualize </i>and <i>exploit</i> from userland explicitly, along with fixing as much of the API surface as is practical that creates them implicitly -- starting with holes in array literals.</div>
</div></blockquote><br></div><div>I agree holes need better handling in future arraylike "extras". Design effort there can start now, using today's JS. I'd welcome it. Perhaps underscore does well already?</div><div><br></div><div>/be</div><br></body></html>