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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

意見交換

7回答

649閲覧

JavaScriptの分割代入を必須化することのメリット

daiki002

総合スコア68

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

2クリップ

投稿2024/11/29 02:48

編集2024/11/29 02:52

テーマ、知りたいこと

JavaScriptの分割代入を必須化することのメリットは何ですか?

分割代入は、以下のように変数を個別定義するよりかは行数が減るというメリットを享受するために分割代入を利用して書くことができます。

javascript

1// これが 2const obj = { a: 1, b: 2 } 3const a = obj.a 4const b = obj.b 5 6// こうなる。1行省略できた。 7const obj = { a: 1, b: 2 } 8const { a, b } = obj

しかし、上記のように個別変数を定義することは正直なところメリットではない気がしています。
「objのaというプロパティ」の意味合いが消えてしまう事がよくないと思っています。

コーディング規約で「分割代入を必ずする」と必須化してしまうのは良くないと思います。
場合によって使い分ける程度で良いと思います。

そもそも、上記のような使い方で個別の変数に別けるメリットがわかりません。
変数にあえて別けたいときは以下のように何らかの計算した結果を代入する時ではないでしょうか?

const a = obj.a * 2 const b = obj.b * 2

または、あまりにもネストが深くて書くのが面倒になったときなどに使うのも可読性を上げるためにありだと思います。

// posiitonを取り出すために毎回a ~ g まで書かないといけないのが面倒 const x = obj.a.b.c.d.e.f.g.position.x const y = obj.a.b.c.d.e.f.g.position.y // この書き方はありだと思う const { x: userPositionX, y: userPositionY } = obj.a.b.c.d.e.f.g.position

また、以下のように obj を合体させる時に使うのは分割代入を使うときの良い例だと思っています。
1つ1つ書くのは面倒ですから。

javascript

1const obj1 = { a: 1, b: 2 } 2const obj2 = { c: 3, d: 4 } 3const obj3 = { ...obj1, ...obj2 }

みなさんはJavaScriptの分割代入を必須化させる事についてどう思いますか?
ほとんどすべてのコードを分割代入で書かれたコードがあり、私はメリットが理解できない状態です。

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

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

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

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

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

回答7

#1

yambejp

総合スコア116810

投稿2024/11/29 03:02

編集2024/11/29 03:10

必須化というか使いやすいからつかうというだけですよね?
たとえばこういう使い方

javascript

1const obj = { a: 100, b: 200 } 2const func=({a})=>console.log(a); 3func(obj); // 100

たとえば以前は標準だったwithの置き換えだと思えばよいのでは?
(with構文は現在では非推奨)

javascript

1const obj = { a: 100, b: 200 } 2const func=(arg)=>{ 3 with(arg){ 4 console.log(a); 5 } 6} 7func(obj); /100

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

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

#2

poto568

総合スコア311

投稿2024/11/29 03:05

場合によって使い分ける程度で良いと思います。

ここで結論は出ていて

ほとんどすべてのコードを分割代入で書いている人がいて困っています。

修正前に書いてあるこの文章が本質(本音)だと思うのですが、
技術の問題にすり替えて叩き棒が欲しいと言っているように見えます。
こんなところで味方を作ろうとしても意味が無いので、質問者さんが
所属する集団で話し合って解決するべき問題ではないでしょうか。

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

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

#3

daiki002

総合スコア68

投稿2024/11/29 03:26

poto568さん、私は分割代入についてのみなさんの意見を伺っています。
poto568さんの勝手な解釈によってひねくれた内容にすりかえられるのは単純に不快でしかないのでこれ以上コメントしないで下さい。不快です。

私より技術レベルが高い人がそのようなコードを書いていて何か意図があると思っていますが、彼は忙しく組織も異なるのでなかなか直接聞く機会がないのです。
分割代入のメリットが理解できれば私も使うのですが、私では理解できないので何のメリットがあって書いているのかわからず困っていて意見を伺っています。

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

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

#4

Lhankor_Mhy

総合スコア36963

投稿2024/11/29 04:34

そもそも、上記のような使い方で個別の変数に別けるメリットがわかりません。

yambejp さんが書かれた通り、必要あるプロパティaを明示的に取り出しているのは、ブロック内でobj.bの値を参照しないことがわかるため、コードを読むときに楽だと感じました。
また、constを使用しているため、再代入されないことが明示的であることも、コードを読むときに楽だと感じました。

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

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

#5

juner

総合スコア560

投稿2024/11/29 06:51

