Taking steps to make sure new features can be feature tested is A Good Thing® 
but relying on something being set that says "I support X" probably isn't the 
best path to take.




A lot of feature detection relies on shallow tests:




i.e. `if (!Array.prototype.includes) { ...` 




However, others need to test that features are properly supported by the 
engine. This is because shallow testing does not cover engine quirks. 




i.e. 
https://github.com/jquery/jquery/blob/7602dc708dc6d9d0ae9982aadb9fa4615a9c49fa/external/sizzle/dist/sizzle.js#L165-L191





So while I agree that feature support should be detectable as much as possible, 
relying on something like `Reflect.supports(...)` isn't any more useful than 
shallow feature detection (the engine might be lying to you).




TCO is one of the places where it is difficult to test for. However, it's a 
pretty rare that you would want to.




i.e.




```


var maybeRecursive;




if (Reflect.support('TCO')) {

  maybeRecursive = function(n) {


    n < 1000000 ? maybeRecursive(n++) : n;


  };

} else {

  maybeRecursive = function(n) {


    while (n < 1000000) {

      n++;

    }

    return n;

  }

}




recursive(0);

```




In this case you would just write the second. This is also true for most syntax 
features: you wouldn't use feature detection, you would simply transpile your 
code down to the lowest level of support you need it to have.




Again, definitely a good idea to ensure feature support is detectable. Luckily 
this is fairly well covered by the tc39 process since a polyfill is required as 
early as stage 1.




- James Kyle










On Tuesday, Mar 24, 2015 at 3:44 PM, Kyle Simpson <[email protected]>, wrote:
I should stress that while my original proposal (linked earlier in thread) 
mentions some of the "hard" ES6 cases (like TCO), my focus is not on creating 
feature tests for ES6. ES6 has sailed. Any feature we could possibly conceive 
here is quite unlikely to land in a browser before that browser gets all (or at 
least most) of the ES6 stuff that one might be wanting to test for.


My goal is for us to stop adding features to JS that aren't practically feature 
testable. I would strenuously desire to have something like 
`Reflect.supports(..)` (of whatever bikeshedded form) in ES2016 along with any 
new conceived features. That goes a thousand times more if we invent new syntax 
(we likely are) or new untestable semantics (like TCO).


Of course, if we had `Reflect.supports(..)` now, it'd be amazingly helpful in 
detecting TCO, which I would dearly love. But that's not the goal. I don't 
think we need to muddy the waters about what the ES6 feature tests would be. At 
least not for now.

_______________________________________________

es-discuss mailing list

[email protected]

https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to