Es6常见基础

95 阅读1分钟

var、let和const

1、var可声明前置

a = 3
var a
var a = 4

2、let不可声明前置

a = 3 //报错
let a

3、let不可重复声明

let a = 3
let a = 4 // 报错,重复声明

4、存在块级作用域

for(let i = 0; i < 3; i++){
    console.log(i)
}
console.log(i) // 报错

IIFE的替换

(function (){
    var a = 1
}())
{
    let a = 1;
}

暂时性死区(TDZ):在let声明变量之前都是该变量的死区,在死区内该变量不可使用

5、const声明的常量不可改变

const a = 1;
​
a = 2 // 报错const obj = {a:1}
obj.a = 2 // 没问题
obj = {a:2} // 报错
// 原因是如果const观察有没有变化,基本类型看值,对象看地址

解构赋值

数组的解构

let [a,b,c] = [1,2,3]
console.log(a,b,c)
​
let [a,[b],c] = [2,[3],4]
a // 2
b // 3
c // 4let [a] = 1 // 报错,左右要一一对应

默认值

let [a,b = 2] = [3]
a // 3
b // 2 未赋值,使用默认值let [a,b = 2] = [3,4]
a // 3
b // 4 有赋值,使用赋值的值let [a,b = 2] = [null,undefined]
a // null
b // 2
// 只有当值是undefined的时候才会使用默认值,如果值不是就使用设置的值let [a=1,b=a] = [2]
a // 2
b // 2

对象的解构赋值

前置知识

let [name,age] = ['hunger',3]
let p1 = {name,age}
// 等同于
let p1 = {name:name,age:age}

解构示例

let {name,age} = {name:'lalala',age:3}
name // 'lalala'
age // 3

以上代码等同于

let name
let age
({name:name,age:age} = {name:'lalala',age:3})

默认值

let {x,y=5} = {x:1}
x // 1
y // 5

函数解构赋值

function add ([x=1,y=2]){
   return x+y
}
add() // 报错,必须要传一个参数
add([2]) // 4
add([3,4]) // 7// 上下两个函数等价function add ([x,y]=[1,2]){
   return x+y
}
add() // 3
add([2]) // 报错,不能传入只有一个值得数组,必须是待遇大于等于参数得个数
add([3,4]) // 7function sum({x,y}={x:0,y:0},{a=1,b=2}){
    return [x+a,y+b]
}
sum ([{x:1,y:2},{a:2}) // [3,3]
{x,y}={x:0,y:0} // 这种没有传8就用默认值
{a=1,b=2} // 这种是必须要传入一个对象
      
​

作用

let [x.y] = [1,2];
[x.y] = [y,x];
x // 2
y // 1
function ajax({url,type='GET'}){
​
}
ajax({url:'http://localhost:3000/getData'})

字符串、函数、数组、对象

字符串

1、多行字符串

`
这里是
多行
字符串
`

2、模板字符串

let a = 14
let b = 15
`
a的值是${a}
b的值是${b}
`

数组

扩展

var a = [1,2]
console.log(...a)
var b = [...a,3]
b // [1,2,3]var c = b.concat([4,5])
var d = [...b,4,5]
c // [1,2,3,4,5]
d // [1,2,3,4,5]

函数参数的扩展

function sort(...arr){
    console.log(arr.sort)
}
​
sort(3,1,5) // [1,3,5]
function max(arr){
    return Math.max(...arr)
}
max([3,4,1]) // 4

类数组对象转换成数组

let ps = document.querySelectorAll('p');
​
// Array.from方法可以将类数组对象变成数组
Array.from(ps).forEach(p=>{
    console.log(p.innerText);
})
​
// 直接使用扩展 
[...ps].forEach(p=>{
    console.log(p.innerText);
})

函数

默认值

function sayHi(name='lalala'){
    console.log(`${name}`)
}
sayHi()
sayHi('hehehe')
function fetch(url,{body=''.method='GET',heander={}}={}){
    console.log(method);
}

两种写法区别

// ex1
function m1({x=0,y=0}={}){
    return [x,y];
}
​
// ex2
function m2({x,y}={x:0,y:0}){
    return [x,y];
}
​
// 函数没有参数时
m1() // [0,0]
m2() // [0,0]// x,y 都有值的时候
m1({x:3,y:8}) // [3,8]
m2({x:3,y:8}) // [3,8]// x有值,y没有值得shihou
m1({x:3}) // [3, 0]
m2({x:3}) // [3, undefined]// x,y都没有值的时候
m1({}) // [0, 0]
m2({}) // [undefined, undefined]m1({z:3}) // [0, 0]
m2({z:3}) // [undefined, undefined]

ex1:调用函数需要帮你传递一个对象,如果你没传对象,就是用默认对象{},默认对象里面都是undefined,所以属性使用初始值

ex2:参数需要的是一个对象,如果没传对象,就是使用默认对象{x:0,y:0}如果传了对象,就使用你传递的对象

箭头函数

var f = v=> v+1
// 等价于
var f = function(v){return v+1}
​
var f = ()=>5
// 等价于
var f = function(){return 5}
​
var sum = (num1,num2)=>num1+num2;
// 等价于
var sum = function(num1,num2){
    return num1+num2;
}
​
var arr = [1,2,3]
var arr2 = arr.map(v=>v*v)
arr2 // [1,4,9]
箭头函数中的this
// es6
function foo(){
    setTimeout(()=>{
        console.log('id',this.id);
    },100);
}
​
// es5
function foo(){
    var _this = this;
    setTimeout(function(){
        console.log('id',this.id);
    },100);
}

对象

var name = 'lalala'
var age = 3
var people = {name,age} // {name:'lalala',age:3}
let app = {
    selector:'#app',
    init(){
    
    },
    bind(){
        
    }
}

模块化

写法一:

// a.js
export var firstName = 'tom';
​
export var lastName = 'jack';
​
export var yaer = 1997;
// b.js
import {firstName,lastName,yaer} from 'a.js'
console.log(firstName)

写法二:

// a.js
var firstName = 'tom';
​
var lastName = 'jack';
​
var yaer = 1997;
​
export {firstName,lastName,yaer}
// b.js
import {firstName,lastName,yaer} from 'a.js'
console.log(firstName)

写法三:

// c.js
export function getName(){}
export function getYear(){}
// d.js
import {getName,getYear} from 'c.js'
getName()

写法四:

// c.js
function getName(){}
function getYear(){}
export {getName,getYear}
// d.js
import {getName,getYear} from 'c.js'
getName()

写法五:

// e.js
export default function (){
    console.log('lalal');
}
import getName from 'e.js'
getName()

类和继承

1、构造函数

class Person {
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    sayHello(){
        console.log(`
        hello,${this.name},i am ${this.age} years old;
        `)
    }
}
​
// 等价于function Person(name,age){
    this.name = name;
    this.age = age;
}
​
function prototype。sayHello = function(){
    console.log(`
        hello,${this.name},i am ${this.age} years old;
    `)
}
​
var p = new Person('lalala',2);

2、静态方法

class EventCenter{
    static fire(){
        return 'fire';
    }
    static on(){
        return 'on';
    }
}
​
// 等价于function EventCenter(){
}
EventCenter.fire = function(){return 'fire';}
EventCenter.on = function(){return 'on';}

3、继承

class Person {
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    sayHello(){
        console.log(`
        hello,${this.name},i am ${this.age} years old;
        `)
    }
}
​
class Student extends Person {
    constructor(name,age,score){
        super(name,age);
        this.score = score;
    }
    sayScore(){
        console.log(`
        my score ${this.score}
        `)
    }
}
​