let 与 const

// 并非真正的常量
// const 的本质: const 定义的变量并非常量,并非不可变,
// 它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。
// 下面的代码并不会报错: // 创建常量对象
const car = {type:"Fiat", model:"500", color:"white"};
// 修改属性:
car.color = "red";
// 添加属性
car.owner = "Johnson"; // 创建常量数组
const cars = ["Saab", "Volvo", "BMW"];
// 修改元素
cars[0] = "Toyota";
// 添加元素
cars.push("Audi");

结构赋值

{ // 变量值交换 在之前我们得使用一个中间变量来存储
let a = 1;
let b = 2;
[a, b] = [b, a];
console.log(a, b); // 2 1
} {
function f(){ // 取出函数返回的两个值 例如: 商品单价 商品数量
return [1, 2]
}
let a, b
[a, b] = f()
console.log(a, b) // 1 2
} {
function f() { // 返回多个值时 选择性的接受某几个变量 忽略不想要的
return [1, 2, 3, 4, 5]
}
let a, b, c;
[a, , , b] = f()
console.log(a, b); //1 4
} {
function f() {
return [1, 2, 3, 4, 5]
}
let a, b, c;
[a, , , ...b] = f()
console.log(a, b); //1 [4, 5]
}

字符串的扩展

{
let str = '\u{20bb7}abc'
for (let i = 0; i < str.length; i++) {
console.log(str[i]) // � � a b c
} for(let code of str){
console.log(code) // ? a b c
}
}

对象的扩展

{
// 新增API
console.log('字符串', Object.is('abc', 'abc'), 'abc' === 'abc'); // 字符串 true true
console.log('数组', Object.is([], []), [] === []); // 数组 false false
console.log('拷贝', Object.assign({a: 'a'}, {b: 'b'})); // 浅拷贝 拷贝 {a: "a", b: "b"}
}

目前,ES7有一个提案,引入了跟Object.keys配套的Object.values和Object.entries。ES7兼容插件 import 'babel-polyfill';

symbol

{
let a1 = Symbol.for('abc')
let obj = {
[a1]: '123',
'abc': 345,
'c': 456
}
console.log('obj', obj); // obj {abc: 345, c: 456, Symbol(abc): "123"}
for(let i in obj){ //循环不到Symbol
console.log(i); // abc c
}
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(abc)]
Object.getOwnPropertySymbols(obj).forEach(item => {
console.log(obj[item]); // 123
})
Reflect.ownKeys(obj).forEach(item => {
console.log(item, obj[item]); // abc 345 c 456 Symbol(abc) "123"
})
}

set和map数据结构

set

 { // 数组去重
let list = [2, 3, 5, 4, 5, '2', 2]
let list2 = new Set(list)
console.log(list2); // Set(5) {2, 3, 5, 4, "2"}
}

{ // 增删清查
let arr = ['add', 'delete', 'clear', 'has']
let list = new Set(arr) console.log('has', list.has('add'), list.entries());
// has true SetIterator {"add", "delete", "clear", "has"} console.log('delete', list.delete('delete'), list.entries());
// delete true SetIterator {"add", "clear", "has"} console.log('clear', list.clear('clear'), list.entries());
// clear undefined SetIterator {} console.log('add', list.add('add'), list.entries());
// add Set(1) {"add"} SetIterator {"add"}
}

WeakSet

  • WeakSet结构与Set类似,也是不重复的值的集合。但是,它与Set有两个区别。

    • 首先,WeakSet的成员只能是对象,而不能是其他类型的值。
    • 其次,WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。

map

{ // 删清查
let map = new Map([
['a', 123],
['b', 456]
])
console.log('map', map); // map Map(2) {"a" => 123, "b" => 456}
console.log('size', map.size); // size 2
console.log('delete', map.delete('a'), map); // delete true Map(1) {"b" => 456}
console.log('clear', map.clear(), map); // clear undefined Map(0) {}
}

WeakMap

{
let weakmap = new WeakMap() let o = {}
weakmap.set(o, 123)
console.log(weakmap); // WeakMap {{…} => 123}__proto__: WeakMap[[Entries]]: Array(0)length: 0
}

map-set与数组和对象的比较

Proxy 和 Reflect

