2017-02-02 12 views
2

(..B ...)私は、このコードに来たが、私はそれが何を非常によく理解していない...戻り値void 0 === i &&(i = 3)、0 === i? (..A ..):(..B .. ..)?

test.update = function(i) 
{ 
return void 0 === i && (i = 3), 0 === i ? (..A..) : (..B..) 
} 

(..A ...)とコードIの避難所のちょうど他の線であり、投稿されました。

たとえば、iの値が0の場合、関数は何を返しますか?

「void 0 === i & &(i = 3)」とは何ですか?特に(i = 3)。それはif (void 0 === i)が真であり、iが3を得ることができることを意味しますか?iは3になりますか?カンマはどうですか?私はこれをチェックしたquestionしかし、私はまだそれを取得しません。

ご迷惑をおかけして申し訳ありませんが、何が起こっているのかを完全に理解できるように完全な回答が必要です。 void operatorは式を評価し、undefinedを返すため

は、あなたに

+1

私はそれだけで '(..Bを...)実行' 'i'値が渡されたものは何でも文のブロックを推測します。 – pttsky

+0

'void 0 === i'は' i'が 'undefined 'であるかどうかをチェックしているようです。 'i = 3'は' i'が未定義でないときに 'i'を3に設定します。 – evolutionxbox

+0

'0 === i'は' i'が '0'かどうかをチェックし、'(..A ..) 'または'(..B ..) 'のいずれかを行います。この戻り値は、[コンマ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator)と[3次操作](https://developer.mozilla.org/)を使用します。 ja/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)。 – evolutionxbox

答えて

5

さて、最初のはoperator precedenceに応じてブラケットを設定してみましょう:

return (((void 0) === i) && (i = 3)), ((0 === i) ? A : B) 

void 0 

は、単にundefinedを返し、単一の操作に。明らかにiが未定義であるかどうかをチェックする

undefined === i 

:我々はまた、このようにそれを書くことができます。

i = 3 

は、最初の比較のように見えますが、実際にそれが3を返し割り当てます。これまでのところ、iが定義されていないかどうかを調べ、そうであれば、値は3に割り当てられています。

次のコンマは、単独の演算子です。すべての式を左から右に評価し、最後の式を最も右に返します。この場合、最後の式は0iの比較です。この時点でi0の場合、式全体の戻り値はtrueです。

最後に、if .. else ..と書くための短い方法である条件演算子があります。

これまでのラインものように書くこともできます

if (i === undefined) { 
    i = 3; 
} 
if (i === 0) { 
    // return (A) 
} 
else { 
    // return (B) 
} 
1

残りは重要ですありがとうございました。例えば

式が関数呼び出しである場合、

return void func(); 

のようなその関数はfuncは別の何かを返している場合でも、呼び出されるとvoidリターンundefinedされます。

2

ちょうどそれを実行して、私は=== 0、A、他の実行Bを実行する場合、まず最初に関係なく、残りは

を何undefinedを返していないことを確認し、私の場合==「」、I = 3 - >経営のB

var test= {} 
 
test.update = function(i) { 
 
    return void 0 === i && (i = 3), 0 === i ? (console.log(i,"a")) : (console.log(i,"b")) 
 
} 
 

 
console.log("i is null, res:"+test.update(null)); 
 
console.log("no i, res:"+test.update()); 
 
console.log("i blank, res:"+test.update("")); 
 
console.log("i=0,res:"+test.update(0)); 
 
console.log("i=1,res:"+test.update(1)); 
 
console.log("i=2,res:"+test.update(2)); 
 
console.log("i=3,res:"+test.update(3));

1

私はそれはちょうど私が渡された値どんな文の(..B ...)ブロックを実行思います。

  • voidオペレータは、そのオペランドを評価し、評価の結果に依存しないundefined を返します。
  • commaオペレータは単に一つのことを評価し、その後、別の、(var i = 0, j = 0;のように)左から右へ
  • 0 === i && (i = 3)セット3からii0
  • に等しい場合0 === i ? (..A..) : (..B..)は、文のA又はBブロックを実行するが、上記述べたようにこの時点でi0と等しくないことが保証されています。
関連する問題