ES6语法及知识点梳理

变量与常量声明

let

ES6引入了let关键字,该关键字允许无法提升或重新声明的块范围变量(块儿级作用域)。

//变量提升---------------------
console.log(a);     //undefined
var a = 1;
console.log(a);    // 1

//重新声明---------------------
let x = 0;
x = 1;
console.log(x)    // 1

//块儿级作用域------------------
if(true){
	var a = 1;
}
console.log(a)  // 1

if(true){
	let a = 1;
}
console.log(a) // 报错:a未定义

const

ES6引入了const关键字,该关键字不能重新声明或重新分配,但不是不变的。

const b = 0;
b = 1; //重新赋值会报错

const b = {};
b.name = "foo"; //b所指向的内存地址没变
console.log(b) //  { name: "foo" }

解构

数组的解构

const arr = [1,2,3];
const [,,c] = arr;
console.log(c) //3

const [a,...bc] = arr;
console.log(bc) // [2,3]

const [x] = arr;
console.log(x) // 1

const [a,b,c,d = 4] = arr;
console.log(d) // 4

对象的解构

使用大括号将对象的属性分配给它们自己的变量。

//对象匹配
let obj = { a: 1, b: 2, c: 3 }
let { a, b, c } = obj
console.log(a,b,c) // 1,2,3

const obj = {name:"tom",age:22};
const name = "yami";
//const { name } = obj; //冲突
const { name: objName = "zhangsan"} = obj; //解决name冲突并赋初始值
console.log(objName) //tom

模板字符串

串联、字符串插值

表达式可以嵌入模板文字字符串中。

const date = "2020-10-20";
let str = `Release Date: ${date},${1 + 2}`;
console.log(str); // Release Date: 2020-10-20,3

多行字符串

使用模板文字语法,JavaScript字符串可以跨越多行而无需串联。

let str = `This text
            is on
            multiple lines`

带标签的模板字符串

使用模板文字语法,JavaScript字符串可以跨越多行而无需串联。

const name = "tom";
const gener = true;
function myTagFun(str,name,gener){
 const sex = gener ? "men" : "women";
 return str[0]+name+str[1]+sex+str[2];
}
const result = myTagFun`hi,${name} is a ${gener}.`;
console.log(result);

字符串的扩展方法

includes

const msg = "this is message";
console.log(msg.includes("is")) //true

startsWith

const msg = "this is message";
console.log(msg.startsWith("this")) //true

endsWith

const msg = "this is message";
console.log(msg.endsWith("message")) //true

参数默认值

可以使用默认参数初始化函数,仅当未通过函数调用参数时才使用默认参数。

function foo(a,b = 2){ 
console.log(a+b); //3
}
foo(1);

剩余参数

function foo(...args){ //args只能在左后且只能使用一次
console.log(args) //[1,2,3,4]
}
foo(1,2,3,4)

展开数组

const arr = ["a","b","c"];
console.log(arr[0],arr[1],arr[2]); // a b c
console.log.apply(console,arr);  // a b c
console.log(...arr); //展开数组方式 a b c

箭头功能

箭头函数

箭头函数表达式语法是创建函数表达式的一种较短方法。Arrow函数没有自己的函数this,没有原型,不能用于构造函数,也不应用作对象方法。

const func = (a, b, c) => {
console.log("result:")
return a+b+c;
}
console.log(func(1,2,3)); // 6

隐式收益

return如果使用不带块体的箭头功能,则暗指该关键字,可以将其省略。

let func = (a, b, c) => a + b + c;

箭头函数与this

箭头函数不会改变this的指向,他始终指向当前作用域。

const person = {
	name:"tom",
	say:function(){
	setTimeout(() => {
	console.log(this.name);
	},1000);
  }
};
console.log(person.say());

方法定义速记与字面量增强

function可分配一个对象的方法时,可以省略关键字。

let obj = {
  a(c, d) {
	console.log(c+d); //3
  },
  [1+2]: 3,
}
obj.a(1,2);
console.log(obj); // { 3: 3, a: a(c, d) }

对象扩展方法

assign

function func(obj){
const funcObj = Object.assign({},obj);
funcObj.name = "bbb";
console.log(funcObj);
}
const obj = {name:"aaa"};
func(obj);
console.log(obj);
//{ name: "bbb" }
//{ name: "aaa" }

is

console.log(NaN === NaN); //fasle
console.log(+0 === -0); //true
console.log(Object.is(NaN,NaN)); //false
console.log(Object.is(+0,-0)); //false

代理对象

Proxy

Proxy对比defineProperty

在这里插入图片描述

console.log(NaN === NaN); //fasle
console.log(+0 === -0); //true
console.log(Object.is(NaN,NaN)); //false
console.log(Object.is(+0,-0)); //false

数组迭代(循环)

为通过数组和其他可迭代对象进行迭代,引入了更简洁的语法。

let arr = ['a', 'b', 'c']
for (let i of arr) {
  console.log(i)
}

传播语法

传播语法可用于扩展数组。

let arr1 = [1, 2, 3]
let arr2 = ['a', 'b', 'c']
let arr3 = [...arr1, ...arr2]

console.log(arr3) // [1, 2, 3, "a", "b", "c"]

扩展语法可用于函数参数。

let arr1 = [1, 2, 3]
let func = (a, b, c) => a + b + c

console.log(func(...arr1)) // 6

类/构造函数

ES6 class在基于原型的构造函数之上引入了语法。

class Func {
  constructor(a, b) {
    this.a = a
    this.b = b
  }

  getSum() {
    return this.a + this.b
  }
}

let x = new Func(3, 4)

x.getSum() // returns 7

遗产

该extends关键字创建一个子类。

class Func {
  constructor(a, b) {
    this.a = a
    this.b = b
  }

  getSum() {
    return this.a + this.b
  }
}
class Inheritance extends Func {
  constructor(a, b, c) {
    super(a, b)

    this.c = c
  }

  getProduct() {
    return this.a * this.b * this.c
  }
}

let y = new Inheritance(3, 4, 5)

y.getProduct() // 60

模块导出导入

可以创建模块以在文件之间导出和导入代码。

export.js

let func = a => a + a
let obj = {}
let x = 0

export { func, obj, x }

import.js

import { func, obj, x } from './export.js'

console.log(func(3), obj, x)

承诺/回调

承诺表示异步功能的完成。它们可以用作链接功能的替代方法。

let doSecond = () => {
  console.log('Do second.')
}

let doFirst = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('Do first.')

    resolve()
  }, 500)
})

doFirst.then(doSecond)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值