Javascript ES6设置允许重复阵列/对象
请看下面的脚本。我正在用Chrome测试它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
/*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])
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
进行访问。这是为了使添加元素的过程在需要迭代时变得灵活。在这种情况下,它将只是一个对象数组,可以像传统数组一样迭代。但这很公平!