美文网首页
ES6入门基础

ES6入门基础

作者: 知识分享share | 来源:发表于2021-02-03 09:11 被阅读0次

ES6入门基础

一.let & const

1.基本用法

es6新增 let命令,用来申明变量,用法类似于var,但是所声明的变量只在let命令的代码块中有效

for (let i = 0;i < 10; i++) {
    //...
}
console.log(i);
//ReferenceError:i is not defined

上面循环中,i只在for循环中有效

{
    let a = 10;
    var b = 1;
}
a //ReferenceError: a is not defined
b //1

上面代码a只在它所在的代码块中有效

不存在的变量提升

var变量会发生变量提升的现象,即变量可以在声明之前使用,值为undefined。而let必须在变量声明之后使用,否则会报错。

//var的情况
console.log(foo);//输出undefined
var foo = 2;

//let的情况
console.log(bar);//报错ReferenceError
let bar = 2
暂时性死区

只要块级作用域内存在let命令,它所声明的变量就会绑定这个区域,不会受外部影响。

var tmp = 123;
if(true){
    tmp='abc';//ReferenceError
    let tmp;
}

es6明确规定,在let声明之前,该变量都是不可用的,称为暂时性死区。

不允许重复声明变量

let不允许在相同作用域内,重复声明同一个变量。

//报错
function func(){
    let a=10;
    var a=1;
}
//基本用法 报错
function func(){
    let a=10;
    let a=1;
}

2.块级作用域

块级作用域没有块级作用域,会带来很多不合理的场景

  • 内层变量可能会覆盖外层变量
  • 用来计数的循环变量可能会泄漏成为全局变量

3.const命令

基本用法一旦声明,常量的值就不能被改变,而且声明之后必须立即对其初始化,否则报错。

const foo;
//SyntaxError:Missing initializer in const declaration

es6声明变量的六种方法 let const import class

二.变量的解构赋值

左右两边结构必须一样,右边合法,声明和赋值不能分开

1.数组的解构赋值

let [a,b,c]=[1,2,3];//a=1,b=2,c=3
let [foo,[[bar],baz]]=[1,[[2,3],3]];//foo=1,bar=[2,3],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]=['z']//x='z',y=undefined,z=[]

如果解析不成功,变量的只为undefined

let [foo]=[];//foo=undefined
let [bar,foo]=[1];//bar=1,foo=undefined

解构赋值允许指定默认值

let [foo=true]=[];//foo=true
let [x,y='b']=['a'];//x='a',y='b'
let [x,y='b']=['a',undefined]//x='a',y='b'

2.对对象的解构赋值

变量必须与属性同名才能成功赋值

let {bar,foo}={foo:'aaa',bar:'bbb'}//bar='bbb',foo='aaa'
let {baz}={foo:'aaa',bar:'bbb'}//baz=undefined

3.函数的扩展

函数参数的默认值

es6允许为参数设置默认值,直接定义在参数的后面

function log(x,y='world'){
    console.log(x,y);
}
log('hello')//hello world
log('hello','china')//hello china
log('hello','')//hello

函数的length属性:可以返回没有指定默认值的参数个数

(function(a){}).length//1
(function(a=4){}).length//0
(function(a,b,c=5){}).length//2

rest参数(...args)用于获取函数的多余参数,rest参数搭配的变量是一个数组,将变量多余的参数放入数组中,rest参数后不能再有其他参数

function add(...values){
    let sum=0;
    for(var val of values){
        sum+=val;
    }
    return sum;
}
add(2,4,5)//11

扩展符运算:可以将一个数组拆开成若干参数

console.log(...[1,2,3])//1,2,3
console.log(1,...[2,3,4],5)//1,2,3,4,5
[...document.querySelectorAll('div')]//[<div>,<div>,<div>]

箭头函数基本用法

基本用法

允许使用箭头来定义函数,如果只有与一个参数圆括号省略,如果只有一个return,{}可以省略

