Symbol数据类型

ES6新加的数据类型,提供一个独一无二的值

 { let a1 = Symbol() ;let a2 = Symbol() }  //声明
 { let a3 = Symbol.for('a3') } //这种声明方式方便再取回来
 { let a1=Symbol.for('abc'); let obj={ [a1]:'123' , 'abc':235}; console.log(obj) } //{abc: "235", Symbol(abc): "123"}

如果使用Symbol配置值的话则使用let of 的方式取不到Symbol(abc)的值

 Object.getOwnPropertySymbols(obj).forEach(function(item){console.log(obj[item])});  //123 只取到Symbol的值

取所有值://Reflect.ownKeys返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举

Reflect.ownKeys(obj).forEach(function(item){console.log(obj[item])})  //235  123

set-map 数据结构

set

① 声明

不加参数 :

{ let list = new Set(); list.add(5) ; list.add(7); }  //list.size()是2

加参数 :

{ let arr= [1,2,3,4,5]; let list = new Set(arr) }  //list.size()是5

② set添加重复的元素不会报错,但是不会添加进去,可以利用这个作用来去重(需要注意下元素的数据类型是否一致)

{ let list = new Set(); list.add(5) ; list.add(7); list.add(5); }  //list.size()是2

③ 操作函数 :

add  delete  clear  has

④ 遍历:

元素的keys()和values()的值是一样的

for(let key of list.keys()){ console.log(key) }
for(let value of list.values()){ console.log(value) }
for(let [key,value] of list.entries()){ console.log(key,value) }

WeakSet

区别:

支持的元素类型不一样,WeakSet只能是对象;

WeakSet的对象是弱引用,不会检测该对象是否在其他地方用过,只是地址的引用;

没有size属性;没有clear方法;其余的add delete has 方法一致

不能遍历

①声明

{ let weakset = new WeakSet() ; let arg ={} ; weakset.add(args) }

Map 键值对

key可以是任何数据类型

①声明 :

{ let map = new Map(); let arr= ['123']; map.set(arr,'234'); }  //map.get(arr) = '234'

{ let map = new Map([ ['a',123],['b',456] ])}  //{"a"=>123,"b"=>456} ; map.size=2

map不能set一个item对象,需要使用声明的第二种方式

②函数:set  delete  clear

③遍历:同set

WeakMap

接收的key值必须是对象,没有clear方法,不能遍历

{ let weakmap = new WeakMap() ; let obj={}; weakmap.set(obj,123)}  //weakmap.get(obj)=123

对比:

Set Map与Array对比

let set= new Set() ; let map = new Map() ; let arr = [] ;

//增加

set.add({t:1});
map.set('t',1);
arr.push({t:1})

//查找

let set_exists = list.has({t:1})  ///false ,has查询的是对象的引用
let map_exists = map.has(‘t’) //true 返回布尔值
let arr_exists = array.find(item=>item.t) //{t:1} 返回对象

//改

set.forEach(item=>item.t?item.t=2:'')  //在set中要是直接修改的话他不会检查是否冲突,而是直接加了一个,所以需要先找到再修改
map.set('t',2);
array.forEach(item=>item.t?item.t=2:'') //数组需要先forEach找到再修改

//删除

set.forEach(item = item.t?set.delete(item):'')
map.delete('t')
let index = array.findIndex(item=>item.t) array.splice(index,1) //数组需要先找到再删

Map Set 和Array的对比

let item = {t:1}; let set= new Set(); let map = new Map(); let obj={}

//增加

set.add(item)
map.set('t',1)
obj['t']:1

//查询

set.has(item)  //
map.has('t')
't' in obj //使用in

//删除

set.delete(item)
map.delete('t')
delete obj['t']

//修改

item.t =2 //set是引用,直接修改item,set下的值会随之变化
map.set('t':4)
obj['t']=4

使用场景:

能使用map的不使用数组,对于数据要求比较高和唯一性使用set,放弃object

ES6 Symbol数据类型和set-map 数据结构的更多相关文章

  1. Java数据类型和MySql数据类型对应一览

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N ...

  2. 数据类型和typeof操作符

    虽然学习js有一段时间了,但是对js的基础语法却是有些生疏.最近在看jquery源码,决定随带总结一些基础的语法知识.今天总结一下数据类型和typeof,这在写js的时候,是不得不知道的知识. 数据类 ...

  3. Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)

    Sql Server中的数据类型和Mysql中的数据类型的对应关系(转):https://blog.csdn.net/lilong329329/article/details/78899477 一.S ...

  4. SQL数据类型和C#数据类型间的转换

    今天看到SQL数据类型和C#数据类型间的转换,前人留下的. <?xml version="1.0" encoding="utf-8" ?> < ...

  5. MySql数据类型和Java数据类型对应一览

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N ...

  6. Java数据类型和MySql数据类型对应一览 [转]

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N ...

  7. mysql数据类型和java数据类型匹配

    Java数据类型和MySql数据类型对应一览 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java. ...

  8. ES6学习笔记(10)----Set和Map数据结构

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ Set和Map数据结构 1.Set  基本用法    Set是一种新的数据结构,它的成员都是唯一 ...

  9. ES6学习总结之Set和Map数据结构的理解

    前言 当我们需要存储一些数据的时候,首先想到的是定义一个变量用来存储,之后我们可能学了数组,发现数组比变量可以存储更多的数据,接着可能有其它的存储数据的方法等等,然而我今天需要介绍的是在ES6中比较常 ...

随机推荐

  1. ES6随笔

    let, const 这两个的用途与var类似,都是用来声明变量的,但在实际运用中他俩都有各自的特殊用途.首先来看下面这个例子: var name = 'zach' while (true) { va ...

  2. 初识Vue

    Vue.js介绍 Vue是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合.另 ...

  3. Flask简述

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  4. C++反汇编调试

    1.使用 OllyDBG打开的dll文件,最好找破解pro版本.不然没有编辑权限 ,目前OllyDBG并不支持eclipse IDE  64位编辑的 .class文件类型. 另外使用反编译的时候物理内 ...

  5. ycmd for emacs 代码自动补全

    YCMD FOR EMACS Table of Contents 1. 安装 1.1. 下载 1.2. 安装相关依赖 1.3. 更新submodules 1.4. 安装 2. 配置 1 安装   1. ...

  6. Linux 目录结构和常用命令

    Linux目录结构 目录 说明 bin 存放二进制可执行文件(ls,cat,mkdir等) boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc 存放系统配置文件 home 存 ...

  7. Nginx模块 ngx_http_limit_req_module 限制请求速率

    The ngx_http_limit_req_module module (0.7.21) is used to limit the request processing rate per a def ...

  8. LINUX更改桌面的分辨率

    命令行 输入xrandr 输入xrandr命令后可以看到系统的一些分辨率的列表, 和当前系统屏幕的分辨率信息,可以通过命令的 相应参数对系统分辨率的一些设置操作. xrandr -s 0 全屏 xra ...

  9. BZOJ.5092.[Lydsy1711月赛]分割序列(高维前缀和)

    题目链接 \(Description\) \(Solution\) 首先处理\(a_i\)的前缀异或和\(s_i\).那么在对于序列\(a_1,...,a_n\),在\(i\)位置处分开的价值为:\( ...

  10. 友元(friend)

    1.友元类的关系不能传递和继承 ...待续