ES6记录

ES6 知识记录

1. let 和 const

let是用来声明变量,块级作用域内有效不会变量提升(先声明再使用)
const则是声明常量不可以修改,声明的时候必须赋值
(如果是数据类型是不允许修改的,引用类型可以改)

a = 6;
let a;
'报错': let不会声明提前
1.
var b = 0;
let b = 1;

2.
let aa = 0;
let aa = 1;

'错误': let不允许重复声明

const PI = Math.PI;
PI = 3.14;
'错误': 上面是数据类型不能修改

const ob = {}
ob.name = 'zhangsan'
//正确:这是引用类型,可以对其属性修改,简言之就是const记录是一个内存地址


var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

'es6之前需要闭包来实现,现在使用let就可以了'
2. Set 和 Map

Set集合会自动过滤掉重复的元素,Map键值对集合

Array.from(new Set([1,2,1,22,33,'1','2','1','2','w','w','3']));
    
//实现数组去重    
3. 箭头函数 =>

function(i){ return i + 1; } //ES5
(i) => i + 1 //ES6

function(x, y) { 
    x++;
    y--;
    return x + y;
}//es5
(x, y) => {x++; y--; return x+y}//es6 如果方程比较复杂,则需要用{}把代码包起来
4. ``字符模板

let user = {name: 'zhangsan', age: 18};
$("#info").append(`my name is <b>${ user.name}</b>age is <em>${user.age}</em>i'm chinese!`);
//不需要用加号去连接
${param} 是可以进行一些计算的
let num = 9
let add = `${num+1}`
'字符模板的底层实现:通过replace替换掉被正则匹配到的参数用eval转换'

let address = '广州天河区'
let name = '张三'
let str = '${name}在${address}上班...'

function myTemplate(str) {
    return str.replace(/\$\{([^}]+)\}/g,function(matched,childItem){
      console.log(eval(childItem))
        return eval(childItem);
    })
}

console.log(myTemplate(str)) //张三在广州天河区上班

5. 不定参

function test(...types){
    console.log(types)
}
animals('a', 'b', 'c') //["a", "b", "c"]
6. 解构

let user = {name: 'zhangsan', age: 18};
var {name, age} = user;
console.log(name, age);//zhangsan 18

let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3

let [ , , third] = ["foo", "bar", "baz"];
third // "baz"

let [x, , y] = [1, 2, 3];
x // 1
y // 3

let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
7. for of

let user = {name: 'zhangsan', age: 18};
for(let k of user){
    console.log(k);
}

// name age 
8. 浅复制

const objA = { name: 'zhangsan', age: 18 } 
const objB = { address: 'guangzhou' } 
const objC = {} // 这个为目标对象 
const obj = Object.assign(objC, objA, objB) 

// objA objB objC obj 分别输出看看 
console.log(objA) // { name: 'zhangsan', age: 18 } 
console.log(objB) // { address: 'guangzhou' } 
console.log(objC) // { name: 'zhangsan', age: 18, address: 'guangzhou' } console.log(obj) // { name: 'zhangsan', age: 18, address: 'guangzhou' }
'如果目标对象存在相同的属性将被重新赋值,其他原属性不变'
const objC = {age: 55, name: 'lisi',sex: '男'}
console.log(objC) // { name: 'zhangsan', age: 18, address: 'guangzhou', sex: '男' }
9.Spread Operator 展开运算符

'...的使用'
const first = { a: 1, b: 2, c: 6, } 
const second = { c: 3, d: 4 } 
const total = { ...first, ...second } 
console.log(total) // { a: 1, b: 2, c: 3, d: 4 }
10.import 和 export

import导入模块、export导出模块

1.当用export default people导出时,就用 import people 导入(不带大括号)
2.一个文件里,只能有一个export default,可以有多个export
3.当用export name 时,就用import { name }导入(记得带上大括号)
4.当一个文件里,既有一个export default people, 又有多个export name 或者 export age时,导入就用 import people, { name, age }
5.当一个文件里出现n多个 export 导出很多模块,导入时除了一个一个导入,也可以用import * as example
11. Promise

用同步编程的方式来编写异步代码,保存线性的代码逻辑,极大的降低了代码耦合性而提高了程序的可扩展性。

'resolve reject'使用

function Task (...time) {
  var init = new Promise(function(resolve, reject){
    console.log('执行任务初始化')
    if(typeof time[0] === 'number'){
      resolve('执行任务')
    }else{
      var msg = time[1] === 'bad' ? '配置参数错误' : '数据库空间不足';
      reject('初始化失败'+msg)
    }
  })
  return init
}
function Task1 () {
  var init = new Promise(function(resolve, reject){
    resolve([1,2,3])
  })
  return init
}
function Task2 () {
  var init = new Promise(function(resolve, reject){
    resolve(function(){
      return 'do sth'
    })
  })
  return init
}
//任务初始化参数1 number 2 string 'bad'
Task(9).then(function (data) {
  console.log(data)//执行resolve函数
  return Task1()//进行下一个函数
}).then(function (data) {
  console.log(data.join('..'))
  return Task2()
}).then(function( data) {
  console.log(data())
}).catch(function (error){
  console.log(error)
})


'all使用'
Promise
.all([Task(), Task1(), Task2()])
.then(function(results){
    console.log(results);
});
//同事执行三个函数把结果保存在一个数组resluts里面,按顺序返回(如果task1存在延时返回顺序仍旧是执行顺序)

'race使用'
Promise
.all([Task(), Task1(), Task2()])
.then(function(results){
    console.log(results);
});
//先执行完的被返回
12.Generators

生成器( generator)是能返回一个迭代器的函数.生成器函数也是一种函数,最直观的表现就是比普通的function多了个星号,在其函数体内可以使用yield关键字,有意思的是函数会在每个yield后暂停.

// 生成器
function *createTask() {
    yield {status: 'start'};
    yield {status: 'do'};
    yield {status: 'end'};
}
// 生成器能像正规函数那样被调用,但会返回一个迭代器
function doSth(){
    let task = createTask();
    let result = task.next();
    function ctu () {
      console.log(result.value)
      if(!result.done){
        result = task.next()
        ctu()
      }
    }
    ctu()
}
doSth()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值