var f=v=>v;
var f=function(v){
    return v;
}
var f=()=>5
var f=function(){return 5}
var sum=(num1,num2)=>num1+num2
var sum=function(num1,num2){
    return num1+num2
}

箭头函数使用时需要注意的点

  • 函数体内的this对象,就是定义时所在的对象,不是使用时所在的对象
  • 不可当做构造函数,不可以使用new命令
  • 不可以使用arguments对象,可以用rest参数替换
  • 不可以使用yield命令,因此箭头函数不能用作generator函数

注意在箭头函数中,this的指向固定的,它的内部没有自己的this,这也就导致了this总是指向上一层的this,如果上一层还是箭头函数,则继续向上指,直到指向到有自己this的函数为止,并作为自己的this

数组的扩展

  • map
let arr=[1,3,4]
let result=arr.map(item=>item*2)

let score=[1,2,3,4]
let result=score.map(item=>item>=3?'及格':'不及格')
  • reduce
let arr=[1,3,4,5]
let num=arr.reduce((temp,item,index)=>temp+item)
  • filter
let arr=[1,3,4,5,6]
let result=arr.filter(item=>{
    if(item%3==0)
        return false
    else return true
})

4.对象的扩展

可以直接以变量形式声明属性或方法

let es5Fun={
    method:function(){}
}
let es6Fun={
    method(){}
}

5.symbol是什么,有什么用

symbol是es6引入的第七种原始数据类型。所有Symbol()生成的值都是独一无二的,可以接受一个字符串作为参数,var s1=Symbol();var s2=Symbol("foo"),可以作为属性名,而且并不是私有属性

let a={}
let name=Symbol()
a[name]='test'

6.promise对象

完成异步请求:多个任务同时进行,代码更复杂

let p=new Promise((res,rej)=>
      $.ajax({
        url:'test',
        dataType:'json',
        success(arr){
            res(arr);
        },
        err(err){
            rej(err)
        }
}))
p.then(res=>{alert(res)},rej=>{alert(rej)})
Promise.all([p1,p2]).then(arr=>{let [res1,res2]=arr},err=>{})

7.async和await在干什么

解决异步问题,async返回的是一个promise对象,await在等待一个async函数完成,因为async函数返回的是一个promise对象,await必须出现在async函数内部,不能单独使用,如果await函数等到了一个promise对象,await会阻塞后面的代码

function sleep(second,param){
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res(param)
        },second)
    })
}
async function test(){
    let result1=await sleep(2000,'req01')
    let result2=await sleep(1000,'req02'+result1)
    let result3=await sleep(500,'req03'+result2)
    console.log(`${result3} ${result2} ${result1}`)
}
test()

8.proxy

  • 什么是proxy是es6中提供的一个构造函数,更像一种拦截器,在访问赋值时会先用到我们定义好的拦截方法
  • 什么时候需要Proxy()被代理对象不希望直接被访问,被代理的对象能力不足时找个人帮他,增加新功能
  • Proxy的用法proxy的构造函数中接受两个参数 new Proxy(target,hander)其中target参数是指目标对象(被代理的对象),一个对象,属性一个对象,属性是各种控制和修改target基本方法的行为
const user={name='cz'}
const userProxy=new Proxy(user,{
    get:(obj,prop)=>{
        if(prop==='avatar'){
            if(!obj.prop){
                return 'https://...'
            }
        }
        return obj[prop]
    }
})

9.Generator函数

  • 什么是generator()执行到中间可以停,配合yield函数使用
  • 作用:可以实现带逻辑的异步
function *show(){
    alert('a')
    yield
    alert('b')
}
let genobj=show()
genobj.next()//a
genobj.next()//b

function *show1(){
    alert('a')
    let aa=yield
    alert(aa)
}
let bi=show()
bi.next()//a
bi.next(12)//a 12

yield既可以传参,也可以返回

相关文章

网友评论

      本文标题:ES6入门基础

      本文链接:https://www.haomeiwen.com/subject/kwlptltx.html