62210


`new Set`に入門するためMDNを読んでいるとentries、keys、valuesメソッドを解説を読みました

するとまったく同一のことがkeysとvaluesでできるらしいのですが、わざわざ同じものを用意しておくと便利なのはいつでしょうか？

またentriesも同じvalueが２つ入った配列を返すだけで、存在意義がわかりませんが具体的な使用例、これでしかできない、などはあるのでしょうか？

> # [Set - JavaScript |
> MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)
>
>   * `Set.prototype.keys()`  
>  `values()` 関数と同じです。挿入順に Set オブジェクト内の各要素に対する値を含む新しい `Iterator` オブジェクトを返します。
>
>   * `Set.prototype.values()`  
>  挿入順に `Set` オブジェクト内の各要素に対する `values` を含む新しい `Iterator` オブジェクトを返します。
>
>   * `Set.prototype.entries()`  
>  挿入順に `Set` オブジェクト内の各要素に対して `[value, value]` の配列を含む新しい `Iterator`
> オブジェクトを返します。これは `Map` オブジェクトに似させています。そのため、各エントリーは `key` と `value` が同じ値になります。
>
>


CC BY-SA 4.0
2020-01-12T06:24:48.337
62179
2020-01-13T11:25:23.120
2020-01-13T05:11:39.020
32986
37046
question
javascript
new Set の keys メソッドと value メソッドの違いはありますか


[Set.prototype.values() - JavaScript |
MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set/values)

> values() メソッドは、挿入順で Set オブジェクト内の各要素の値を含んだ、新しい Iterator オブジェクトを返します。
>
> keys() メソッドは（ Map オブジェクトとの類似性のため）このメソッドに対するエイリアスです。まったく同じように動作し、Set
> の各要素の値を返します。

とあります。

ここで、突然ですが下記の`show関数`を考えてみましょう。  
この`show関数`は引数に受け取ったオブジェクトの`keys()`メソッドからイテレーターを取得し、その中身を表示するものです。

[code]

    function show(o) {
        const iterator = o.keys()
    
        while (true) {
            let result = iterator.next();
            if (result.done) {
                break
            }
            console.log(result.value)
        }
    }
    
[/code]

`Set`に`keys()`メソッドが生えているおかげで、この`show関数`は`Mapオブジェクト`も`Setオブジェクト`も受け取ることができますね。

全体を示したサンプルコードは下記です。

[code]

    const s = new Set([1, 2, 3])
    const m = new Map([
      [1, 'one'],
      [2, 'two'],
      [3, 'three'],
    ])
    
    show(s)
    show(m)
    
    function show(o) {
        const iterator = o.keys()
    
        while (true) {
            let result = iterator.next();
            if (result.done) {
                break
            }
            console.log(result.value)
        }
    }
    
[/code]

このような`show関数`が実用的かどうかは別として、このようにダックタイピングできるように用意されていると考えられます。

`Mapのキー`も、`Set`も重複の無いものを保存するという点において類似性があります。  
このため両方に`keys()`メソッドが用意されていると、今回のshow関数のように同じように扱うことができて便利なときがあるかもしれません。

`entries()`メソッドも同様で、  
下記の`show2関数`のような使い方で、`Map`と`Set`を同じように扱えます。

[code]

    function show2(o) {
        const iterator = o.entries()
    
        while (true) {
            let result = iterator.next();
            if (result.done) {
                break
            }
            console.log(result.value[0])
        }
    }
    
[/code]


CC BY-SA 4.0
2020-01-13T10:42:40.323
62210
2020-01-13T11:25:23.120
2020-01-13T11:25:23.120
9008
9008
62179
answer