> (function() { return this; }).call(false)
false
> !!(function() { return this; }).call(false)
true
最新のFirefox 4ベータ版とChromeの最新版で説明してください。.call(偽)の奇妙な動作を説明してください。
これは...ブール値ではなく、ブール値ではありますか?
> (function() { return this; }).call(false)
false
> !!(function() { return this; }).call(false)
true
最新のFirefox 4ベータ版とChromeの最新版で説明してください。.call(偽)の奇妙な動作を説明してください。
これは...ブール値ではなく、ブール値ではありますか?
原始的なブールがcall
またはapply
の最初の引数として渡されたとき、それはBoolean
オブジェクトに自動箱入りであることが表示されます。これは、Firefox 4にFirebugのでは明確である:
>>> (function() { return this; }).call(false)
Boolean {}
、真実を最初に混乱が、少しプロービング明らかにしています:
>>> (function() { return this; }).call(false)
false
>>> typeof (function() { return this; }).call(false)
"object"
すべてのJavaScriptオブジェクトもnew Boolean(false)
、 "truthy" ですおよびnew Number(0)
。したがって、2つの否定演算子(!!
トリック)を使用すると、それらはブール値true
にキャストされます。
この行は仕様上、動作を説明しています。
3. Else if Type(thisArg) is not Object, set the ThisBinding to ToObject(thisArg).
実質的にfalse
の値はブール値オブジェクトに変換されます。 !
演算子の最初のアプリケーションは、オブジェクトをtrue
に変換し、次にfalse
に逆変換します。 !
オペレータの2番目のアプリケーションは、false
をtrue
に逆変換します。
本文
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
Oooh私は実際には、これが仕様を参照して以来、受け入れられた答えとしてこれに行こうと誘惑されています...しかし、ideの答えは非常に簡単だったので、これを越えて他の誰かのために一番上に置いておきたい。 – Domenic
@Domenic - 彼らがやるべきことをもっと深く掘り下げたいのであれば、少し下にスクロールすることです。 – ChaosPandion
私はそれが大好きです! WTFのjavascript ?! – Prestaul
私は閉会の質問への答えは、それが 'ブール'のときだと思います。 – Domenic