On Thu, Jan 7, 2016 at 8:27 PM, Alex Harui <[email protected]> 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 <[email protected]> wrote: > > On 1/7/16, 5:24 PM, "Andy Dufilie" <[email protected]> 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.
