65440


配列を90度回転させる関数内で使用されいてるmap関数の引数の中に  
アンダーバーのみの引数があるのですが、どういう意味なのでしょうか？  
単純に引数として書く必要があるため、記述はされたが特に使われていないように見えます。  
アンダーバーから始まる変数は慣例的にプライベート変数となっているため、それの関係なのでしょうか？

[code]

    const rotate = a => a[0].map((_, c) => a.map(r => r[c])).reverse();
    
[/code]


CC BY-SA 4.0
2020-04-07T05:01:39.583
65430
2020-04-07T10:21:10.193
21256
question
javascript
アンダーバーのみの変数の意味


アンダーバーのみの変数の意味はお見込みの通り「単純に引数として書く必要があるため、記述はされたが特に使われていない」から **気にしないでOK**
という意味です。

[map関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)は配列の要素を取得する関数ですが、2つ目の引数を省略しない場合は配列のインデックスを取得できます。

[code]

    const array1 = [1, 4, 9, 16];
    const map1 = array1.map((_, i) => i * 2);
    // Array [0, 2, 4, 6]
    console.log(map1);
    
[/code]

1つ目の引数を省略することはできないので、質問文では仕方なく無意味な変数`_`を宣言しているものの`c`しか使っていません。  
例えば使わない引数に`unused_local_variable`とでも変数名を付ければ分かりやすいかもしれませんが、明らかに冗長です。  
それよりも上記コード2行目のように記述する方が、慎ましやかで目立たない変数になるとは思いませんか。

いつからそのような合意がとられたのかは存じ上げませんが、無意味な変数を`_`1文字にすることはjavascriptに限らずプログラミングの通例としてしばしば目にします。  
[本家SOの類似質問](https://stackoverflow.com/q/11406823)

特にGo言語を使用しているとアンダースコア1文字のみの変数名が頻出します。  
Go言語は非常に厳格な言語なので使用しない変数を定義するとコンパイルエラーになります。

まさにmap関数のindexだけを使いたい場合や、関数から返ってくるエラー情報を使わない時に無理やり変数を使わないと実行できません。  
それを回避する方法として、変数名を`_`とすることで「この戻り値は使いません」と明示すればコンパイル可能になります。

これはGo言語では[`blank
identifier`](https://golang.org/doc/effective_go.html#blank)「日本語訳すると[空白の識別子](https://riptutorial.com/ja/go/example/29103/%E7%A9%BA%E7%99%BD%E3%81%AE%E8%AD%98%E5%88%A5%E5%AD%90)など」と定義されています。

蛇足ですが、`_`のみの変数を他で使わないことは暗黙のルールにすぎません。  
そのため下記コードの2行目のように使用すること自体は可能です。  
(もちろん紛らわしいので`_`変数は使用しない方が望ましいです)

[code]

    const array2 = [1, 4, 9, 16];
    const map2 = array2.map((_, i) => _ * 2);  // _ は使用できる
    // Array [2, 8, 18, 32]
    console.log(map2);
    
[/code]


CC BY-SA 4.0
2020-04-07T10:21:10.193
65440
2020-04-07T10:21:10.193
9820
65430
answer