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

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

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

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

Q&A

解決済

3回答

1665閲覧

なぜconstを使っているのかわかりません

Ko_jiro

総合スコア1

JavaScript

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

1グッド

1クリップ

投稿2023/05/02 03:43

実現したいこと

定数constを宣言している理由を知りたいです。

前提

教本でJavaScriptの勉強をしています。
cookieの承認ボタンがクリックされたかどうか確かめるコードです。
1行目でconst agreeを宣言するのですが、この定数agreeにはcookie承認ボタンがクリックされたら'yes'を代入するので、定数より変数letで宣言するべきではないのでしょうか?
なぜconstを使っているのか教えていただきたいです。

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

エラーメッセージ

該当のソースコード

JavaScript

1const agree = Cookies.get('cookies-agree'); 2if(agree === 'yes') { 3 console.log('クッキーを確認しました'); 4} else { 5 console.log('クッキーを確認できません'); 6 document.getElementById('agreebtn').onclick = function() { 7 Cookies.set('cookies-agree', 'yes', {expires: 7}); 8 }; 9}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

tkmtmkt👍を押しています

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

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

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

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

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

m.ts10806

2023/05/02 03:48

コードが一部なのでなんとも言えませんが、提示されたコードだけだと再代入がないのでconst妥当です
Ko_jiro

2023/05/02 04:10 編集

7行目で値は書き換えるのですが、ページが読み込まれたときに1回だけ処理するので値の再代入には当たらないということですかね? 例えばこのコードをwhileの中に書いていたらダメですよね?
m.ts10806

2023/05/02 05:45

>7行目で値は書き換えるのですが クッキーのcookies-agreeというキーの値をセットしてるだけで「書き換え」ではないですし、 const無関係です。 > 例えばこのコードをwhileの中に書いていたらダメですよね? 何を求めたいかによりますが、実際にサンプルコード書いてみてはどうでしょう。
otn

2023/05/02 13:25

> この定数agreeにはcookie承認ボタンがクリックされたら'yes'を代入するので 何故そう思ったのか不思議でなりません。 agreeに'yes'を代入するというコートは、agree = 'yes'; ですよ。
Ko_jiro

2023/05/03 02:37

1行目の代入についてですが、agree='yes'のように直接的ではないですがCookies.getで'yes'を取得してそれを間接的に代入していると思うのですが間違った解釈ですかね?
otn

2023/05/03 06:06

1行目は代入ですよ。そこは間違っていません。 更新はこの1回きりなので、constを付けてるわけですが、、、、 あ、わかった。もしかして、 const は、const x = 123; とか const y = "abc"; のように右辺がリテラルの代入の時につけるもの限定で、 const z = 関数呼び出しのような計算式; みたいな使い方がおかしいと思っていたと言うことですか?
Ko_jiro

2023/05/04 03:53

関数の実行によって'yes'または別の値がagreeに代入されるのになぜconstなのかと疑問に思ってました。 でも皆さんのおかけで、定数を宣言しているから初期化されているという意味が理解できました。 ありがとうございました!
otn

2023/05/04 04:23

そうですね。物理学で言う物理定数の定数とは意味が異なります。数学の定数はもしかすると分野によって異なるかも知れませんが、中学高校数学の定数は、多くのプログラミング言語のconstとは異なります。 123とか"abc"のようなものはリテラルと言います。 言語によっては、定数定義の右辺に関数呼び出し結果どころか、 123*4+5 のような定数だけでコンパイル時に値が決まる式さえ書けなかったりしますので、そういった言語からプログラミングに入門すると違和感あるでしょうね。昔からある言語は式が書けない気がします。 最初の私のコメント含め、皆さん、再代入の絡みの話かと思って回答していますね。
guest

回答3

0

7行目で値は書き換えるのですが、ページが読み込まれたときに1回だけ処理するので値の再代入には当たらないということですかね?
例えばこのコードをwhileの中に書いていたらダメですよね?

いえ、Cookies.setは、最初に代入したagreeへは何の影響もしません。

投稿2023/05/02 05:29

maisumakun

総合スコア145184

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

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

0

ベストアンサー

const で宣言した変数 agree に、宣言(const で始まる文)のとき以外に agree = XXXX の形の代入がなければ const で宣言することが望ましいです。
constは、初期化以外に値を代入しようとするとエラーになります。
let にしても通常は動作に影響はありませんが、後で初期値以外の値を代入してもエラーになりませんので定数とする意味がなくなります。
agree.setxxxx(XXXX)やagree.push(XXXX)などであれば、agree への代入ではないのでエラーになりませんし let にする必要はありません。
letにしなければならないのは、let agree = XXXXとして初期化した後に agree = YYYY などと agree = の形で値を代入する場合です。

それから、繰り返し処理の場合ですが、

js

1for (...) { 2... 3} 4while (...) { 5... 6}

などの繰り返し処理の中で、

js

1for (let i = 0; i < values.length; i++) { 2 ... 3 const agree = i; 4 ... 5}

などとして繰り返すたびに i (値が毎回変わる変数)で初期化していてもその後に代入がなければ const で宣言できます。
繰り返し処理の「中で」宣言している変数の有効範囲は繰り返し処理の「中だけ」であり、
繰り返しの1回分限りの変数になります(変数の値は次の繰り返し時に引き継がれません)から
繰り返しの都度初期化している(繰り返す度に新たに変数が用意される)ので、
宣言の時の初期化は新たな代入にはなりません。

js

1while (...) { 2let agree = i; 3... 4i += 1; 5... 6agree = i; 7}

のように宣言時の初期化以外に代入するときは letにします。
また、
繰り返し処理が入れ子になっている時も、入れ子の内側で宣言した変数は、その内側限りの変数になります。
if文の{...}の中も同様です。

投稿2023/05/02 05:25

編集2023/05/02 05:38
YellowGreen

総合スコア731

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

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

Ko_jiro

2023/05/03 02:45

なるほど、繰り返しの中で宣言したら毎回初期化しているから再代入には当たらないんですね。 たしかにそれなら質問させていただいたagreeをなぜconstにしているのかも合点がいきます。 詳しいご回答ありがとうございます!
guest

0

1行目でconst agreeを宣言するのですが、この定数agreeにはcookie承認ボタンがクリックされたら'yes'を代入するので、定数より変数letで宣言するべきではないのでしょうか?

以下の部分はyesを代入しているわけではありません。
agreeyesかどうかを比較演算子を使って判定しているだけです。

js

1if(agree === 'yes') { 2 console.log('クッキーを確認しました'); 3}

よって、agreeには一度も値を再代入しておらず、
Cookie値という再代入を許すべき変数ではないので、constを使うのが妥当です。

投稿2023/05/02 03:53

編集2023/05/02 03:55
pippi19

総合スコア679

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問