{ // 代理校验
function validator(target, validator) {
return new Proxy(target, {
_validator: validator,
set(target, key, value, proxy) {
if (target.hasOwnProperty(key)) {
let va = this._validator[key]
if (!!va(value)) {
return Reflect.set(target, key, value, proxy)
} else {
throw Error(`不能设置${key}到${value}`)
}
} else {
throw Error(`${key}不存在`)
}
}
})
} const personValidators = {
name(val) {
return typeof val === 'string'
},
age(val) {
return typeof val === 'number' && val > 18
}
} class Person {
constructor(name, age) {
this.name = name
this.age = age
return validator(this, personValidators)
}
} const person = new Person('lilei', 30)
console.info(person)
// person.name = 48 //报错: 不能设置name到48
// person.sex = '男' // sex不存在
person.name = 'han meimei'
console.info(person) // Proxy {name: "lilei", age: 30}
}

class

{
// 基本定义和生成实例
class Parent {
constructor(name = 'zhangsan') {
this.name = name
}
}
let v_parent = new Parent('v')
console.log('构造函数和实例', v_parent) // 构造函数和实例 Parent {name: "v"}
} {
// 继承
class Parent {
constructor(name = 'lisi') {
this.name = name
}
}
class Child extends Parent {
constructor(name = 'child') {
// this.type = 'child' // 报错
super(name) // 子类想父类传递参数
this.type = 'child'
}
} console.log('继承', new Child) // 继承 Child {name: "child", type: "child"}
} {
// getter, setter
class Parent {
constructor(name = 'wanger') {
this.name = name
}
get longName() {
return 'mk' + this.name
}
set longName(value) {
this.name = value
} }
let v = new Parent()
console.log('getter', v.longName) // getter mkwanger
v.longName = 'hello'
console.log('setter', v.longName) // setter mkhello
} {
// 静态方法
class Parent {
constructor(name = 'zhaowu') {
this.name = name
}
static tell() {
console.log('tell')
}
} Parent.tell() // tell
} {
// 静态属性
class Parent{
constructor(name = 'sunshangxiang'){
this.name = name
}
static tell (){
console.log('tell')
}
}
Parent.type = 'test'
console.log('静态属性', Parent.type) // 静态属性 test
}

promise对象

{
// 所有图片加载完再添加到页面
function loadImg(src) {
return new Promise(function (resolve, reject) {
let img = document.createElement('img')
img.src = src
img.onload = function () {
resolve(img)
}
img.onerror = function (err) {
reject(err)
}
})
} function showImgs(imgs) {
imgs.forEach(img => {
document.body.appendChild(img)
});
}
Promise.all([ // 所有图片加载完后执行
loadImg('http://pic37.nipic.com/20140113/8800276_184927469000_2.png'),
loadImg('http://pic37.nipic.com/20140113/8800276_184927469000_2.png'),
loadImg('http://pic37.nipic.com/20140113/8800276_184927469000_2.png')
]).then(showImgs)
}
{
// 多个图片服务器, 加载最快的一个
// 有一个图片加载完成就添加到页面
function loadImg(src) {
return new Promise((resolve, reject) => {
let img = document.createElement('img')
img.src = src
img.onload = function () {
resolve(img)
}
img.onerror = function () {
reject(err)
}
})
}
function showImg(img){
document.body.appendChild(img)
} Promise.race([ // 谁先请求到 就显示谁
loadImg('http://img2.imgtn.bdimg.com/it/u=234634259,4236876085&fm=26&gp=0.jpg'),
loadImg('http://img4.imgtn.bdimg.com/it/u=2153937626,1074119156&fm=26&gp=0.jpg'),
loadImg('http://img1.imgtn.bdimg.com/it/u=1483033257,4287748004&fm=26&gp=0.jpg')
]).then(showImg)
}

修饰器

{
// 函数属性为只读 /**
* 修饰器基本用法
* 1 修饰器是一个函数
* 2 修改的行为
* 3 修改类的行为
*/
let readonly = function (target, name, descriptor) {
descriptor.writable = false
return descriptor
} class Test {
@readonly
time() {
return '2019-0526'
}
}
let test = new Test() test.time = function () {
console.log('rest time')
}
console.log(test.time())
// cannot assign to read only property 'time' of object '#<Test>'
}

第三方库修饰器的js库: core-decorators

