Javascript ES6设置允许重复阵列/对象

Javascript ES6设置允许重复阵列/对象,javascript,ecmascript-6,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*/ item

请看下面的脚本。我正在用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。has([5,6,7,8])
  • 为什么它允许重复值?我认为“一个集合在一个有序的值列表中,不能包含重复项”
  • 如何访问由
    项添加的数组。添加([5,6,7,8])
  • 数组比较不比较它比较引用的值,因此返回false<代码>[1]==[1]将始终返回false
  • 参见参考文献
  • 使用Set对象可以存储任何类型的唯一值,无论是基元值还是对象引用

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

  • 通过将引用分配给变量来传递引用,以访问添加的数组
  • 引述:

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

    (强调矿山)

    处理相同类型的任意两个参数(其中该类型不是
    null
    未定义的
    ,字符串、数字、布尔值或符号),如下所示:

    如果x和y是相同的对象值,则返回
    true
    。否则,返回
    false

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

  • 为什么它在
    项处返回false。has([5,6,7,8])

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

    使用参照而不是值来比较对象。集合使用比较算法来比较值。如果x和y是相同的对象值,则返回
    true
    。否则,返回
    false

  • 为什么它允许重复值?我认为“一个集合在一个有序的值列表中,不能包含重复项”

    与#1相同。如果集合中已经添加了相同的对象(不仅仅是外观相同),则称集合中已经存在非原语值

  • 如何访问由
    项添加的数组。添加([5,6,7,8])

    您必须创建一个变量并将该变量添加到集合中。然后,可以使用此变量检查集合是否具有该数组


  • [5,6,7,8]!==[5,6,7,8]
    此代码还返回false,每个数组都是一个单独的对象。“我以为集合在一个有序的值列表中”列表按定义排序。集合通常不是。“你不能在Javascript中直接比较数组”——这是非常误导的<代码>[1]==[2]
    ——这里我只是“直接”比较了两个数组。我明白了你所说的通过引用进行比较的意思,但在这种情况下,添加到集合中的项是无用的,因为我们没有引用。为什么它允许添加这样的项目而不是忽略它?我的意思是,我不能让它在集合中包含存在但永远无法访问的项,因为我们没有可比较的引用。因为您可以稍后获取引用-e。g`var nowIhaveReference=Array.from(items)[2]``但这不是我们也可以用对象数组来做的吗?谢谢,我想传达的是,if Set允许添加项,即使它们没有引用集,也可能永远无法访问。为什么会有这样一个条款,将这些项目添加到集合中,而集合中可能永远不会被访问,而在这种情况下,我们没有引用。我并没有偏离原来的问题,只是想知道,也许任何人都有理由证明集合中没有引用的项是正确的。@jeetaz因为,您可以在集合中添加任何内容,然后使用
    for..of
    进行访问。这是为了使添加元素的过程在需要迭代时变得灵活。在这种情况下,它将只是一个对象数组,可以像传统数组一样迭代。但这很公平!