九、数据类型  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. 轻量级RPC框架开发

    nio和传统io之间工作机制的差别 自定义rpc框架的设计思路 rpc框架的代码运行流程 第2天 轻量级RPC框架开发 今天内容安排: 1.掌握RPC原理 2.掌握nio操作 3.掌握netty简单的 ...

  2. PHP的Calling Scope(::调用非静态方法)

    今天在群里发现有人说,PHP可以用::调用非静态方法,一致没这么试过,发现了鸟哥的blog写了这个问题的具体解释,就搬过来: 这个问题乍看, 确实很容易让人迷惑, 但实际上, 造成这样的误解的根本原因 ...

  3. python- python内置模块 面向对象

    1.configparser模块 configparser用于处理特定格式的文件,其本质上是利用open来操作文件 # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2 ...

  4. Mybatis中的like模糊查询

    1.  参数中直接加入%% param.setUsername("%CD%");      param.setPassword("%11%"); <sel ...

  5. Java常用类Date、Calendar、SimpleDateFormat详解

    Date类 java.util 包提供了 Date 类来封装当前的日期和时间,Date 类提供两个构造函数来实例化 Date 对象 第一个构造函数使用当前日期和时间来初始化对象   Date( ) 第 ...

  6. 【MFC】动态创建CMFCToolbar图标不显示问题

    最近遇到一个问题,需要动态的从xml文件读取一系列图标文件,加载到一个toolbar中,由于使用的是vs2008 with sp1 feature pack,自然想到用CMFCToolbar来做,思路 ...

  7. kettle 设置变量

    以下只是本人在使用过程中一些经验,可能有误解不对的地方,希望大家指正. 这个控件可以在job中调用,也可以在transformation中使用.下面将分别说明在两个不同任务中调用时的使用方法和需要注意 ...

  8. PHP 流程控制

    流程控制 if, else, elseif $a = 5; $b = 9; if ($a > $b): echo "a is bigger than b"; elseif ( ...

  9. Win 10 无法打开内核设备“\\.\Global\vmx86”

    Win 10操作系统, VMWareWorkstation10 无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件.你想要在安装 VMware Workstation 前重启 ...

  10. OGG 进程清除、重建

    背景描述:有时候OGG进程同步出现问题,症状某些进程起不来,而且问题一时半会儿解决不了.最简单的办法是:用数据泵初始化数据,OGG进程重建. 1.查看源端.目的端的进程状态. (作者OGG进程是正常的 ...