質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2021閲覧

for文の二重ループを使用して図形を作る、というコードが理解できません。

hayamine1111

総合スコア11

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/04/30 03:25

str = str + ""; というコードが理解できません

以下の内容を示すコードを見て、一部理解できない箇所があります。

JavaScriptで、for文を使った二重ループを使用して、「」を縦横に並べて長方形を作るという内容です。縦横に並べる「」の個数は、1~10までの数値でランダムに選出します。

発生している問題・エラーメッセージ

以下のソースコードをにある「str += "";」(3行目)と、その少し下にある「str = str + "*";」(6行目) と「str = str + "\n"」(8行目)の3つのコードの意味がわかりません。

3行目のコードはなぜ「""」となっているのでしょうか。
6,8行目の「str = str + ""; 」「str = str + "\n"」は、なぜ「str +」となっているのでしょうか。
並べるのは「
」だけなので、「str +」は必要ないのではと思うのですが、それを削除するとコンソールには何も表示されなくなります。

エラーメッセージは表示されません。 ```JavaScript

let width = Math.round(Math.random() * 10);
let height = Math.round(Math.random() * 10);
let str = "";
for(let i = 1; i <= height; i++){
for(let j = 1; j <= width; j++){
str =str + "*";
}
str =str + "\n";
}
console.log(str);

### 試したこと 【3行目について考えたこと】 ・「str = "";」は、空白を入れる(strの存在を残しておく??)という意味。ただ、そもそも空白(" ")ではないので、違うだろうとは思います。 ・まだ代入するものはないけど、とりあえず変数strを作っておきたいため。 ・後述する「str =」を後から入れるため。 【6、8行目について考えたこと】 ・試しに「str +」を消して、「str = "*";」「str = "\n";」としてみましたが、そうするとコンソールには何も表示されなくなります。 ・3行目で作った変数strに足すことで、文字列を具現化できる(???)。 正直さっぱりです。 当方まだJSを勉強し始めて日が浅いため、基本的な理解が足りない部分があると思います。 うまく伝えられているか不安ですが、もしよろしければどなたか回答をしていただけると非常に助かります。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/04/30 04:09

=は、数学的な等価ではなく、文字列を連結して再代入していると考えては?
hayamine1111

2019/04/30 06:32

hai_haiさん、ありがとうございます。 再代入ですか。そう考えるとしっくりくるような、、、。
guest

回答2

0

3行目の理解はだいたい合っています。正確には空白ではなく、長さ0の文字列で初期化しています。表示に必要な文字は後続の処理で追加していくので、最初は何もなしで構わないわけです。

6行目と8行目は、表示に必要な文字(「*」や「\n」)をstrに追加しています。追加せずに単純に代入してしまうと、その文字だけが「console.log(str);」で表示されることになってしまいます。何も表示されなくなったのは、「console.log('\n');」が最終的に実行されたためです。strの内容が、目に見えない改行文字になってしまったからです。

追加と代入の違いは、下記のコードを動かして見てみるとわかりやすいと思います。

javascript

1let str = ''; 2str = str + '*'; 3str = str + '\n'; 4str = str + '*'; 5str = str + '*'; 6console.log(str);

javascript

1let str = ''; 2str = '*'; 3str = '\n'; 4str = '*'; 5str = '*'; 6console.log(str);

投稿2019/04/30 04:14

iwamot

総合スコア1154

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayamine1111

2019/04/30 06:32

ご回答ありがとうございます。 ”空白ではなく、長さ0の文字列で初期化”というのがしっくりきました。 後で追加される2つ分を3行目で宣言していたのですね。 確認用のコードを動かしてみましたが、頭の中がすっきりまとまりました。 ありがとうございました。
guest

0

ベストアンサー

3行目のコード

単に変数strを宣言して、空の文字列を代入しているだけです。
宣言let strだけでも問題ありませんが、空文字列を代入しておいた方が「あぁ、あとで別の文字列を入れるのかな」と予想がつきます。

6行目のコード

str = str + "*";は「今のstr"*"を足して、もう一度strに代入」しています。
JavaScriptでは、文字列どうしを+で連結することができます。

8行目のコード

6行目と同じですが、こちらは改行文字\nを代入しています。


「図形をつくる」というよりも「*を、1行につき何文字(width)、何行(height)表示する」と考えるといいと思います。

必要な処理は、以下の通りです。

(1)1行分の文字列を作る(57行目)
(2)改行をいれる(8行目)
(3)(1)と(2)を必要な行数分繰り返す(4
9行目)

(1)をさらに分解すると、以下の通りです。

(1-1)変数strに保存されている文字列の末尾に文字"*"を追加する(6行目)
(1-2)次の処理のために、新しい文字列を変数strに再代入する(6行目)

試しに「str +」を消して、「str = "*";」「str = "\n";」としてみましたが、そうするとコンソールには何も表示されなくなります。

hayamine1111さんが試したのは、以下のような処理になり、最終的改行文字だけになり、コンソールには、一見して何もないように見えます。

(1-1)str"*"を代入する(上書きする)
(1-2)str"\n"を代入する(上書きする)

投稿2019/04/30 04:15

編集2019/04/30 04:16
NozomuIkuta

総合スコア1260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayamine1111

2019/04/30 06:32

非常にわかりやすい解説をありがとうございます。 3行目は宣言だけでもいいけど空文字列にすると後々わかりやすい、というのがかなり納得しました。 6,8行目に関しては再代入というのがキーワードですね。 このソースコード以外でもよく見かけるものだったので、これで学習が捗りそうです。
NozomuIkuta

2019/04/30 07:47

解決したようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問