2017-02-17 3 views
0

戻り値がNaNの最初の例である理由を誰でも説明できますか? 2番目の例は問題ありません。戻り値がNaNの最初の例である理由を誰でも説明できますか? 2番目の例は大丈夫です

EX:1

function mul(a,...b){ 
    for (var i=0; i<b.length; i++); 
    return b[i] *= a; 
} 

EX:2

function mul(a,...b){ 
    for (var i=0; i<b.length; i++) 
    b[i] *= a; 
    return b; 
} 
console.log(mul(2,1,1,1)); 
+1

@デビッド - でしたJavaScriptはブロックベースのスコープを持っていますか? –

+2

'i'は_scope_の外にはなく、_range_の外にあります。あなたのreturn文が処理されると、 'i'の値は3で、' b [3] 'は' NaN'です –

+0

@ PM77-1:良い点。私はちょうどJavaScriptについて何か新しいことを学びました。私のコードでは、範囲を直感的にブロックベースに保ちますが、コードをクリアしておきます。 – David

答えて

1

b[i]は、最初の例でundefinedあるので。

のは、あなたがループでは、インデックスiカバーの長さ3の配列を超えるループしているとしましょう:ループの最後の繰り返しの後、iが再び増加している、しかし0、1、2

を現在3です。 bの長さが3の場合b[3]にアクセスしようとすると、定義されません。数学演算でundefinedを使用すると、NaNが生成されます。

for (var i=0;i<b.length;i++); // i loops from 0 to the length of the array 
return b[i]*=a; // i is now outside the bounds of the array 
0

このコードを実行し、その結果を観察します。

mul(2, 1, 2); 
 

 
function mul(a,...b){ 
 
    for (var i=0;i<b.length;i++); 
 
    alert(i); 
 
    alert(b[i]); 
 
    return b[i]*=a; 
 
}

ループiを終了した後は、b.lengthに等しいです。 b[i]を使用すると、元の配列を拡張できます。

数値を使用する前にb[i]に数値を割り当てていませんでした。したがって結果。

+0

* alert *ではなく* console.log *を使う方がはるかにユーザーフレンドリーです。 – RobG

0

セカンダリにないセミコロンがセミコロンであるため、何が起きているのかは分かりません。文のを閉じブラケットが効果的に空のブロックであるので、ループは何もせずに最後まで実行された直後に

function mul(a,...b){ 
    for (var i=0; i<b.length; i++); <=== this one 
    return b[i] *= a; 
} 

セミコロン。同等のコードがある:次の行で

function mul(a,...b){ 
    for (var i=0; i<b.length; i++) { 
    // empty block 
    } 
    return b[i] *= a; 
} 

Iてb.lengthにインクリメントされている(すなわち、3)ので、b[3]戻る未定義。

2番目の例では、セミコロンがないため、次のステートメントは角かっこで囲まれてブロックになります。そのステートメントは、私が(ちょうど上記のような)3として(0から2包括的に)3回以上ループとで終了します

function mul(a,...b){ 
    for (var i=0; i<b.length; i++) <=== no semicolon 
    b[i] *= a;     <=== so this statement is the block 
    return b; 
} 

同等のコードです:

function mul(a,...b){ 
    for (var i=0; i<b.length; i++) { 
    b[i] *= a; 
    } 
    return b; 
} 
関連する問題