2011-12-19 14 views
16

JavaScriptはJavaのように厳密に型指定された言語ではありません。JavaScriptの型変換:(true && 1)vs(true | | 1)

私たちが知っているように、それは従属的文脈に結果の値を変換します

"2" + "3"結果"23"

"2" * "3"結果6

これは理解するのは非常に明確でOKです。

私は次の式を試してみましたが、混乱してしまった:

true && 1結果1
true || 1結果true

最初の番号を与え、第二は、ブールを与えるのはなぜ?

JavaScriptの変換ルールを考慮すると、booleanという表現のコンテキストのために、どちらの場合でもbooleanという値が得られると予想しています。

答えて

8

チェックDouglas Crockford's siteは、それは言う:

& &オペレータは、一般的に論理的と呼ばれています。また、 ガードと呼ぶこともできます。最初のオペランドがfalse、null、undefined、 ""(空の場合 文字列)、または番号0の場合、最初のオペランドが返されます。それ以外の場合は、 2番目のオペランドを返します。これは にヌルチェックを書くための便利な方法を提供します:

var value = p && p.name; /* The name value will only be retrieved from 
p if p has a value, avoiding an error. */ 

||演算子は一般的には論理名または論理名と呼ばれる です。デフォルトとも呼ばれます。 の最初のオペランドがfalse、null、未定義、 ""(空文字列)、または0の場合、 は2番目のオペランドを返します。それ以外の場合は、最初の オペランドを返します。これはデフォルトの値を指定するための便利な方法を提供します:

value = v || 10; /* Use the value of v, but if v doesn't have a value, 
use 10 instead. */ 
+0

説明に感謝します - それはガードとデフォルトについての面白い点です – sergionni

+0

あなたは大歓迎です。全体として、仕様の代わりにJavaScriptのDouglasのページを読むことをお勧めします。私の意見では理解するのがずっと簡単です。 http://javascript.crockford.com/ –

+0

大きな説明!私はあなたに+3を与えることができればいいと思う。 –

9

からquote MDC;

&&; falseに変換できる場合はexpr1を返します。そうでなければ、expr2を返します。したがって、ブール値で使用すると、&&は両方のオペランドがtrueの場合はtrueを返します。それ以外の場合はfalseを返します。
||; trueに変換できる場合はexpr1を返します。そうでなければ、expr2を返します。したがって、ブール値で使用すると、||いずれかのオペランドがtrueの場合はtrueを返します。両方がfalseの場合はfalseを返します。

expr1をfalseに変換できないため、最初の例では1が返されています。

第2の例では、trueをtrueに変換して戻すことができます。

+0

多くのおかげで、実際には「最初最後」のアプローチ – sergionni

0

あなたはあまりにものような他の事を行うことができます。

var myVar = Math.random() > 0.5; 

myVar && doFunc(); 

if(myVar) { 
    doFunc(); 
} 

||と同じであるが、基本的

「最初のものがfalseの場合、第二に行く」という意味

&&は基本的には「最初のことが真であれば、2番目に行く」

意味

function myFunction(options) { 
    options = options || {}; 
} 

:あなたは関数の先頭にこのようなものを参照してください理由です

オプションがfalseyがある場合は、作ること{}

9

これは、型変換とは何の関係もありません。

||は、最初のtruthyオペランドを返します。 1 || true1

を返します。最初のfalsyオペランドを返します。両方が真実であれば、2番目のオペランドを返します。 ECMAScript specification

+0

はあなたに感謝とMozillaのリソースは非常に貴重であることを、私に思い出させるができますあなたの答えは – sergionni

0

(*/+演算子はこれを行う)論理的な評価(これは& &、||)で混乱しています。

+0

については知らなかっ、JavaScriptのドキュメント – sergionni

関連する問題