1. const mySet = (() => {
    2. /**
    3. * 设置私有属性
    4. */
    5. const getObj = Symbol('getObj')
    6. const data = Symbol('data')
    7. const isEqual = Symbol('isEqual')
    8. /**
    9. * 将其手写的 Set返回出去
    10. */
    11. return class mySet {
    12. /**
    13. * 使用Myset需要传递进去一个可迭代对象
    14. * @param {*} iterable
    15. */
    16. constructor(iterable = []) {
    17. if (typeof iterable[Symbol.iterator] !== 'function') {
    18. throw new TypeError('arguments is not an iterator')
    19. }
    20. this[data] = []
    21. for (const item of iterable) {
    22. this.add(item)
    23. }
    24. }
    25. /**
    26. * 添加
    27. * @param {*} key
    28. */
    29. add(key) {
    30. if (!this[getObj](key)) {
    31. this[data].push(key)
    32. }
    33. }
    34. /**
    35. * 检查是否存在对应的数据
    36. * @param {*} key
    37. * 返回值为 true false
    38. */
    39. has(key) {
    40. return this[getObj](key);
    41. }
    42. /**
    43. * 检索数据
    44. * @param {*} key
    45. * 返回值为 true false
    46. */
    47. [getObj](key) {
    48. for (const item of this[data]) {
    49. if (this[isEqual](item, key)) {
    50. return true;
    51. }
    52. }
    53. return false
    54. }
    55. /**
    56. * 删除对应的数据
    57. * @param {*} key
    58. * 返回值为 true false
    59. */
    60. delete(key) {
    61. for (let i = 0; i < this[data].length; i++) {
    62. const item = this[data][i];
    63. if (this[isEqual](key, item)) {
    64. this[data].splice(i, 1)
    65. return true;
    66. }
    67. }
    68. return false;
    69. }
    70. /**
    71. * 清空数据
    72. */
    73. clear() {
    74. this[data].length = 0;
    75. }
    76. /**
    77. * 获取的数据的数量与arr.length 一个意思
    78. */
    79. get size() {
    80. return this[data].length;
    81. }
    82. /**
    83. * 遍历数据
    84. * @param {*} callback
    85. * 与数组的forEach不同,数组中的forEcast的第一个参数为索引值,此处无索引值,用其数据代替
    86. */
    87. forEach(callback) {
    88. for (const iterator of this[data]) {
    89. callback(iterator, iterator, this)
    90. }
    91. }
    92. /**
    93. * 检查是否拥有数据是否相同
    94. * @param {*} data1
    95. * @param {*} data2
    96. * 返回值为 true false
    97. */
    98. [isEqual](data1, data2) {
    99. if (data1 === 0 && data2 === 0) {
    100. return true;
    101. }
    102. return Object.is(data1, data2);
    103. }
    104. /**
    105. * 生成器
    106. * 使其成为可迭代对象
    107. */
    108. *[Symbol.iterator]() {
    109. for (const iterator of this[data]) {
    110. yield iterator;
    111. }
    112. }
    113. }
    114. })()