ES6 Set では重複した配列/オブジェクトが許可されます 質問する

ES6 Set では重複した配列/オブジェクトが許可されます 質問する

以下のスクリプトをご覧ください。Chrome でテストしています。

/*declare a new set*/
var items = new Set()

/*add an array by declaring as array type*/
var arr = [1,2,3,4];
items.add(arr);

/*print items*/
console.log(items); // Set {[1, 2, 3, 4]}

/*add an array directly as argument*/
items.add([5,6,7,8]);

/*print items*/
console.log(items); // Set {[1, 2, 3, 4], [5, 6, 7, 8]}

/*print type of items stored in Set*/
for (let item of items) console.log(typeof item); //object, object

/*check if item has array we declared as array type*/
console.log(items.has(arr)); // true

/*Now, check if item has array we added through arguments*/
console.log(items.has([5,6,7,8])); //false

/*Now, add same array again via argument*/
items.add([1,2,3,4]);

/*Set has duplicate items*/
console.log(items); // Set {[1, 2, 3, 4], [5, 6, 7, 8], [1, 2, 3, 4]}
  1. なぜ で false が返されるのでしょうかitems.has([5,6,7,8])?
  2. なぜ重複した値が許可されるのでしょうか? 「セットは重複する値を含まない順序付けられた値のリストである」と考えていました。
  3. 追加された配列にアクセスするにはどうすればいいですかitems.add([5,6,7,8])?

ベストアンサー1

  1. なぜ で false が返されるのでしょうかitems.has([5,6,7,8])?

    から翻訳

    Setオブジェクトは、一意の価値観プリミティブ値であろうとオブジェクト参照

    オブジェクトは値ではなく参照を使用して比較されます。セットはSameValueZero(x, y)値を比較する比較アルゴリズム。truexとyが等しい場合、同じオブジェクト値それ以外の場合は、 を返しますfalse

  2. なぜ重複した値が許可されるのでしょうか? 「セットは重複する値を含まない順序付けられた値のリストである」と考えていました。

    1と同じ。非プリミティブ値は、次の場合に既にセット内に存在するとみなされます。同じオブジェクト見た目が同じだけではなく)がすでにセットに追加されています。

  3. 追加された配列にアクセスするにはどうすればいいですかitems.add([5,6,7,8])?

    変数を作成し、その変数をセットに追加する必要があります。その後、この変数を使用して、セットにその配列があるかどうかを確認できます。

おすすめ記事