JavaScript
1 let obj = { id: 3 }; 2 obj.id = 4; //変更を加える
上記のコードですと、ESLintに「objは再代入されてないんだからconst使え!」と、
「prefer-const」にESLintのチェックに引っかかります。
JavaScriptのconstは他の言語とちょっと意味合いが違うのかもしれませんが、
上記のようなケースにおいて、JS使いの方はconst使いますか? 使った方が適切ですか?
補足
let scale = d3.scaleLinear(); console.log(scale.domain()); // ▶︎(2) [0, 1] scale.domain([0, 100]); //変更を加える console.log(scale.domain()); // ▶︎(2) [0, 100]
同じく、こういうのも「const使え!」とESLintに言われます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
const
は「変数の再代入を避ける」為に使います。
一方、質問者さんは「プロパティの再代入を避けられないこと」を考慮されていますが、これは別の問題です。
- 「変数の再代入を避ける」為に
const
を使う - 「プロパティの再代入を避ける」為に
Object.freeze()
を使う
個別のプロパティ再代入を制御する場合は Object.create()
, Object.defineProperty()
を使います。
Re: hayatomo さん
投稿2017/09/10 03:28
総合スコア18156
0
prefer-const
を ESLint に入れている場合は「再代入しない変数」に関しては極力 const
を使うように指摘されます。
ここから先は let
がいいか const
がいいかという議論ですが、 let
にした所で大差はない一方で、 prefer-const
を利用している一般的なプロダクトでは、 const
以外の変数にすることを極力避けます。
これは const
を使う方が 「この変数はこれから再代入されることはない」 という認識を持ってプログラムを書くことができるからで、逆に let
や var
を使ってる場合は 「再代入されることがある特殊な変数なんだ」 というマーカーとして扱うことができるからです。
JavaScript ではありませんが、 Java の名著である Effective Java には「可変性を最小限にするべし」
というメッセージがあります。
http://hjm333.hatenablog.com/entry/2015/09/15/000644
これに倣ってなるべく let
ではなく、 const
を書く事を推奨する文化が生まれています。
ただし、 JavaScript は const
にした所で、オブジェクトのプロパティフィールドには代入可能ですし、完璧な不変性を保つことはできません。そういう不変性を推奨する言語(Java, Scala, Haskell)からの書き方を多少なりとも輸入し、今時点では自分の観測範囲では let
で書くよりも const
で書く方が推奨されていると思います。
投稿2017/09/10 02:47
総合スコア390
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/10 05:09
退会済みユーザー
2017/09/10 05:45
0
まぁ、作ったオブジェクトを後からごちゃごちゃ弄るなって話だね。
ライブラリや組み込みメソッドがバリバリなJavaScriptでは現実的にはかなり難問なんだけどね…
JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ の本では、
オブジェクトにする場合は、毎回自分自身をnewし直して値を更新出来るように備えようというアプローチが書いてあったね。
単純なObjectでやりたいならこんな感じのアプローチ。
JavaScript
1const obj = {id: 3}; 2const obj2 = Object.assign({}, obj, {id: 4}) 3 4console.log(obj); 5// {id: 3} 6console.lo(obj2); 7// {id: 4}
後者の質問だけど、そのd3.scaleTime.rangeは破壊的なメソッドなのかな?
d3に関しては使った事無いからよく分からないけど、
サンプルを軽く眺めた限り、jQueryと同じパターン※で非破壊的な作りだと思うんだよね。
もし破壊的じゃないなら、range
メソッドいくら叩いてもオブジェクトの値は変更されない。
つまりconstの方が適切だよね、一回確認してみてくれる?
※jQueryのパターン
毎回thisを返しまくって、メソッドチェーンを実現している。
途中の結果を何時でも変数に入れてキャッシュ出来るように、各メソッドは毎回新しいインスタンスを作り直している。
投稿2017/09/10 03:36
編集2017/09/10 03:56総合スコア21158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/10 04:24
退会済みユーザー
2017/09/10 04:25 編集
退会済みユーザー
2017/09/10 04:30 編集
2017/09/10 05:56
退会済みユーザー
2017/09/10 06:33
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/10 03:36
退会済みユーザー
2017/09/10 03:37
退会済みユーザー
2017/09/10 05:42
2017/09/10 06:21
2017/09/10 08:26 編集