If you really need to know how many arguments were passed just use rest parameters.
We should definitely not add more API to the arguments object. On Apr 13, 2012 1:34 AM, "Peter van der Zee" <e...@qfox.nl> wrote: > Fwiw, arguments.length is currently the _only_ way of properly > detecting the correct number of explicit variables of _any_ type. I > would hate for that behavior to change in the case of explicitly > passing on undefined. > > Default values of course do need to be set in the arguments array so > it's length will depend on that. Can we maybe set an extra property on > the arguments array that tells us how many arguments were explicitly > passed on, counting any type? I don't see how we could otherwise > figure that out, especially not after default values clobber this > count. > > - peter > > On Fri, Apr 13, 2012 at 8:27 AM, Erik Arvidsson > <erik.arvids...@gmail.com> wrote: > > This is covered on the wiki too. > > > > http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values > > > > On Thu, Apr 12, 2012 at 20:38, Russell Leggett > > <russell.legg...@gmail.com> wrote: > >>> The examples cited are arguably cases where the built-in behaviour is > >>> unintuitive to many JavaScript developers, because it doesn't match > their > >>> expectation with user code functions and most other built-ins. I > don't view > >>> any of the cases listed as validation that we would *want* that > behaviour by > >>> default, just that there are a non-zero number of cases where it exists > >>> today. > >>> > >>> > I suggest that the appropriate way to think of about the current > >>> > behavior, in the context of ES6, is that function f(a) {...} is > equivalent > >>> > to function f(a=undefined) {...} > >>> > In other words, there is a default initialization expression, if one > is > >>> > not specified. So, f() and f(undefined) appear to produce the same > result. > >>> > >>> This is a good way of explaining the proposed semantics, but... > >>> > >>> > But I see why somebody calling a function defined as function(a={ > >>> > }){...} explicitly as f(undefined) would expect to trigger the > default > >>> > value initializer. > >>> > >>> Right. This is exactly the sort of thing I'm worried about, and seems > >>> like the practical common case for default values. > >>> > >>> > >>> > >>> >> 2) The fact that JavaScript (at least for user objects) currently > >>> >> doesn't differentiate between missing arguments and undefined > arguments is a > >>> >> nice simplifying rule in the language that is easy to understand.. > >>> > >>> > It does differentiate, at least in regard to the arguments object. > >>> > >>> True. But this is uncommon enough as to not be something most > developers > >>> deal with. Default values aim to be a much more commonly used tool. > >>> > >>> > >>> > >>> > > 3) The example above, of wanting to have an API that allows > explicitly > >>> > > passing in undefined to override a default value, seems outside of > the > >>> > > common case (out of curiosity - are there any realistic example of > this?). > >>> > > If truly desired, it is easy to not use default values. But the > common > >>> > > case seems more likely to be to emulate what is done today - and > avoid > >>> > > having any undefined values flow into the API call. > >>> > >>> > Why is the example, outside of common sense. It is a straightforward > >>> > function to fill every element of an array with a common value. > Undefined is > >>> > certain something that can be stored in arrays so why wouldn't there > be > >>> > situations where where you would want to pass undefined. > Particularly if > >>> > the fill function was written by an unreformed Java programmer who > used a > >>> > peculiar default fill value. > >>> > >>> The last point was why I considered it outside of the common case. It > >>> seems unusual to intentionally want to fill with null by default, but > still > >>> allow overriding with an undefined fill. Not impossible, but I would > expect > >>> this to be rare enough that I don't mind making it the one case where > >>> default values can't be used. > >>> > >>> > I agree that there is some confusion among some JS programmer about > the > >>> > current missing argument default value rules. However, I don't > think what > >>> > you are suggesting is going to reduce that confusion. I think it > will > >>> > increase it. > >>> > >>> At the end of the day - I see value in enabling the patterns developers > >>> are using today to be refactorable into default values. I worry that > the > >>> current proposed semantics are too far away from what is used today to > make > >>> that practical. > >>> > >>> Of course, there is enough inconsistency in what is used currently > anyway > >>> - so this may be a difficult goal to achieve fully. But I suspect that > >>> treating undefined the same as not present at least keeps things close > >>> enough the common forms below could reasonably consider migrating to > default > >>> values. > >>> > >>> // All fairly common.. > >>> if(!param) { param = 3; } > >>> if(param == null) { param = 3; } > >>> if(typeof param == 'undefined') { param = 3; } > >>> param = param || 3; > >>> var param = arguments[1] || 3; > >>> > >>> // Not sure I've ever seen this... which seems to be the proposed > default > >>> value semantics > >>> if(arguments.length < f.length) { param = 3; } > >> > >> > >> > >> At first the answer to this didn't really matter to me, because how > often > >> does someone pass undefined to a function like foo(undefined). I know I > >> don't, though I'm sure it happens occasionally. Then I thought about it > and > >> realized that it happens in my code all the time, just not like that. A > much > >> more common case is a pass through of an argument to another function. > >> > >> function fadeIn(duration=200){...} > >> function fadeOut(duration=200){...} > >> function fadeToggle(duration){ > >> if(visible){ > >> fadeOut(duration); > >> }else{ > >> fadeIn(duration); > >> } > >> } > >> > >> Here, the argument duration is always passed through fadeToggle to > fadeIn or > >> fadeOut. Someone writing fadeIn would always expect to have a default of > >> 200. fadeToggle does not care about the duration so much as it wants to > pass > >> it on and use the defaults of the functions it calls. If passing > undefined > >> does not trigger the default, it would have to be rewritten like: > >> > >> function fadeToggle(duration){ > >> var hasDuration = typeof duration != "undefined"; > >> if(visible){ > >> if(hasDuration){ > >> fadeOut(duration); > >> }else{ > >> fadeOut(); > >> } > >> }else{ > >> if(hasDuration){ > >> fadeIn(duration); > >> }else{ > >> fadeIn(); > >> } > >> } > >> } > >> > >> Given this, I would probably just stick to putting > >> > >> duration = duration || 200; > >> > >> at the top of the function. > >> > >> - Russ > >> > >> > >> > >> > >> > >> > >>> > >>> > >>> Luke > >>> > >>> > >>> > >>> _______________________________________________ > >>> es-discuss mailing list > >>> es-discuss@mozilla.org > >>> https://mail.mozilla.org/listinfo/es-discuss > >> > >> > >> > >> _______________________________________________ > >> es-discuss mailing list > >> es-discuss@mozilla.org > >> https://mail.mozilla.org/listinfo/es-discuss > >> > > > > > > > > -- > > erik > > _______________________________________________ > > es-discuss mailing list > > es-discuss@mozilla.org > > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss