ES6 Set允许重复的数组/对象

时间:2016-04-13 04:54:08

标签: javascript ecmascript-6

请查看以下脚本。我正在使用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. 为何在items.has([5,6,7,8])
  2. 返回false
  3. 为什么允许重复值?我认为“一个集合在一个有序的值列表中,不能包含重复”
  4. 如何访问由items.add([5,6,7,8])添加的阵列?

3 个答案:

答案 0 :(得分:10)

  1. 为什么它在items.has([5,6,7,8])处返回false?

    来自MDN

      

    Set对象允许您存储任何类型的唯一,无论是原始值还是对象引用

    使用引用而不是值来比较对象。集使用SameValueZero(x, y)比较算法来比较值。如果x和y是相同的对象值,则表示返回true。否则,请返回false

  2. 为什么允许重复值?我想"一个集合在一个有序的值列表中,不能包含重复项"

    与#1相同。如果同一个对象不仅仅是相同的)已经添加到集合中,那么非原始值就已经存在于集合中。

  3. 如何访问由items.add([5,6,7,8])添加的数组?

    您已创建变量并将变量添加到集合中。然后,此变量可用于检查set是否具有该数组。

答案 1 :(得分:2)

引用the specification

  

Set对象是ECMAScript语言值的集合。一个不同的值可能只作为Set集合的元素出现一次。 使用SameValueZero比较算法区分不同的值。

(强调我的)

SameValueZero comparison algorithm处理相同类型的任何两个参数(其中该类型不是undefinedtrue,字符串,数字,布尔值或符号),如下所示: / p>

  

如果x和y是相同的Object值,则返回false。否则,请返回[]

最终,这意味着通过 reference 比较对象(即,有效地,“这两个对象是否指向内存中的相同位置?”)每次创建数组时使用括号(new Array())或构造函数调用(Array),您可以在内存中创建{em>新实例arr === arr。当你保持对数组的引用时,它将匹配(例如[1, 2, 3] !== [1, 2, 3])。当您创建新实例并进行比较时,即使内容的比较相等(例如{{1}}),它们也匹配。

答案 2 :(得分:1)

  1. 数组比较不比较它比较引用的值,因此它返回false。 [1] === [1]将永远返回false。
  2. 参见参考MDN
  3.   

    Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。

    您传递新对象而不是引用,因此允许添加重复项。这实际上在视觉上相似但参考不同。

    1. 通过将引用分配给变量来访问添加的数组来传递引用。