ES6重度学习 demo实例的更多相关文章

  1. 【xxl-job】轻松实现分布式定时任务demo实例

    [项目描述]前段时间专门独立了一个spring boot服务,用于做和第三方erp系统的对接工作.此服务的第一个需求工作就是可以通过不同的规则,设置不同的定时任务,从而获取erp系统的商品数据.所以, ...

  2. 【java】之 apache commons-codec 与Apache Digest demo实例,支持md5 sha1 base64 hmac urlencode

    使用commons-codec 进行加密的一些操作 package com.jiepu.ApacheDigest; import java.io.FileInputStream; import org ...

  3. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

  4. TCP/IP协议学习之实例ping命令学习笔记

    TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...

  5. 移动端页面弹幕小Demo实例说明

    代码地址如下:http://www.demodashi.com/demo/11595.html 弹幕小Demo实例地址,点击看效果 写在前面:尝试做了一下弹幕的实例,欢迎提出并指正问题 问题说明: D ...

  6. jetty demo实例启动

    Jetty是一个提供HHTP服务器.HTTP客户端和javax.servlet容器的开源项目.Jetty和tomcat相比,是轻量级服务器,支持热拔插,可扩展性大tomcat集成了很多功能,个性化瘦身 ...

  7. react目录结构、demo实例详解、属性数据绑定方式

    1.目录结构 2.demo实例详解 a)创建Home.js import React, { Component } from 'react'; //创建一个组件必须要集成Component组件,且组件 ...

  8. Thymeleaf 学习笔记-实例demo(中文教程)

    项目demo     http://pan.baidu.com/s/1wg6PC 学习资料网址  http://www.blogjava.net/bjwulin/archive/2013/02/07/ ...

  9. RPC框架学习+小Demo实例

    一.什么是RPC协议? 全称:远程过程调度协议 效果:使消费者向调用本地方法一样调用远程服务方法,对使用者透明 目前常用:Dubbo.Thirft.Sofa.... 功能: 建立远程通信(socket ...

随机推荐

  1. linux驱动之定时器的使用

    被文章摘自一下几位网友.非常感谢他们. http://blog.sina.com.cn/s/blog_57330c3401011cq3.html Linux的内核中定义了一个定时器的结构: #incl ...

  2. openvswitch 流表操作

    流表组成 每条流表规则由一些列字段组成,可以分为**基础字段.匹配字段和动作字段**三部分. 在打印流表时,在流表中还存在一些显示字段,如duration,idle_age等,此处把这些字段也暂时归之 ...

  3. 第4篇scrum冲刺(5.24)

    一.站立会议 1.照片 2.工作安排 成员 昨天已完成的工作 今天的工作安排 困难 陈芝敏  完成云开发配置,初始化数据库:  线下模块(还剩下获取词的数据库) 倒计时模块的初加载还是有点慢  冯晓凤 ...

  4. 10分钟搞定 Java 并发队列好吗?好的

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...

  5. xmind8 破解激活教程

    这里以windows为例来演示,其它操作系统需根据情况修改相应步骤. 一.下载安装包 首先去xmind国外官网下载对应操作系统的安装包,国内官网的那个是有残缺的,不支持破解. 官网下载链接 二.下载破 ...

  6. 04.简单了解一下Redis企业级数据备份方案

    一.企业级的持久化的配置策略 (1)每隔1分钟去检查如果超过10000个可以变更,则生成一个快照.RDB最多丢1分钟的数据. save 60 10000 (2)AOF一定要打开,fsync,every ...

  7. 基于Appium的UI自动化测试

    为什么需要UI自动化测试 移动端APP是一个复杂的系统,不同功能之间耦合性很强,很难仅通过单元测试保障整体功能.UI测试是移动应用开发中重要的一环,但是执行速度较慢,有很多重复工作量,为了减少这些工作 ...

  8. 上海做假证t

    上海做假证[电/薇:187ヘ1184ヘ0909同号]办各类证件-办毕业证-办离婚证,办学位证书,办硕士毕业证,办理文凭学历,办资格证,办房产证不. 这是一个简单的取最大值程序,可以用于处理 i32 数 ...

  9. oeasy教您玩转linux010102查看发行版

    查看发行版distro 回忆上次内容 从帮助咱们可以知道 name -a 可以得到全部信息 uname -a 从中,咱们知道有ubuntu,他好像是一种发行版. 那么,什么是发行版呢? 什么是发行版?

  10. Unity报与System.IO相关的错误

    比如这个: Type `System.IO.FileInfo' does not contain a definition for `OpenText' and no extension method ...