请查看以下脚本。我正在使用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]}
items.has([5,6,7,8])
items.add([5,6,7,8])
添加的阵列?答案 0 :(得分:10)
为什么它在items.has([5,6,7,8])
处返回false?
来自MDN
Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。
使用引用而不是值来比较对象。集使用SameValueZero(x, y)
比较算法来比较值。如果x和y是相同的对象值,则表示返回true
。否则,请返回false
。
为什么允许重复值?我想"一个集合在一个有序的值列表中,不能包含重复项"
与#1相同。如果同一个对象(不仅仅是相同的)已经添加到集合中,那么非原始值就已经存在于集合中。
如何访问由items.add([5,6,7,8])
添加的数组?
您已创建变量并将变量添加到集合中。然后,此变量可用于检查set是否具有该数组。
答案 1 :(得分:2)
Set对象是ECMAScript语言值的集合。一个不同的值可能只作为Set集合的元素出现一次。 使用SameValueZero比较算法区分不同的值。
(强调我的)
SameValueZero
comparison algorithm处理相同类型的任何两个参数(其中该类型不是undefined
,true
,字符串,数字,布尔值或符号),如下所示: / p>
如果x和y是相同的Object值,则返回
false
。否则,请返回[]
。
最终,这意味着通过 reference 比较对象(即,有效地,“这两个对象是否指向内存中的相同位置?”)每次创建数组时使用括号(new Array()
)或构造函数调用(Array
),您可以在内存中创建{em>新实例arr === arr
。当你保持对数组的引用时,它将匹配(例如[1, 2, 3] !== [1, 2, 3]
)。当您创建新实例并进行比较时,即使内容的比较相等(例如{{1}}),它们也不匹配。
答案 2 :(得分:1)
[1] === [1]
将永远返回false。Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。
您传递新对象而不是引用,因此允许添加重复项。这实际上在视觉上相似但参考不同。