2011-02-02 14 views
6
> (function() { return this; }).call(false) 
false 

> !!(function() { return this; }).call(false) 
true 

最新のFirefox 4ベータ版とChromeの最新版で説明してください。.call(偽)の奇妙な動作を説明してください。

これは...ブール値ではなく、ブール値ではありますか?

+0

私はそれが大好きです! WTFのjavascript ?! – Prestaul

+0

私は閉会の質問への答えは、それが 'ブール'のときだと思います。 – Domenic

答えて

6

原始的なブールがcallまたはapplyの最初の引数として渡されたとき、それはBooleanオブジェクトに自動箱入りであることが表示されます。これは、Firefox 4にFirebugのでは明確である:

Chromeのインスペクタで
>>> (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にキャストされます。

4

この行は仕様上、動作を説明しています。

 
3. Else if Type(thisArg) is not Object, set the 
    ThisBinding to ToObject(thisArg). 

実質的にfalseの値はブール値オブジェクトに変換されます。 !演算子の最初のアプリケーションは、オブジェクトをtrueに変換し、次にfalseに逆変換します。 !オペレータの2番目のアプリケーションは、falsetrueに逆変換します。

本文

 
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 
+0

Oooh私は実際には、これが仕様を参照して以来、受け入れられた答えとしてこれに行こうと誘惑されています...しかし、ideの答えは非常に簡単だったので、これを越えて他の誰かのために一番上に置いておきたい。 – Domenic

+0

@Domenic - 彼らがやるべきことをもっと深く掘り下げたいのであれば、少し下にスクロールすることです。 – ChaosPandion

関連する問題