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. 利用 Github Actions 自动更新 docfx 文档

    利用 Github Actions 自动更新 docfx 文档 Intro docfx 是微软出品一个 .NET API 文档框架,有一个理念是代码即文档,会根据项目代码自动生成 API 文档,即使没 ...

  2. Ubuntu操作系统(文件传输)

    首先选择Ubuntu版本为偶数版本--(系统比较稳定软件源比较齐全) Ubuntu和windows之间的文件传输首先在Windows上安装连接工具winscp 在Ubuntu开启SSH服务(https ...

  3. Excel 科学计数法数值转换

    问题场景 如果导出的数据文件后缀为.CSV,一般数值类型的数据超过12位后,单元格的数据就用科学计数法来表示了. 比如身份证号.较长的id,数值会超过12位,而科学计数法表示,不方便查看或操作,很多情 ...

  4. unity探索者之微信支付,非第三方插件

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8404604.html 相比微信的登录和分享功能,微信支付sdk的接入显得相当简单, ...

  5. Spring注解驱动开发04(给容器中注册组件的方式)

    给容器中注册组件的方式 1. 组件注解标注 + 包扫描(适用于自己写的类) //控制层组件 @Controller public class PersonController { } //业务逻辑层组 ...

  6. C++ Templates(1.3 多模板参数 Multiple Template Parameters)

    返回完整目录 目录 1.3 多模板参数 Multiple Template Parameters 1.3.1 为返回类型设置模板参数参数 Template Parameters for Return ...

  7. Java 8新特性(三):Optional类

    在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题.本篇文章将详细介绍Option ...

  8. Federated Optimization: Distributed Machine Learning for On-Device Intelligence

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1610.02527v1 [cs.LG] 8 Oct 2016 坐标下降法:https://blog.csdn.net/qq_ ...

  9. python安装numpy、scipy、gensim以及报错unable to import 'smart_open.gcs', disabling that module处理

    首先,安装gensim库,必须先安装numpy+mkl和scipy 安装顺序是依次安装numpy+kml.scipy.gensim,根据自己Python下载的版本进行下载 如果你的库里面有numpy. ...

  10. Python中pytesseract库的使用以及注意事项

    当我们在使用pytesseract库的时候,使用 pip install pytesseract安装完成后,发现它并不能识别出图片内容,并且会抛出异常pytesseract.pytesseract.T ...