ES6新特性使用小结(三)
九、数据类型 Symbol
/*
* Symbol 数据类型 概念: Symbol 提供一个独一无二的值
* */ {
let a1 = Symbol();
let a2 = Symbol();
console.log(a1===a2,a1,a2); //false let a3 = Symbol.for('a3'); //*Symbol.for 会检查window下是否存在 'a3'
let a4 = Symbol.for('a3');
console.log(a3===a4); //true
} {
//用法
let a1 = Symbol.for('abc');
let obj = {
[a1]:'123', //独一无二的key 值
'abc':345,
'c':'456'
}
console.log('obj',obj); //{abc: 345, c: "456", Symbol(abc): "123"} for(let [key,value] of Object.entries(obj)){
console.log(key,value); //abc 345 c 456
// * for in/of 取不到Symbol类型key值
} Object.getOwnPropertySymbols(obj).forEach(function (item) {
console.log(obj[item]); //123 可以拿到Symbol类型的key 但拿不到常规的key值
}) Reflect.ownKeys(obj).forEach(function (item) { //可以拿到Symbol类型的key和常规的key
console.log('ownKeys',obj[item]); //ownKeys 345 ownKeys 456 ownKeys 123
})
}
十、数据结构 Map()、Set()、WeakMap()、WeakSet()
/*
* ES6中的数据结构 Set() WeakSet() Map() WeakMap()
* */ {
let list = new Set();
list.add(5);
list.add(7); console.log('size', list.size) //获取 长度 size 2
} {
let arr = [1, 2, 3, 4, 5];
let list = new Set(arr); console.log('size', list.size) //size 5
} {
let list = new Set();
list.add(1);
list.add(2);
list.add(1); //往Set 数据类型中添加重复的值 不会报错,只是不会生效 console.log('list', list) //Set(2) {1, 2}
} { /* 利用Set数据类型的特性去重 **Set 在转换元素的的时候不会进行数据类型的转换 */
let arr = [1, 2, 3, 1, 5, '2', 4];
let list = new Set(arr); console.log('unique', list); //Set(6) {1, 2, 3, 5, "2", 4} 字符串‘2’和数值2同时存在
} /*
* Set实例方法 add delete clear has
* */ {
let arr = ['add', 'delete', 'clear', 'has'];
let list = new Set(arr); console.log('has', list.has('add')); //true
console.log('delete', list.delete('add'), list); //Set(3) {"delete", "clear", "has"}
console.log('clear', list.clear(), list) //Set(0) {}
} /*
* 对Set数据结构的遍历
* */ {
let arr = ['add', 'delete', 'clear', 'has'];
let list = new Set(arr); for (let key of list.keys()) {
console.log('keys', key); //keys add keys delete keys clear keys has
} for (let v of list.values()) {
console.log('values', v); //values add values delete values clear values has
} for (let [k,v] of list.entries()) {
console.log('entries', k, v); //entries add add entries delete delete ...
} list.forEach(function (item) {
console.log(item); //add, delete, clear, has
})
} /*
* WeakSet 支持的数据类型必须是 *对象
* WeakSet中的对象都是弱引用 不会和垃圾回收机制挂钩
*
* WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历不能保证成员的存在。
* 可能刚刚遍历结束,成员就取不到了。WeakSet的一个用处是存储DOM节点,而不用担心这些节点从文档移除时,会引起内存的泄露。
* WeakSet结构有以下方法
* WeakSet.add(value):向WeakSet实例添加一个新成员。
* WeakSet.delete(value):删除WeakSet实例指定成员。
* WeakSet.has(value):返回一个布尔值,表示某个值是否在WeakSet实例中。
* */ {
let weakList = new WeakSet();
let arg = {};
weakList.add(arg);
//weakList.add(1); //Invalid value used in weak set
} /*
* Map数据结构 Map的key值可以为任意类型
* */ {
let map = new Map();
let arr = [1, 2, 3]; map.set(arr, 456)
console.log('map', map) //Map(1) {Array(3) => 456} 使用数组作为key
} {
let map = new Map([['a', 123], ['b', 456]]); console.log('map args', map); //Map(2) {"a" => 123, "b" => 456}
console.log('size', map.size); //size 2
console.log('get', map.get('a')); //get 123
console.log('delete', map.delete('a'), map); //delete true Map(1) {"b" => 456}
console.log('clear', map.clear(), map); //clear undefined Map(0) {}
} /*
* WeakMap WeakMap 接受的key值必须为对象 其他同WeakSet
* */ {
let weakMap = new WeakMap();
let o = {}; weakMap.set(o, 123);
console.log('weakMap', weakMap.get(o)); //weakMap 123
}
/*
* Set 和 Array
* */ {
let set = new Set();
let arr = []; //增
set.add({'t': 1});
arr.push({'t': 1});
console.log('ser-arr', set, arr); //查
let set_exist = set.has({t: 1}); //false 引用类型的地址不同
let arr_exist = arr.find(item=>item.t); //改
set.forEach(item=>item.t ? item.t = 2 : '');
arr.forEach(item=>item.t ? item.t = 2 : '');
console.log('set-arr-modify', set, arr); //删
set.forEach(item=>item.t ? set.delete(item) : '')
let index = arr.findIndex(item=>item.t); //查找每个元素中包含t的索引
arr.splice(index, 1);
console.info('set-arr-empty', set, arr); //map-delete Set(0) {} []
} /*
* Map 和 Array
* */ {
//数据结构横向对比 ,增删改查
let map = new Map();
let arr = [];
//增
map.set('t', 1);
arr.push({'t': 1}); console.info('map-array', map, arr); //查
let map_exist = map.has('t'); //boolean
let array_exist = arr.find(item=>item.t); //如果存在 则返回数据的值 console.info('map-array', map_exist, array_exist); //map-array true {t: 1} //改
map.set('t', 2);
arr.forEach(item=>item.t ? item.t = 2 : '');
console.info('map-modify', map, arr); //map-modify Map(1) {"t" => 2} [{t:2}] //删除
map.delete('t');
let index = arr.findIndex(item=>item.t); //查找每个元素中包含t的索引
arr.splice(index, 1);
console.info('map-empty', map, arr); //map-delete Map(0) {} []
} /*
* Map,Set,Object 的对比
* */ {
let item = {'t': 1};
let map = new Map();
let set = new Set();
let obj = {}; //增
map.set('t', 1);
set.add(item);
obj['t'] = 1; console.info('map-set-obj', map, set, obj); //map-set-obj Map(1) {"t" => 1} Set(1) {{t:1}} {t: 1} //查
console.info({
map_exist: map.has('t'),
set_exist: set.has(item),
obj_exist: 't' in obj
}
//{map_exist: true, set_exist: true, obj_exist: true}
) //改
map.set('t',2);
item.t=2; //set 保存引用地址
obj['t']=2; console.info('map-set-obj-modify', map, set, obj); //map-set-obj-modify Map(1) {"t" => 2} Set(1) {{…}} {t: 2} //删
map.delete('t');
set.delete(item);
delete obj['t']; console.info('map-set-empty', map,set, arr);
}
/*
* 对比小结: Map>Set>Array=Object
* 1、在开发过程中涉及到的数据结构 能使用Map 不使用 Array 尤其是复杂的数据结构使用
* 2、如果对数据结构中的唯一性有要求 考虑使用Set 放弃使用Object做存储
* */
ES6新特性使用小结(三)的更多相关文章
- ES6新特性使用小结(六)
十三.promise 异步编程 ①.使用 promise 模拟异步操作 { //ES5 中的 callback 解决 异步操作问题 let ajax = function (callback) { c ...
- ES6新特性使用小结(一)
一.let const 命令 'use strict'; /*function test(){ //let a = 1; for(let i=1;i<3;i++){ console.log(i) ...
- ES6新特性使用小结(四)
十一.Proxy .Reflect ①.Proxy 的概念和常用方法 { let obj = { //1.定义原始数据对象 对用户不可见 time: '2017-09-20', name: 'net' ...
- ES6新特性使用小结(二)
六.Array 扩展 /* * Array Api Array.of 数组的构建 * */ { let arr = Array.of(, , , , , ); console.log(arr); // ...
- ES6新特性使用小结(五)
十二.class 与 extends ①.类的基本定义和生成实例 { class Parent{ constructor(name='Lain'){ //定义构造函数 this.name = name ...
- ES6新特性三: Generator(生成器)函数详解
本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...
- javascript ES6 新特性之 扩展运算符 三个点 ...
对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() ...
- ES6新特性概览
本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...
- Atitit js版本es5 es6新特性
Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...
随机推荐
- 线上cpu100%问题快速定位
问题描述:服务器上部署了多个tomcat,即垂直切分的Web站点,记忆多个Java微服务,突然收到运维的cpu异常告警. 步骤一:找到最耗cpu的进程 工具:top 方法: 执行top -c,显示进程 ...
- 解决 maps to localhost, but this does not map back to the address
修改 /etc/ssh/ssh_config vim /etc/ssh/ssh_config GSSAPIAuthentication no
- [转]Javascript高性能动画与页面渲染
No setTimeout, No setInterval 作者 李光毅 发布于 2014年4月30日 如果你不得不使用setTimeout或者setInterval来实现动画,那么原因只能是你需要精 ...
- ZigBee协议
转载地址http://www.feibit.com/bbs/viewthread.php?tid=140&extra=page%3D1 WSN/Zigbee开源协议栈 1. msst ...
- AI-Info-Micron-Insight:通往完全自主之路
ylbtech-AI-Info-Micron-Insight:通往完全自主之路 1.返回顶部 1. 通往完全自主之路 自动驾驶汽车正在从未来梦想演变为当代现实,随着技术成熟,个人和公共交通将永远转变. ...
- NancyFX 第一章 NancyFX 简介
Nancy是.NET 平台的微框架.在受到Ruby社区的Sinatra框架启发下,NancyFx框架提供一个.NET平台下的低门槛.易上手的可用于Web开发工具包. 请注意我说的是可用于Web开发,这 ...
- 如何开发一个直播APP
一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通 ...
- 【252】◀▶IEW-Unit17
Unit 17 Social Issues: Population 复杂表格写作技巧 1.Model1对应图片分析 The table contains information about the d ...
- [poj1741]Tree(点分治+容斥原理)
题意:求树中点对距离<=k的无序点对个数. 解题关键:树上点分治,这个分治并没有传统分治的合并过程,只是分成各个小问题,并将各个小问题的答案相加即可,也就是每层的复杂度并不在合并的过程,是在每层 ...
- HDOj-1412
{A} + {B} Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...