--- title: مجموعه | Set slug: Web/JavaScript/Reference/Global_Objects/Set tags: - جاوااسکریپت - مجموعه translation_of: Web/JavaScript/Reference/Global_Objects/Set ---
new Set([iterable]);
هر شیء Set مجموعهای از مقادیر است. این مقادیر به ترتیبی که به مجموعه اضافه شدند شمارش میشوند. یک مقدار در مجموعه فقط میتواند یک بار بیاید (مهمترین تفاوت مجموعه و آرایه در همین است که در مجموعه مقدار تکراری نداریم ولی در آرایه میتوانیم داشته باشیم).
از آن جایی که در هر مجموعه باید مقادیر منحصر به فرد داشته باشیم، به صورت خودکار هنگام اضافه شدن عضو جدید به مجموعه برابری مقدارها بررسی میشود. در نسخههای قبلی ECMAScript، الگوریتمی که این بررسی استفاده میکرد با الگوریتم عملگر === فرق داشت. مخصوصا برای مجموعهها عدد صفر مثبت +0 با صفر منفی -0 متفاوت در نظر گرفته میشدند. با این حال در مشخّصاتی که برای ECMAScript 2015 در نظر گرفته شد این مورد تغییر کرد. برای اطّلاعات بیشتر جدول پشتیبانی مرورگرها از برابری صفر مثبت و منفی را ببینید.
ضمناً NaN و undefined نیز میتوانند در یک مجموعه ذخیره شوند. در این مورد NaN با NaN برابر در نظر گرفته میشود (در حالی که به صورت عادی NaN !== NaN است).
Set.length
Set
instancesتمام نمونههای کلاس Set از {{jsxref("Set.prototype")}} ارثبری میکنند.
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Set/prototype','Properties')}}
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Set/prototype','Methods')}}
var mySet = new Set(); mySet.add(1); mySet.add(5); mySet.add("some text"); var o = {a: 1, b: 2}; mySet.add(o); mySet.add({a: 1, b: 2}); // o is referencing a different object so this is okay mySet.has(1); // true mySet.has(3); // false, 3 has not been added to the set mySet.has(5); // true mySet.has(Math.sqrt(25)); // true mySet.has("Some Text".toLowerCase()); // true mySet.has(o); // true mySet.size; // 4 mySet.delete(5); // removes 5 from the set mySet.has(5); // false, 5 has been removed mySet.size; // 3, we just removed one value
// iterate over items in set // logs the items in the order: 1, "some text", {"a": 1, "b": 2} for (let item of mySet) console.log(item); // logs the items in the order: 1, "some text", {"a": 1, "b": 2} for (let item of mySet.keys()) console.log(item); // logs the items in the order: 1, "some text", {"a": 1, "b": 2} for (let item of mySet.values()) console.log(item); // logs the items in the order: 1, "some text", {"a": 1, "b": 2} //(key and value are the same here) for (let [key, value] of mySet.entries()) console.log(key); // convert Set object to an Array object, with Array.from var myArr = Array.from(mySet); // [1, "some text", {"a": 1, "b": 2}] // the following will also work if run in an HTML document mySet.add(document.body); mySet.has(document.querySelector("body")); // true // converting between Set and Array mySet2 = new Set([1,2,3,4]); mySet2.size; // 4 [...mySet2]; // [1,2,3,4] // intersect can be simulated via var intersection = new Set([...set1].filter(x => set2.has(x))); // difference can be simulated via var difference = new Set([...set1].filter(x => !set2.has(x))); // Iterate set entries with forEach mySet.forEach(function(value) { console.log(value); }); // 1 // 2 // 3 // 4
Set.prototype.isSuperset = function(subset) { for (var elem of subset) { if (!this.has(elem)) { return false; } } return true; } Set.prototype.union = function(setB) { var union = new Set(this); for (var elem of setB) { union.add(elem); } return union; } Set.prototype.intersection = function(setB) { var intersection = new Set(); for (var elem of setB) { if (this.has(elem)) { intersection.add(elem); } } return intersection; } Set.prototype.difference = function(setB) { var difference = new Set(this); for (var elem of setB) { difference.delete(elem); } return difference; } //Examples var setA = new Set([1,2,3,4]), setB = new Set([2,3]), setC = new Set([3,4,5,6]); setA.isSuperset(setB); // => true setA.union(setC); // => Set [1, 2, 3, 4, 5, 6] setA.intersection(setC); // => Set [3, 4] setA.difference(setC); // => Set [1, 2]
var myArray = ["value1", "value2", "value3"]; // Use the regular Set constructor to transform an Array into a Set var mySet = new Set(myArray); mySet.has("value1"); // returns true // Use the spread operator to transform a set into an Array. console.log([...mySet]); // Will show you exactly the same Array as myArray
Specification | Status | Comment |
---|---|---|
{{SpecName('ES6', '#sec-set-objects', 'Set')}} | {{Spec2('ES6')}} | Initial definition. |
{{SpecName('ESDraft', '#sec-set-objects', 'Set')}} | {{Spec2('ESDraft')}} |
{{CompatibilityTable}}
ویژگی | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
پشتیبانی ساده |
{{ CompatChrome(38) }} [1] |
12 | {{ CompatGeckoDesktop("13") }} | {{ CompatIE("11") }} | 25 | 7.1 |
Constructor argument: new Set(iterable) |
{{ CompatChrome(38) }} | 12 | {{ CompatGeckoDesktop("13") }} | {{CompatNo}} | 25 | 9.0 |
iterable | {{ CompatChrome(38) }} | 12 | {{ CompatGeckoDesktop("17") }} | {{CompatNo}} | 25 | 7.1 |
Set.clear() |
{{ CompatChrome(38) }} | 12 | {{CompatGeckoDesktop("19")}} | {{ CompatIE("11") }} | 25 | 7.1 |
Set.keys(), Set.values(), Set.entries() |
{{ CompatChrome(38) }} | 12 | {{CompatGeckoDesktop("24")}} | {{CompatNo}} | 25 | 7.1 |
Set.forEach() |
{{ CompatChrome(38) }} | 12 | {{CompatGeckoDesktop("25")}} | {{ CompatIE("11") }} | 25 | 7.1 |
Value equality for -0 and 0 | {{ CompatChrome(38) }} | 12 | {{CompatGeckoDesktop("29")}} | {{CompatNo}} | 25 | {{CompatSafari(9)}} |
Constructor argument: new Set(null) |
{{CompatVersionUnknown}} | 12 | {{CompatGeckoDesktop("37")}} | {{CompatIE(11)}} | {{CompatVersionUnknown}} | {{CompatSafari(7.1)}} |
Monkey-patched add() in Constructor |
{{CompatVersionUnknown}} | 12 | {{CompatGeckoDesktop("37")}} | {{CompatNo}} | {{CompatVersionUnknown}} | {{CompatSafari(9)}} |
Set[@@species] |
{{ CompatChrome(51) }} | 13 | {{CompatGeckoDesktop("41")}} | {{CompatNo}} | {{ CompatOpera(38) }} | {{CompatSafari(10)}} |
Set() without new throws |
{{CompatVersionUnknown}} | 12 | {{CompatGeckoDesktop("42")}} | {{CompatIE(11)}} | {{CompatVersionUnknown}} | 9 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | {{CompatNo}} | {{CompatChrome(38)}} [1] | {{ CompatGeckoMobile("13") }} | {{CompatNo}} | {{CompatNo}} | 8 |
Constructor argument: new Set(iterable) |
{{CompatNo}} | {{CompatChrome(38)}} | {{ CompatGeckoMobile("13") }} | {{CompatNo}} | {{CompatNo}} | 9 |
iterable | {{CompatNo}} | {{CompatNo}} | {{ CompatGeckoMobile("17") }} | {{CompatNo}} | {{CompatNo}} | 8 |
Set.clear() |
{{CompatNo}} | {{ CompatChrome(38) }} | {{CompatGeckoMobile("19")}} | {{CompatNo}} | {{CompatNo}} | 8 |
Set.keys(), Set.values(), Set.entries() |
{{CompatNo}} | {{ CompatChrome(38) }} | {{CompatGeckoMobile("24")}} | {{CompatNo}} | {{CompatNo}} | 8 |
Set.forEach() |
{{CompatNo}} | {{ CompatChrome(38) }} | {{CompatGeckoMobile("25")}} | {{CompatNo}} | {{CompatNo}} | 8 |
Value equality for -0 and 0 | {{CompatNo}} | {{ CompatChrome(38) }} | {{CompatGeckoMobile("29")}} | {{CompatNo}} | {{CompatNo}} | 9 |
Constructor argument: new Set(null) |
{{CompatUnknown}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("37")}} | {{CompatUnknown}} | {{CompatUnknown}} | 8 |
Monkey-patched add() in Constructor |
{{CompatUnknown}} | {{CompatVersionUnknown}} | {{CompatGeckoMobile("37")}} | {{CompatUnknown}} | {{CompatUnknown}} | 9 |
Set[@@species] |
{{CompatUnknown}} | {{CompatUnknown}} | {{CompatGeckoMobile("41")}} | {{CompatUnknown}} | {{CompatUnknown}} | 10 |
Set() without new throws |
{{CompatUnknown}} | {{CompatUnknown}} | {{CompatGeckoMobile("42")}} | {{CompatUnknown}} | {{CompatUnknown}} | 9 |
[1] The feature was available behind a preference from Chrome 31. In chrome://flags
, activate the entry “Enable Experimental JavaScript”.