九、数据类型  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新特性使用小结(三)的更多相关文章

  1. ES6新特性使用小结(六)

    十三.promise 异步编程 ①.使用 promise 模拟异步操作 { //ES5 中的 callback 解决 异步操作问题 let ajax = function (callback) { c ...

  2. ES6新特性使用小结(一)

    一.let const 命令 'use strict'; /*function test(){ //let a = 1; for(let i=1;i<3;i++){ console.log(i) ...

  3. ES6新特性使用小结(四)

    十一.Proxy .Reflect ①.Proxy 的概念和常用方法 { let obj = { //1.定义原始数据对象 对用户不可见 time: '2017-09-20', name: 'net' ...

  4. ES6新特性使用小结(二)

    六.Array 扩展 /* * Array Api Array.of 数组的构建 * */ { let arr = Array.of(, , , , , ); console.log(arr); // ...

  5. ES6新特性使用小结(五)

    十二.class 与 extends ①.类的基本定义和生成实例 { class Parent{ constructor(name='Lain'){ //定义构造函数 this.name = name ...

  6. ES6新特性三: Generator(生成器)函数详解

    本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...

  7. javascript ES6 新特性之 扩展运算符 三个点 ...

    对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() ...

  8. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  9. Atitit js版本es5 es6新特性

    Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...

随机推荐

  1. codeforces 706D D. Vasiliy's Multiset(trie树)

    题目链接: D. Vasiliy's Multiset time limit per test 4 seconds memory limit per test 256 megabytes input ...

  2. BaseAdapter/AsyncTask/..等等细节

    BaseAdapter中的getCount之类的函数,是在constructor之后才启动的.这印证了构造函数的优先级是max的. 图片 这一点的意义在于,当你想给getCount返回一个具体参数的时 ...

  3. ACM学习历程—NPU1086 随机数 2015年陕西省程序设计竞赛网络预赛(正式赛)C题 (计数排序 || set容器)

    Description 开学了,ACM队的边老板想在学校中请一些妹子一起做一项问卷调查,调查妹子们对ACM的了解情况,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100), ...

  4. bzoj 2216: Lightning Conductor 单调队列优化dp

    题目大意 已知一个长度为\(n\)的序列\(a_1,a_2,...,a_n\)对于每个\(1\leq i\leq n\),找到最小的非负整数\(p\)满足: 对于任意的\(j\), \(a_j \le ...

  5. Codeforces 762D Maximum path 动态规划

    Codeforces 762D 题目大意: 给定一个\(3*n(n \leq 10^5)\)的矩形,从左上角出发到右下角,规定每个格子只能经过一遍.经过一个格子会获得格子中的权值.每个格子的权值\(a ...

  6. python反复执行某个命令

    #! /usr/bin/env python #coding=utf-8 # 以需要的时间间隔执行某个命令    import time, os    def re_exe(cmd, inc = 60 ...

  7. Cache系列:spring-cache简单三步快速应用ehcache3.x-jcache缓存(spring4.x)

    前言:本项目基于spring4.x构建,使用ehcache3.5.2和JCache(jsr107规范) 一.依赖 除了ehcache和cache-api外,注意引用spring-context-sup ...

  8. 人工智能实践:TensorFlow 框架

    张量.计算图.会话 基本概念 基于Tensorflow的NN:用张量表示数据,用计算图搭建神经网络,用会话执行计算图,优化线上的权重(参数),得到模型. 张量(Tensor):张量就是多维数组(列表) ...

  9. javaweb学习总结—监听器(Listener)

    监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一 ...

  10. Python的subprocess子进程和管道进行交互

    在很久以前,我写了一个系列,Python和C和C++的交互,如下 http://blog.csdn.net/marising/archive/2008/08/28/2845339.aspx 目的是解决 ...