2017-08-11 7 views
-4

私は数週間前にJavaScriptを学び始めましたが、私はいつもforループに関して固執しています。誰かがこの機能のしくみを説明してくれますか?

この例のように、私はforループが何を理解していない、誰かが私にこれを理解する方法のいくつかのヒントを教えてくださいできますか?コード内

let upper = function(strings, ...values) { 
    let result = ''; 
    for (var i = 0; i < strings.length; i++) { 
     result += strings[i]; 
     if (i < values.length) { 
      result += values[i]; 
     } 
    } 
    console.log(result); 
    return result.toUpperCase(); 
}; 
+0

ええ、唯一の 'for'ループがあります。二番目を誤って入れなかったのですか? –

+1

デバッガのコードを1行ずつステップ実行し、デバッガの動作を観察し、変数の値を調べます。 –

+0

'upper()'はどうやって呼びますか? – Durga

答えて

2

コメントがここで何が起こっているのか

//input is array with string and array with values. 
 
//strings, ...values - that is means that first argument will be strings, but all arguments since first will be pushed into array called values 
 
let upper = function(strings, ...values) { 
 
    console.log(strings); // ['a', 'b']; 
 
    console.log(values); // [1, 2]; 
 

 
    let result = ''; // result is an empty string 
 
    for (var i = 0; i < strings.length; i++) { // looping the array of string 
 
    result += strings[i]; // result = result + string from strings array at first iteration you will have result equal to 'a' 
 
    if (i < values.length) { //check do we have number i in values array 
 
     result += values[i]; // if yes than result = result + string from vaulues. at first iteration you will have result equal to 'a' + 1 that is equal to 'a1' 
 
    } // end of if 
 
    } // and so on 
 
    console.log(result); // 'a1b2' 
 
    return result.toUpperCase(); // returning result in uppercase 
 
}; 
 

 
var res = upper(['a', 'b'], 1, 2); 
 
console.log (res); // 'A1B2'

+1

2番目の引数は配列ではないはずです。実際には、 'values'配列に結合される任意の数の引数が必要です。値の配列は['c'、 'd'、 'e'、 'f'のようになります( 'a'、 'b'、 'c'、 'd'、 'e' ] –

+0

申し訳ありませんが、私は逃しました...私は答えを編集します – qiAlex

+2

@Teemuは普及した演算子ではない、それは 'Rest parameters'構文と呼ばれています。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters –

-1

を説明しますそれはあなたの文字のインデックスでの文字列の特定の文字を置き換えるvaluesの配列として渡します。

ただし、1つの欠点は、stringに渡された最初の文字を対応するvaluesの配列値に置き換えることをサポートしていません。

valuesは、arrayまたはのいずれかですが、この機能の欠陥は解決しません。

-1
let upper = function(strings, ...values) { 

これは関数宣言であり、変数 "upper"に無名関数を格納します。

let result = ''; 

これは空の文字列を "結果"に割り当てます。

for (var i = 0; i < strings.length; i++) { 
result += strings[i]; 
if (i < values.length) { 
    result += values[i]; 
} 
} 

forループは、匿名関数に渡された文字列を反復処理し、結果を "result"に格納します。他のパラメータがある場合、これらも「結果」に格納されます。

console.log(result); 
return result.toUpperCase(); 
}; 

ここでは、引数として結果とにconsole.log呼び出して、その結果にネイティブのtoUpperCaseメソッドを実行した後、結果の値を返します。

このような機能を持つことはできません。実行されません。引数は "... values"であってはなりません。しかし、それは何をし、値をとり、文字列を大文字の文字列として返します。

+0

*引数は "... values" *であってはなりません。どういう意味ですか? –

+0

".... values"で関数の引数を宣言しないでください。正しい方法は、upper = function(文字列、...値)とすることです。 – ptts

+0

私は混乱しています。関数の引数を "... values"で宣言すべきではないと言っていますが、正しい方法は "... values"と言います。あなたは何をすべきか、そうすべきではないと言っていますか?これは単なるパラメータ拡散構文ではありませんか? –

0

関数これはテンプレートリテラルタグの実装であり、すべて大文字

//declares a function in block scope with parameter strings and values which is an array of all other values passed to the function 
let upper = function (strings , ... values) { 
/declares a empty string with block scope called results 
let result = '' ; 
//a for loop that uses i as a counter 
//i is incremented (increased by one) each iteration of the loop until i equals the variable that is passed to the function called strings' length 
for (var i = 0 ; i < strings . length ; i ++) { 
//adds strings[i] to result variable declared above 
result += strings [ i ]; 
//if I is lessthan values length than add values[i] to results 
//if I was greater than or equal to values.length than values[i] wouldn't exist and an error would be thrown or Null would be added to results 
if (i < values . length) { 
    result += values [ i ]; } } 
//outputs result to the console and returns a completely uppercase string from the result variable to what called the function 
console . log (result); return result . toUpperCase(); }; 
0

に連結スティングとして渡されたすべての値を加算します。これは、パラメータstrings外テンプレートの部分${}として渡し、

MY NAME IS BOB AND I AM 29 YEARS OLD 

テンプレートリテラルメカニズムはupperという名前の関数を呼び出すに評価することになる

upper`My name is ${name} and I am ${age} years old` 

のように呼び出されます。この場合、それは["My name is ", " and I am ", " years old"]です。valuesように、文字列の間に来る補間値のリストを渡し、この場合

["Bob", 29] 

あるコードがstringsの値をループ。 valuesに対応する(後続の)補間値がある場合は、それを固定します。次に、結果全体を大文字にして返します。

独自のテンプレートリテラルタグの実装の詳細については、the documentationを参照してください。

+0

これは簡単で便利でした。ありがとう。 – JoeBirmen

関連する問題