以下のスクリプトをご覧ください。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]}
- なぜ で false が返されるのでしょうか
items.has([5,6,7,8])
? - なぜ重複した値が許可されるのでしょうか? 「セットは重複する値を含まない順序付けられた値のリストである」と考えていました。
- 追加された配列にアクセスするにはどうすればいいですか
items.add([5,6,7,8])
?
ベストアンサー1
なぜ で false が返されるのでしょうか
items.has([5,6,7,8])
?から翻訳
Setオブジェクトは、一意の価値観プリミティブ値であろうとオブジェクト参照。
オブジェクトは値ではなく参照を使用して比較されます。セットは
SameValueZero(x, y)
値を比較する比較アルゴリズム。true
xとyが等しい場合、同じオブジェクト値それ以外の場合は、 を返しますfalse
。なぜ重複した値が許可されるのでしょうか? 「セットは重複する値を含まない順序付けられた値のリストである」と考えていました。
1と同じ。非プリミティブ値は、次の場合に既にセット内に存在するとみなされます。同じオブジェクト(見た目が同じだけではなく)がすでにセットに追加されています。
追加された配列にアクセスするにはどうすればいいですか
items.add([5,6,7,8])
?変数を作成し、その変数をセットに追加する必要があります。その後、この変数を使用して、セットにその配列があるかどうかを確認できます。