I found this line in the specification that explains the behavior.
3. Else if Type (thisArg) is not Object, set the
ThisBinding to ToObject (thisArg).
Essentially false will be converted to a boolean. The first operator application ! converts the object to true and then inverts it to false . The second operator application ! inverts false to true .
Full text
10.4.3 Entering Function Code
The following steps are performed when control enters the
execution context for function code contained in function
object F, a caller provided thisArg, and a caller provided argumentsList:
1. If the function code is strict code, set the ThisBinding to thisArg.
2. Else if thisArg is null or undefined,
set the ThisBinding to the global object.
3. Else if Type (thisArg) is not Object, set the
ThisBinding to ToObject (thisArg).
4. Else set the ThisBinding to thisArg.
5. Let localEnv be the result of calling NewDeclarativeEnvironment
passing the value of the [[Scope]] internal
property of F as the argument.
6. Set the LexicalEnvironment to localEnv.
7. Set the VariableEnvironment to localEnv.
8. Let code be the value of F's [[Code]] internal property.
9. Perform Declaration Binding Instantiation using the function code
code and argumentsList as described in
Chaospandion
source share