That's odd. I swear I remember someone from Adobe once explaining that function-style casting is faster than as-style casting (with the exception of primitive types that have a top level function that makes function-style casting impossible, as you mentioned in 1). I've tried to avoid as-style casting for years, based on this knowledge.
- Josh On Jan 7, 2016 7:24 PM, "Andy Dufilie" <andy.dufi...@gmail.com> wrote: > On Thu, Jan 7, 2016 at 8:27 PM, Alex Harui <aha...@adobe.com> wrote: > > > If "SomeType(somevar)" is not in a try/catch it will throw an exception. > > How often are you relying on that vs just trying to make the compiler > > happy? > > > > "function" casting is slower than "as" in ActionScript, so I have stayed > away from it. When I do use it, there are two cases: > > 1. If coercing to a primitive type, it actually tries to convert the value > to that type. With String(value) I expect it to give me a String via > toString(). With Number(value) I expect it to converting Strings to > Numbers and undefined -> NaN. I expect it to throw an error if the value > cannot be converted to a Number. Really I would rather have it return NaN > instead of throwing an error, but we can't change that behavior because > that's part of ECMAScript. > > 2. When coercing to a non-primitive, I mostly use it to get compiler > checking for the member variables or functions I access, but I would still > want it to throw an error even in JavaScript if it is not of the correct > type, because that's what it does in ActionScript and I expect the > cross-compiler to faithfully preserve the behavior. > > > On Thu, Jan 7, 2016 at 8:32 PM, Alex Harui <aha...@adobe.com> wrote: > > > > > On 1/7/16, 5:24 PM, "Andy Dufilie" <andy.dufi...@gmail.com> wrote: > > >if (obj is Thing1) > > > (obj as Thing1).foo(a,b); > > >else if (obj is Thing2) > > > (obj as Thing2).bar(x,y); > > > > There are no plans to change "is", just "as". Are you using "as" as a > > test or just "is". In the example above, you are using "as" just to make > > the compiler happy. > > > > > It's used above to get compiler checking in case I misspelled foo() or > bar(), or if I pass in bad variable types to either function. In the next > example, I'm relying on "as" to change the value to null without throwing > an exception if it is not of the correct type. The code will break if that > behavior is not preserved: > > var thing1:Thing1 = obj as Thing1; > var thing2:Thing2 = obj as Thing2; > if (thing1) > thing1.foo(a,b); > if (thing2) > thing2.bar(x,y); > > Here is similar real-world code relying on this behavior and it will break > if "as" is removed by the cross-compiler: > > > https://github.com/WeaveTeam/Weave/blob/13f98136a8cfd8dc4662f6014abcd5aa87baa56d/WeaveJS/src/weavejs/core/SessionManager.as#L335 > > > > > >I see "is" and "as" as highly useful features, and I think it would be a > > >mistake to make the code cross-compile into something that behaves > > >differently by default. IMO if cross-compiled code behaves differently > > >than the original then it's being mangled and can't be trusted. > > > > That's the root of my question: how many folks us "as" to actually > convert > > data vs just make the compiler happy. Again, no plans to change "is". > > > > > This is not just about making the compiler "happy." It's about getting the > benefit of compiler checking to alert you when you've typed the wrong > member variable / function name, or giving the wrong parameter types. If I > was only concerned about making the compiler happy (preventing it from > yelling at me), I could just use Object(value).whatever() or use untyped > variables everywhere. I may as well use plain JavaScript at that point. > > We shouldn't be planning to change anything that would cause the > cross-compiled to code to behave differently than the original source. > This is not something that should require a vote - it is an error to change > the behavior of code during cross-compilation. If such an option is added > to omit portions of code by default, then the compiler should give you a > warning for every place that occurs so the user knows exactly what is > happening. Otherwise the cross-compiler cannot be trusted. > > > > > > > > >A related issue is when setting a typed variable or passing in a > parameter > > >to a function, it will do type coercion automatically in AS but that > > >behavior is lost when cross-compiling to JS. For example, I have > > >situations like this where I now have to add manual type casting, and I > > >wish the compiler would do that automatically: > > > > > >var str:String = value_which_may_be_a_number; > > > > What error are you getting? I thought the auto-conversion worked for > both > > JS and AS. > > > > -Alex > > > > > Auto-conversion is currently not done for function parameters or variable > assignment. > > AS input: > public function testfunc(a:String, b:String):Array { > var c:String = a; > var d:String = b; > return [typeof a, typeof b, typeof c, typeof d]; > } > > JS output: > testfunc = function(a, b) { > var /** @type {string} */ c = a; > var /** @type {string} */ d = b; > return [typeof(a), typeof(b), typeof(c), typeof(d)]; > }; > > This code: > var foo = testfunc; > return foo(1,2) > will return ['string', 'string', 'string', 'string'] in ActionScript, but > ['number', 'number', 'number', 'number'] in JavaScript. >