ES6语法
let关键字
1.申明变量与赋值
eg:let a = 100
2.特性:不能重复申明
3.作用域(let:块级作用域在代码块里面有效)
4.不影响作用域链
const 关键字
const定义常量(值不发生改变的量)
eg:const name = 'luochaoyue';
1.一定要赋初始值
2.常量的值不能修改
3.块级作用域
4.对于数组和对象元素的修改不算做对常量的修改
解构赋值
ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值
数组解构
eg:
const F4 = ["吴亦凡", "李易峰", "王一博", "陈飞宇"];
let [wu, li, wang, chen] = F4;
console.log(wu, li, wang, chen);
对象解构
eg:
const F4 ={
name: '吴亦凡',
age: '30',
music: function () {
console.log('大碗宽面');
}
};
let {name, age, music} = F4;
console.log(name);
console.log(age);
console.log(music);
music();
模板字符串
eg:
let str `我是一个字符串`
1.内容中可以直接出现换行符
2.字符串拼接
eg:
let iode = `肖战`;
let msfg = `${iode}是我的偶像`
console.log(msfg);
3.
简化对象写法
let name = '蔡徐坤'
let change = function() {
console.log('唱跳, RAP 篮球')
}
const ideo = {
name,
change,
imporve() {
console.log('我们一起打篮球');
}
}
console.log(name, change);
箭头函数
#eg:
let sun = (a,b)=> {
return a + b;
}
let result = fn(1,2)
console.log(result);
1.this是静态的(this始终指向函数声明时所在作用域下this的值)
eg:
let getname = function () {
console.log(this.name);
};
let getname2 = () => {
console.log(this.name);
}
window.name = '罗超越';
const school = {
name: '洛昊哲'
}
getname.call(school);
getname2.call(school);
2.不能作为构造函数实例化对象
eg:
let person = (name, age) => {
this.name = name;
this.age = age;
}
let me = new person('xaio',30);
console.log(me)
3.不能使用arguments变量
4.箭头函数适合于this无关的回调 如定时器,数组的方法回调
不适合与this有关的回调如 点击事件回调 对象的方法
允许给函数参数赋值初始值
let sun = (a = 1,b = 2) =>{
return a + b;
}
let result = sun();
console.log(result);
rest参数
ES6 引入rest参数用函数的实参,用来代替argumnet
function date() {
console.log(arguments);
}
date('zhangbaizhi', 'lingzujxian', 'zhanaas');
function date(...args){
console.log(args);
}
date('冰冰','白芷','傲娇');
注意: rest参数必须放到参数的最后
扩展运算符
[...]
const colors = ['red', 'blue', 'black', 'pink'];
const andomon = ['你的名字', '天气之子', '千与千寻', '龙猫'];
const hebin =colors.concat(andomon);
console.log(hebin);
const hebins = [...colors, ...andomon];
console.log('hebins');
const an = [...andomon];
console.log(an);
const divs = document.querySelectorAll('div')
console.log(divs);
const divss = [...divs];
console.log(divss);
symbol
ES6引入的一种新的原始数据类型 表示独一无二的值
创建
let s1 = Symbol();
1.值是唯一的---用来解决命名冲突的问题
2.值不能与其他数据进行运算
3.定义的对象属性不能用for....in遍历循环但可以使用Reflect.ownKEys
来获取对象的所用键名
let s1 = Symbol();
console.log(s1, typeof s1);
let s2 = Symbol('罗超越');
let s3 = Symbol('罗超越');
console.log(s2 === s3);
let s4 = Symbol.for('罗超越')
let s5 = Symbol.for('罗超越')
console.log(s4 === s5);
4.使用(向对象添加属性和方法)
eg:
let youxi = {
name: '狼人杀',
[Symbol('say')]: function () {
console.log('我可以说话');
},
[Symbol('zibao')]: function() {
console.log('我可以自爆');
}
}
console.log(youxi);
5.Symbol内置值
class person{
satatic[Symbol.hasInstance(){
console.log('我被用来检测类型了')];2
}
数据类型(记忆)
USONB you are so niubility
U undefined
S string Symbol
O object
N number
B boolean
迭代器
(Iterator)是一种接口,为不同的数据结构提供统一的访问机制
任何数据结构只要部署iterator接口(对象里面的一个属性),就可以完成遍历操作
1.新的遍历命令 for ...of 循环
原生具备iterator接口的数据可使用for....of(遍历)
Array
Arguments
Set
Map
String
TypedArray
NodeLIst
自定义遍历数据
生成器
function getUser() {
setTimeout(()=> {
let data = '用户数据';
iterator.next(data);
} ,1000);
}
function getOrder() {
setTimeout(() => {
let data = '订单数据';
iterator.next(data);
}, 1000);
}
function getGoods() {
setTimeout(() => {
let data = '商品数据';
iterator.next(data);
}, 1000);
}
function * gen () {
let user = yield getUser();
console.log(user);
let order = yield getOrder();
console.log(order);
let goos = yield getGoods()
console.log(goos);
}
let iterator = gen();
iterator.next();
Promise
Promise是ES6引入的异步编程的新解决方案
语法上它是一个构造函数
用来封装异步操作并可以获取其成功或失败的结果
eg:
let myPromise = new Promise(function(myResolve, myReject) {
setTimeout(() => {
let data = '数据库中的用户数据';
myResolve(data);
}, 1000);
setTimeout(() => {
let err = '数据出错了';
myReject(err);
},1000);
});
myPromise.then(
function(value) { console.log(value);},
function(error) { console.log(error);}
);
2.读取文件
eg:
const fs = require('fs');
fs.readFile('./resuorces/suiji.md',(err,data) => {
if(err) throw err;
console.log(data.toString());
});
使用Promise封装AJAX请求
const p = new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", 'https://api.apiopen/getJoke');
xhr.send();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if(xhr.status >= 200 && xhr.status > 300){
resolve(xhr.response);
}else{
reject(xhr.status);
}
}
}
});
p.then(function(value){
console.log(value);
},function(reason){
console.error(reason);
});
Promise.prototype.then方法
const P = new Promise ((resolve, reject) => {
setTimeout(() => {
resolve('成功的数据');
},1000);
setTimeout(() => {
reject('失败的数据');
},2000)
});
p.then(value => {
}).then(value => {
});
console.log(result);
promise 链式调用
const p = new Promise((resolve, reject) => {
fs.readFile("./resuorces/剑来.md", (err, data) => {
resolve(data);
});
});
p.then(value => {
return new Promise((resolve,reject) => {
fs.readFile("./resuorces/大奉打更人.md", (err,data) => {
resolve([value, data]);
});
});
}).then(value => {
return new Promise((resolve,reject) => {
fs.readFile("./resuorces/烽火戏诸侯.md",(err,data) => {
value.push(data);
resolve(value);
})
});
}).then(value => {
console.log(value.join('\r\n'));
})
promise catch() 方法
const p = new Promise((resolve, reject) => {
setTimeout(() => {
reject('出错啦!!!');
}, 1000);
});
p.then(value => {
}, reason => {
console.error(reason);
});
p.catch(function(reason){
console.warn(reason);
})
Set 数据结构
set(集合)它类似于数组,但成员的值都是唯一的
实现了iteration 可使用扩展运算符[...] 和 for of 遍历
1.size 返回结合的元素个数
2.add 增加一个新元素 返回当前集合
3.delete 删除元素 返回boolean值
4.has 检测集合中是否包含某个元素 返回boolean值
5.clear 清空内容
eg:
<!-- 声明一个Set() -->
<script>
let s = new Set();
let s2 = new Set(["秀倩", "杨千幻", "秀新年", "秀倩"]);
s2.add('威亞是你');
s2.delete('秀倩');
console.log(s, typeof s);
console.log(s2);
console.log(s2.size);
console.log(s2.has('秀新年'));
for(let v of s2){
console.log(v);
}
s2.clear();
console.log(s2);
Set实践
let arr = [12,34,1,4123,523,65,34,1,34,523];
let s = [...new Set(arr)];
console.log(s);
let arr2 = [12, 34, 1, 423,542356346,];
let result = [...new Set(arr)].filter(item => {
let s2 = new Set(arr2);
if (s2.has(item)) {
return true;
}else{
return false;
}
});
console.log(result);
let union = [...new Set([...arr, ...arr2])];
console.log(union);
let diff = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)));
console.log(diff);
Map
Map数据结构类似于对象 也是键值对的集合。
iterator 接口 所以可以使用 [...] 拓展运算符 和 [for...of...]进行遍历
size:返回元素个数
set 添加一个新元素 返回当前的Map
get 返回键名对象的键值
has 检测Map中是否包含某个元素 放回boolean值
clear 清空集合 返回undifing
eg:
let m = new Map();
m.set('name','罗超越');
m.set('change', function() {
console.log('五毛恶意该比啊');
});
let key = {
school: '合肥八中'
};
m.set(key,['北','南','东','西']);
console.log(m.size);
m.delete('key');
console.log(m.get(key));
m.clear();
for(let v of m) {
console.log(v);
}
console.log(m);
class
class Phone {
constructor(brand ,price){
this.brand = brand;
this.price = price;
}
call() {
console.log("我可以电话");
}
}
let onePlus = new Phone("1+", 1999);
console.log(onePlus);
class静态成员
class Phone {
static name = '手机';
static change () {
console.log("我可以改变世界");
}
}
let noKia = new Phone ();
console.log(noKia.name);
console.log(Phone.name);
类继承
class Phone {
constructor(brand, price) {
this.brand = brand;
this.price = price;
}
call (){
console.log("我可以打电话");
}
}
class SmartPone extends Phone{
constructor (brand, price, color, size) {
super(brand, price);
this.color = color;
this.size = size;
}
photo () {
console.log('拍照');
}
playGame () {
console.log('玩游戏');
}
call() {
console.log("我可以进行视频通话");
}
}
const xiaomi = new SmartPone('小米', 3999, '红色', '5.51ncr');
console.log(xiaomi.call());
console.log(xiaomi);
class 里面的get和set
class Phone {
get price () {
console.log("价格属性被读取了");
return 'i love you';
}
set price(NewVal) {
console.log("价格属性被修改了");
}
}
let s = new Phone();
s.price = 'free';
数值拓展
console.log(Number.isNaN(123));
console.log(Number.parseInt('52143252love'));
console.log(Number.parseFloat('3.1415926你好'));
console.log(Number.isInteger(5));
console.log(Number.isInteger(5.5));
console.log(Math.trunc(34234.5345345));
console.log(Math.sign(0));
对象方法扩展
const config1 = {
host: 'localhost',
port: 8080,
name: 'root',
pass: 'root'
};
const config2 = {
host: 'http://luohaozhe',
port: 3030,
name: 'luo hao zhe',
pass: 'luo@123'
}
console.log(Object.assign(config1, config2));
const school = {
name: '蔡徐坤'
}
const cities = {
xiaoqu: ['北京', '上海', '深圳']
}
Object.setPrototypeOf(school, cities);
console.log(Object.getPrototypeOf(school));
console.log(school);
模块化
优势:
1.防止命名冲突
2.代码复用
3.高维护性
暴露汇总
1,分别暴露
export let job = '前端开发工程师';
2.统一暴露
let job = '前端开发工程师';
function jobs () {
console.log("我们可以帮你找到好工作");
}
export {job, jobs};
3.默认暴露
export default {
job: '前端开发工程师',
Change: function () {
console.log('我们可以帮助你');
}
}
引入汇总
import m3 from './模块化.js';
console.log(m3);
ES7新特性 includes ** 幂运算
includes 方法判读数组是否存在对应值 返回布尔值
eg:
const idor = ["蔡徐坤","王一博","肖战","陈飞宇","李易峰"];
console.log(idor.includes('王一博'));
console.log(idor.includes('吴亦凡'));
** 幂运算
console.log(2 ** 10);
ES8 新特性
async
async function fn() {
return '蔡徐坤';
return;
throw new Error('出错了!!');
return new Promise((resolve, reject) => {
resolve('成功的回调');
reject('失败的回调');
});
}
const result = fn();
console.log(result);
result.then(value => {
console.log(value);
},
reason => {
console.log(reason);
});
await
1.await 必须写在async函数中
2.wait右侧的表达式一般为Promise对象
3.await 返回的是Promise成功的值
4.await 的Promise失败了就会抛出异常
eg:
const p = new Promise((resolve, reject) => {
reject('失败');
})
async function main () {
try {
let result = await p;
console.log(result);
}catch(e){
console.log(e);
}
}
main();
async和await结合读取文件案例
const fs = require("fs");
function readDgr() {
return new Promise((resolve, reject) => {
fs.readFile("./resuorces/大奉打更人.md", (err, data) => {
if (err) reject(err);
resolve(data);
});
});
}
function readJl() {
return new Promise((resolve, reject) => {
fs.readFile("./resuorces/剑来.md", (err, data) => {
if (err) reject(err);
resolve(data);
});
});
}
function readsuiji() {
return new Promise((resolve, reject) => {
fs.readFile("./resuorces/suiji.md", (err, data) => {
if (err) reject(err);
resolve(data);
});
});
}
async function main() {
let Dag = await readDgr();
let JL = await readJl();
let Sui = await readsuiji();
console.log(Dag.toString());
console.log(JL.toString());
console.log(Sui.toString());
}
main();
async+await发送Ajax请求
function sendAjax() {
return new Promise((resolve, reject) => {
const x = new XMLHttpRequest();
x.open("GET", "https://imgapi.cn/api.php?zd=zsy&fl=&gs=json");
x.send();
x.onreadystatechange = function () {
if (x.readyState === 4) {
if (x.status >= 200 && x.status < 300) {
resolve(x.response);
} else {
reject(x.status);
}
}
};
});
}
async function main() {
try{
let result = await sendAJAX();
console.log(result);
}catch(e){
console.log(e);
}
}
main();
ES8对象方法拓展
const school = {
name: "合肥八中",
city: ["北京", "上海", "广州", "深圳"],
xueke: ["前端", "java", "大数据", "运维"],
};
1.获取对象所有的键
console.log(Object.keys(school));
2.获取所有的值
console.log(Object.values(school));
3.entries返回一个数据 每一个成员都是一个数组
const m = new Map(Object.entries(school));
console.log(m);
4.对象属性的描述对象 getOwnPropertyDescriptors
consol
ES9新特性
function connect ({host, port, ...user}) {
console.log(host);
console.log(port);
console.log(user);
}
connect({
host: '127.0.0.1',
port: 8080,
username: 'admin',
password: 'admin',
type: 'admin'
});
const s = {
q: '铁砂掌'
}
const w = {
w: '金钟罩'
}
const e = {
e: '铁布衫'
}
const r = {
r: '双节棍'
}
let mabaoguo = {...s, ...w, ...e, ...r};
console.log(mabaoguo);
ES9正则拓展
1.正则命名分组
let str = '<a href="http://www.baidu.com">百度</a>';
const reg = /<a href="(?<url>.*)">(?<text>.*)<\/a>/;
const result = reg.exec(str);
console.log(result);
2.反向断言
动态import
btn.onclick = function () {
import('模块文件地址').then(module => {
module.函数名();
})
}
globalThis
始终指向全局对象