ECMAScript6中Set/WeakSet详解

 更新时间:2015年06月12日 10:39:38   投稿:hebedich  
这篇文章主要介绍了ECMAScript6中Set/WeakSet详解的相关资料,需要的朋友可以参考下

ES6里加入了一个新数据解构Set,和Java的Set一样,它里面不存放重复的元素。Set实现为一个类,使用时需要先new。

var s1 = new Set()
s1.add(1)
s1.add(2)
s1.add(3)
s1.add(1)
 
var s2 = new Set()
s2.add('a')
s2.add('a')
 
// 输出1,2, 3
for (var i of s1 ) {
  console.log(i)
}
// 输出a
for (var i of s2 ) {
  console.log(i)
}

上面用Set的add方法添加元素,重复添加的,不会存进去。

Set构造器还可以接受数组作为参数传入

var s3 = new Set([1,2,3,1])
s3.size // 3

可以看到重复的数字1依然没有放进去,另外取Set的长度使用size,不是length。

需要注意的是对于{}或[],它们是两个同的对象

var s4 = new Set()
s4.add({})
s4.add({})
s4.size // 2

一、遍历Set (for of)

var s1 = new Set()
s1.add(1)
s1.add(2)
s1.add(3)
 
// 输出1,2, 3
for (var i of s1) {
  console.log(i)
}

二、把Set转成数组

var s1 = new Set()
s1.add(1)
s1.add(2)
 
// toArray
var a1 = Array.from(s1)
Array.isArray(a1) // true
 
// or
var a1 = [...new Set(s1)] 

三、利用Set给数组去重

function distinct(arr) {
  return Array.from(new Set(arr))
// return [...new Set(arr)]
}

Set的属性

constructor
size
Set的方法

has(val) 判断是否存在该元素
add(val) 添加元素
delete(val) 删除元素
clear 删除所有元素
keys
values
entries
forEach 遍历元素
map
filter

四、WeakSet

WeakSet和Set一样都不存储重复的元素,但有一些不同点

1. 只存储对象类型元素

ws = new WeakSet()
ws.add(1)

FF下报错如下

2. 只有add/delete/clear/has三个方法,不能遍历,没有size属性等

ws = new WeakSet()
ws.size // undefined
ws.forEach // undefined

MDN的解释

WeakSet 对象中存储的对象值都是被弱引用的, 如果没有其他的变量或属性引用这个对象值, 则这个对象值会被当成垃圾回收掉. 正因为这样, WeakSet 对象是无法被枚举的, 没有办法拿到它包含的所有元素

WeakSet主要用来储存DOM节点,当这些节点从文档移除时,不会引发内存泄漏。

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • javascript简单性能问题及学习笔记

    javascript简单性能问题及学习笔记

    最近在看一本书:《高性能javaScript》,发现自己平时写js存在很多小细节上的问题,虽然这些问题不会导致程序运行出错,但是会导致界面加载变慢,用户体验变差,那么我们就来细细数一下应该注意的地方吧
    2014-02-02
  • 一文概述ES7~12的语法及其相关使用规则

    一文概述ES7~12的语法及其相关使用规则

    随着JavaScript这门语言越来越流行,使得JavaScript这门语言越来越完善,这篇文章主要介绍了一文概述ES7~12的语法及其相关使用规则,需要的朋友可以参考下
    2023-01-01
  • 使用JS组件实现带ToolTip验证框的实例代码

    使用JS组件实现带ToolTip验证框的实例代码

    这篇文章主要介绍了使用JS组件实现带ToolTip验证框的实例代码,需要的朋友可以参考下
    2017-08-08
  • Bootstrap导航简单实现代码

    Bootstrap导航简单实现代码

    这篇文章主要介绍了Bootstrap导航的简单实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 用js替换除数字与逗号以外的所有字符的代码

    用js替换除数字与逗号以外的所有字符的代码

    用js实现的替换除数字与逗号以外的所有字符的代码,因为需要去除重复,这样的话就会有很多的逗号需要替换
    2014-06-06
  • 使用Webpack构建多页面程序的实现步骤

    使用Webpack构建多页面程序的实现步骤

    这篇文章主要介绍了使用Webpack构建多页面程序的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 浅析JavaScript中的特殊函数及用法小结

    浅析JavaScript中的特殊函数及用法小结

    JavaScript中的函数本质上是一个对象,我们可以将这个对象赋值给一个变量,这就使JavaScript中的函数变得非常的灵活,现在就来浅看一下JavaScript中函数的一些用法,需要的朋友可以参考下
    2022-06-06
  • JavaScript类继承及实例化的方法

    JavaScript类继承及实例化的方法

    这篇文章主要介绍了JavaScript类继承及实例化的方法,较为详细的分析了javascript扩展类、实例化类及类对象与成员函数的使用技巧,需要的朋友可以参考下
    2015-07-07
  • boostrapTable的refresh和refreshOptions区别浅析

    boostrapTable的refresh和refreshOptions区别浅析

    在使用bootstrapTable时,刷新数据有两个方法refresh、refreshOptions,在其用法上有点区别,接下来通过本文给大家分享boostrapTable的refresh和refreshOptions的区别,需要的朋友可以参考下
    2017-01-01
  • 基于Bootstrap的Metronic框架实现页面链接收藏夹功能

    基于Bootstrap的Metronic框架实现页面链接收藏夹功能

    本文给大家介绍基于Metronic的Bootstrap开发框架实现页面链接收藏夹功能,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-08-08

最新评论