以下のコードでは、定数として宣言した配列を操作しています。
javascript
1const arr = [] 2arr.push(1)
「この場所以降では決して配列を変更しない」ということを示したいという思いでこのように記述しているのですが、やはりあまり好かれない書き方でしょうか?
もしバッドプラクティスとして一般的に認知されているのでしたら、こういった記述の仕方は控えようと思います。世間がどのように感じるかを知りたいです。回答よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答8件
0
べき論
回答で「べき論」と「可否論」が混在している気がします。
「この場所以降では決して配列を変更しない」ということを示したいという思いでこのように記述しているのですが、やはりあまり好かれない書き方でしょうか?
もしバッドプラクティスとして一般的に認知されているのでしたら、こういった記述の仕方は控えようと思います。世間がどのように感じるかを知りたいです。回答よろしくお願いします。
これはべき論ですが、そもそも、プログラミングに一般的にこうというルールはないので、気にしないで下さい。
コーディング規約の話なら、有名どころのコーディング規約を複数読んで比較検討すればよい話ですが、「一般的」という論調になると
- varは古いので使うべきでは有りません。let,constを使いましょう。
- アロー関数こそが現在の流行です。関数宣言は捨てましょう。
「一般的」にはこれらと同じにおいを感じます。
- varは関数スコープで宣言できるのでまだ使い道があります
- アロー関数だけを使ってイベントハンドラ関数でthis値がとれないと嘆いている人を見たことがあります
結局、古いのが問題なのではなく、古い機能が現在書いているコードにマッチするかが重要で、新しくても古くてもそれは同じです。
同じように「一般的だから使う」のではなくて「その機能が要件にマッチしているから使う」のだと思うのです。
const と Object.freeze()
const
は再代入を禁止する機能を持ちますが、プロパティの書き換えを禁止するわけではありません。
JavaScript
1const a = []; 2a.push(1); 3a = 1; // TypeError: Assignment to constant variable.
Object.freeze
はプロパティの書き換えを禁止しますが、再代入を禁止するわけではありません。
JavaScript
1let a2 = []; 2a2 = []; 3Object.freeze(a2); 4a2.push(1); // TypeError: Cannot add property 0, object is not extensible
両方を使えば、再代入もプロパティ書き換えも禁止されます。
JavaScript
1const a3 = Object.freeze([]); 2a3.push(1); // TypeError: Cannot add property 0, object is not extensible
これは一般的だから使うわけでは有りません。
「再代入禁止」と「プロパティ書き換え禁止」の要件がある時に使うのです。
各々の機能を把握すれば、使うべき場面は自ずと判断できると思います。
Re: toshiyan さん
投稿2020/10/03 04:42
総合スコア18189
0
もしバッドプラクティスとして一般的に認知されているのでしたら、こういった記述の仕方は控えようと思います。世間がどのように感じるかを知りたいです。回答よろしくお願いします。
そんなことはありません。
むしろ、arr
を再代入させたくないのであれば、むしろ、const
で宣言すべきでしょう。
ただし、JavaScriptでは、このような仕様(定数宣言したオブジェクトにも、プロパティの再代入は可能という仕様)ですが、
他の言語では、定数定義をしたオブジェクトには、push
のようなこともできない言語の方が多いように思うので、注意が必要です。
例えば、Swiftは、let
が定数宣言なのですが、
let
で宣言された配列変数には、要素を追加もできません。
(イミュータブルという)
対して、JavaScriptは、いかなる場合でも、
再宣言を除き、オブジェクトに関しては、常にミュータブルとなります。
(再宣言、再代入はできないが、プロパティなど、中身は再代入や追加、削除が可能)
投稿2020/10/02 17:08
総合スコア9555
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/03 12:50
0
constな配列
というのが、const arr = []
のことなら、const
なのは変数arr
であって、配列は別にconst
という概念は無いでしょう。
配列を変更しないのなら、Object.freeze()
でしょう。
そんなことより、;
を付けてないことの方が気になります。
投稿2020/10/02 15:14
総合スコア85901
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/02 16:59
2020/10/03 02:12
2020/10/03 13:06 編集
0
TypeScriptではconst
と別にreadonly
が存在します。
typescript
1const readOnlyArr: readonly number[] = [1]; 2 3// コンパイルエラー 4readOnlyArr.push(2); 5 6const constArr: number[] = [3]; 7 8// こちらは問題なし 9constArr.push(4);
投稿2020/10/02 22:29
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/02 22:51
2020/10/03 02:00
0
const
上記URLにもあるけど
// 配列も同じ const MY_ARRAY = []; // 配列にアイテムをプッシュすることができる MY_ARRAY.push('A'); // ["A"] // しかし、新しい配列を代入するのはエラーになる - Uncaught TypeError: Assignment to constant variable. MY_ARRAY = ['B'];
constの使い方は「この変数は定数です」(値が変化しない)と指し示す物だから。
初期値を設定する意味でのpushなら書き方的にOKだが
通常の変数の様に初期値から値を変更するのは書き方的にNG
もしpushがダメなら
const msec = 24 * 60 * 60 * 1000;
みたいな計算式自体NGになると思うんだけど
追記
例えば
「共通処理でinputの初期値を定数として持っておきたい
となった時、初期値なので定数constで指定となるが
配列の長さは画面によって可変し、また順番もあるので
[.push]での書き方のほうが指定しやすい。」
という事だと理解しています。
投稿2020/10/02 15:51
編集2020/10/03 03:25総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/02 23:47
2020/10/03 02:09
2020/10/03 03:04
0
個人的には、コードリードしているときに「const宣言された配列の要素は変更されない」とは思っていないです。なので、気になりません。
その他のオブジェクトも同様です。たとえば、DOMオブジェクトはユーザーの操作によってプロパティが変化しうると思いますが、これがconstで宣言されていても特段の違和感はありません。
投稿2020/10/03 04:45
総合スコア36960
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
あまり好かれない書き方でしょうか?
破壊的変更を加えることは一般的に、あまり好かれない書き方だと思います。
以下のように新しい変数(定数)に代入すると良いです。
const arr = [1, 2, 3] const newArr = arr.concat(4) console.log(arr) // [1, 2, 3] console.log(newArr) // [1, 2, 3, 4]
投稿2020/10/02 16:06
総合スコア108
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/03 02:07
2020/10/03 03:51 編集
0
constな配列を操作することは一般的に許されていないか
一般的にはしないと思います。
配列に限ればconst
で定義したからには、以降の処理で要素に変化が無い方がコードが読み易い。直観的です。
だからdeveloper.mozilla.orgのサンプルコードでもlet
を使っているんじゃないかと思います。
操作の対象をオブジェクトにまで話を広げた場合は、const定義以降は中身を変更しない
という基本的な考えは踏襲しつつも、constに対してappendするようなコードが信頼出来るドキュメント上で見つかればそれを真似ます。
投稿2020/10/03 04:19
総合スコア6426
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。