編集2024/11/29 07:47

基本的に関数の引数 等 プロパティを纏めて取得の際に使っていますね。
(主に その function scope に於ける 変数化して プロパティアクセスを無くす表現の為

js

1target.addEventListener('click', ({target}) => { 2 // target を元に何かする 3});

js

1addLog(`${Object 2 .entries(obj) 3 .map(([name, value]) => `${name}=${value}`) 4 .join(' ') 5}`);

あと、複雑な位置の値をとってくるときもだいたい 分割代入していますね。

js

1const { event: { start: start_, end: end_, _instance: { range: { start: rangeStart, end: rangeEnd } = {} } = {} } = {}, revert } = arg; 2const start = timeFormat(start_ ?? rangeStart); 3const end = timeFormat(end_ ?? rangeEnd); 4console.log(`start=${start} end=${end}`);

そのオブジェクトから そのプロパティ以外を使っていないことを示す為にあると 明確化されてよいと思っています。
必須化するべきというのはなんともですが。

※ただし、メソッド等の作りによって this が影響する場合は使えないので注意が必要

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

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

#6

otn

総合スコア85933

投稿2024/11/30 15:54

JavaScriptの分割代入を必須化する

という言明の意味が分かりません。
「分かりません」を別の言い方で言うと、そのルールで「禁止される」のは何ですか?

分割代入にメリットがあるケースがあるのは、皆さんも書いているし、あなたも質問に書いている。
「~~~を禁止するのは妥当なのか?」という風に書いてもらわないと、「この場合に分割代入メリットあり」という回答ばかりになりそうです。それは求めるものではないはず。

(1) プロパティーの参照を式の中に直接書くのは禁止(お書きのconst a = obj.a * 2のようなのは駄目)。
必ず変数に代入して、その変数名で参照すべき。代入の際には必ず分割代入で。

(2) 上記までは言ってないが、もし、プロパティーの値を、単独の変数に代入するのであれば、その際には必ず分割代入で。変数に代入せずそのままで使うのはOK。プロパティーの値を変数に代入するのに単純な代入は禁止(const a = obj.aのようなのは駄目)。

(3) その他

(1)(2)だと、「その禁止は妥当でない」ですかね。

ほとんどすべてのコードを分割代入で書かれたコードがあり、私はメリットが理解できない状態です。

もし、組織にそういうルールが今あるという事じゃなくて、「そんなルールはないのにそういうコードがあるのは何故か?」ということなら、そのコードを書いた人に聞くしか無いですね。赤の他人が「その禁止は妥当でない」と言っても、その人とは何の関係も無いので。
個人的なこだわりを持ってコードを書く人は少なからずいると思います。おそらく多数派ではないと思いますが。

あるいは、このサイトで聞くのなら「~~~を禁止することに賛成する方がいらっしゃれば、その賛成理由を教えてください。私は賛成できないので知りたい」という質問をするとか。

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

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

#7

utm.

総合スコア332

投稿2024/11/30 21:12

こういう趣旨なのか分かりませんが、
ある処理をするスコープ内で、依存関係のあるオブジェクトのメンバ変数を1度変数に入れる派と入れない派があるんですね。
質問者さんは入れない派ということなんですね。
私はどちらかと言うと変数に入れる派です。
この値はただ参照に使うだけという意味合いを強めたいので。

それをするのに便利だから分割代入を使用していると言うだけの話なのでは?

オブジェクトという概念のあるプログラミング言語は好きなところで好きなように値を変更できるので、ある意味でスパゲッティ的なコードを書くことが出来るし、実際にそのように書かれているクソコードもあるので、そういうのをコードを読む中で配慮しているかどうかという指標にもなると思います。

まあそもそも、オブジェクト指向ってqueryとcommandだけメソッド公開して、他はプライベートでいいしCommandについても関数型の意味合いで言えばthisじゃなくて、newした同じオブジェクトをコンストラクタでプロパティ変更した形で返せばいいと言うのがマイブームです。

まあ、そんな書き方してるコード見たことないというか、そもそも
Command queryパターンなんて使用されてる例見たことないですけどね。

構造的な意味でカプセル化できるなら、メソッドより構造体とそれを引数として取る関数でプログラミングできるのならそれが一番見やすい気もするんですけどね。

Rustのインタフェースが自分の考えに近くはあります。
Pythonでインスタンスを引数に取らないと行けない構文も個人的には興味深い。

趣旨が違ってたら申し訳ないです。

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問