ES6新增语法(复习)

ES6新增语法(复习)

1.const声明常量以及特点

  1. 一定要赋初始值

    • const A;
  2. 一般常量使用大写(潜规则)

    • const a = 100;
  3. 常量的值不能修改

    • SCHOOL = ‘ATGUIGU’
  4. 块级作用域

    • {

      ​ const PLAYER = ‘UZI’;

      }

      console.log(PLAYER);

  5. 对于数组和对象的元素修改,不算做对常量的修改,不会报错

    • const TEAM = [‘UZI’,‘MLXG’,‘Ming’,‘Letme’];
    • TEAM.push(‘Meiko’);

2.ES6-变量的解构赋值

  • ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值

2.1-数组的结构

const  F4 = ['小沈阳','刘能','赵四','宋小宝'];
let [xiao,liu,zhao,song] = F4;
打印 xiao,liu,zhao,song 分别一一对应

2.2-对象的解构

const zhao = {
	name:'赵本山',
	age:'不详',
	xiaopin:function(){
		console.log("我可以演小品"),
	}
};
let {name,age,xiaopin} = zhao;
	console.log(name),
	console.log(age),
	console.log(xiaopin),
        
let {xiaopin} = zhao;
xiaopin();

3.ES6-模板字符串

3.1 声明

let str = `我是一个字符串哦`;
console.log(str,typeof str);

3.2 内容中可以直接出现换行符

let str = '<ul>
			<li>沈腾</li>
			<li>玛丽</li>
			<li>魏翔</li>
			</ul>'
// 以上报错,不能在单引号中出现换行

let str = `<ul>
			<li>沈腾</li>
			<li>玛丽</li>
			<li>魏翔</li>
			</ul>`

3.3 变量拼接

let lovest = '魏翔';
// let out = 'xxx是我心目中最搞笑的演员'
let out = `${lovest}是我心目中最搞笑的演员`

4.ES6-对象的简化写法

ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法

let name = '尚硅谷';
let change = function(){
	console.log('我们可以改变你!');
}

const school = {
	name.
	change,
	// improve function(){
	//	console.log('');
	// }
	improve(){
		console.log('我们可以提高你的技能!');
	}
	// 省略function()
}

5.ES6-箭头函数以及声明特点

ES6允许使用[箭头]=>定义函数

// let fn = function(){
// }

let fn = (a,b) => {
	return a + b;
}
// 调用函数
let result = fn(1,2);
console.log('result');

5.1 this是静态的

  • this始终指向函数声明时所在作用域下的this的值
function getName(){
	console.log('this.name');
}
let getName2 =() => {
	console.log('this.name');
}

// 设置window对象的name属性
window.name = '尚硅谷';
const school ={
	name:"ATGUIGU"
}

// 直接调用
getName()
getName2()

// call 方法调用
getName.call(school); --> ATGUIGU
getName2.call(school); --> 尚硅谷

5.2 不能作为构造实例化对象

let Person = (name,age) => {
	this.name = name;
	this.age = age;
}
let me = new Person('xiao',30);
console.log(me); --> Person is not a constructor

5.3 不能使用arguments变量

let fn = () => {
	console.log(arguments);
}
fn(1,2,3) --> arguments is not defined

5.4 箭头函数的简写

// 1.省略小括号,当形参有且仅有一个的时候
let add = (n) => { --> let add = n => {
	retutn n + n;
}
console.log(add(9));
                  
// 2.省略花括号,当代码体只有一条一句的时候,此时return必须省略
//   语句的执行结果就是函数的返回值
let pow = (n) =>{
    return n * n;
}
-->
let pow n => n * n;
console.log(pow(9));

箭头函数的实例使用

箭头函数的实例使用-简化写法

6.ES6-函数参数的默认值设置

6.1形参初始值

  • 具有默认值的参数,一般位置要靠后(潜规则)

    • 如果c的值没有传递,只有一个形参,那么打印的结果就是NaN
  • function add (a,b,c=10){
    	return = a + b + c;
    }
    let result = add(1,2);
    console.log(result) --> 13
    

6.2与解构赋值结合

function connect({host="127.0.0.1",username,password,port}){
	console.log(host),
	// --> atguigu.com 如果 connect有值,就用下面的,如果没有,就用上面的
	console.log(username),
	// --> root
	console.log(password),
	// --> root
	console.log(port),
	// --> 3306
}
connect({
	host:'atguigu.com',
	username:'root',
	password:'root',
	port:3306
})

7.rest参数

7.1 rest参数

function date(...args){
	console.log(args); 		// --> 可以使用数组方法 filter some every map
}
date('Xiaohu','Ming','Cryin')

7.2 rest参数必须要放到参数最后

function fn(a,b,...args){
	console.log(a)
	// --> 1
	console.log(b)
	// --> 2
	console.log(args)
	// --> [3,4,5,6]
}
fn(1,2,3,4,5,6)

8.拓展运算符

8.1介绍

[…]扩展运算符能将[数组]转换为逗号分隔的[参数序列]

声明一个数组…

const tfboys = ['易烊千玺','王源','王俊凯'];
// => '易烊千玺','王源','王俊凯'

声明一个函数

function chunwan(){
	console.log(arguments);
}
chunwan(...tfboys);	
// chunwan('易烊千玺','王源','王俊凯')

8.2应用

1.数组的合并

const kuaizi = ['王太利','肖央'];
const fenghuang = ['曾毅','玲花'];
// const zuixuanxiaopingguo = kuaizi.concat(fenghuang); --> ES5
const zuixunxiaopingguo = [...kuaizi,...fenghuang];
console.log(zuixunxiaopingguo)

2.数组的克隆

const sanzhihua = ['E','G','M'];
const sanyecao = [...sanzhihua];	// ['E','G','M']
const.log(sanyecao);

3.将伪数组转为真正的数组

const divs = document.querySelectorAll('div');
const divArr = [...divs];
console.log(divArr);	// arguments

9.Symbol

9.1-Symbol基本使用

创建对象属性

10.迭代器

是一种接口,为各种不同的数据结构提供统一的访问机制

10.1-自定义遍历数据

迭代器的工作原理

//声明一个对象
const YM = {
	name:"YM",
	stus:[
		'xiaoming',
		'ning',
		'tian',
		'knight'
	],
    [Symbol.iterator](){
        // 索引变量
        let index = 0;
        
        let _this = this;
        return {
            next:function(){
                if(index < _this.stus.length){
                    return{value:_this.stus[index],done:false};
                 //下标自增
                    index++
                 //返回结果
                    return result;
                }else{
                    return{value:undefined,done:true};
                }
            }
        };
    }
}

//遍历这个对象
for(let v of YM){
    console.log(v);
    // --> YM is not iterable (YM这个不能迭代)
}

11.生成器

生成器其实就是一个特殊的函数

异步编程 --> 纯回调函数

function * gen(){
	console.log("hello generator")
}

let iterator = gen();
iterator.next();

通过next控制向下遍历的内容

11.1-生成器函数参数

function * gen(arg){
	console.log(arg);
	let one = yield 111;
	console.log(one);
	let two = yield 222;
	console.log(two);
    let two = yield 333;
	console.log(three);
}

//执行器获取迭代器对象
let iterator = gen('AAA');
console.log(iterator.next());
//next方法可以传入实参
console.log(iterator.next('BBB'));
console.log(iterator.next('CCC'));
console.log(iterator.next('DDD'));

生成器函数参数

11.2-实例一

  • 1s后控制台输出111 2s后输出222 3s后输出333
function one(){
	setTimeout(() => {
		console.log(111);
        iterator.next();
	},1000)
}
function two(){
	setTimeout(() => {
		console.log(222);
        iterator.next();
	},2000)
}
function three(){
	setTimeout(() => {
		console.log(333);
        iterator.next();
	},3000)
}

function * gen(){
    yield one();
    yield two();
    yield three();
}

生成器函数实例1

11.3-实例二

  • 模拟获取 用户数据 订单数据 商品数据
function getUsers(){
	setTimeout(() => {
		let data = '用户数据';
        // 调用next方法,并且将数据传入
        iterator.next(data);
	},1000)
}

function getOrders(){
	setTimeout(() => {
		let data = '订单数据';
        iterator.next(data);
	},1000)
}

function getGoods(){
	setTimeout(() => {
		let data = '商品数据';
        iterator.next(data);
	},1000)
}

function * gen(){
	let users =	yield getUsers();
    let orders = yield getOrders();
    let goods yield getGoods();
}

// 调用生成器函数
let iterator = gen();
iterator.next();

–> 每个数据间隔一秒 打印出 用户数据 订单数据 商品数据

12.Pormise

Promise是ES6引入的异步编程的解决方案

语法上Promise是一个构造函数,用来封装异步操作并获取成功/失败的结果

// 实例化Promise对象
const p = new Promise(function(resolve,reject){
	setTimesout(function)(){
        let data = '数据库中的用户数据';
        resolve(data);	--> 成功

        let err = '数据读取失败';
        reject(err);	--> 失败
    },1000);
});

// 调用promise对象的then方法
p.then(function(value){
	console.log(value);
},function(reason){
	console.error(reason);
})
	

12.1-Promise读取文件

const p = new Promise(function(resolve,reject){
	fs.readFile("././路径文件.xx",(err,data) => {
		// 如果失败
        if(err) reject(err);
      	// 如果成功
        resolve(data);
	})
})

p.then(function(value){
	console.log(value.toString());
},function(reason){
	console.log("读取失败!");
})

12.2-Promise封装AJAX

// 1.创建对象
const shr = new XMLHttpRequest();

const p = new Promise((resolve,reject) => {
    
    // 2.初始化
    xhr.open("GET""https://api.apiopen.top/getJoke");

    // 3.发送
    xhr.send();

    // 4.绑定事件,处理相应结果
    xhr.onreadystatechange = function(){
        // 判断
        if(xhr.readyState === 4){
            // 判断响应状态码 200-299
            if(xhr.status >= 200 && xhr.status < 300){
                // 表示成功
                resolve(xhr.response);
            }else{
                // 如果失败
                reject(xhr.response);
            }
        }
    }
})

// 指定回调
p.then(function(value){
    console.log(value);
},function(reason){
    console.error(reason);
})

13.set

let arr = [1,2,3,4,5,6,7,8,9,8,7,6,5,4,3];

  • 数组去重

  • let result = [...new Set(arr)];
    console.log(result);
    
  • 交集

  • let arr2 = [4,5,6,8,9];
    let result = [...new Set(arr)].filter(item => {
    	let s2 = new Set(arr2);
    	if(s2.has(item)){
    		return true;
    	}else{
    		return false;
    	}
    });
    let result = [...new Set(arr)].filter(item => new Set(arr2).has(item));
    console.log(result);
    
  • 并集

  • let arr2 = [4,5,6,8,9];
    let union = [new Set([...arr, ...arr2])];
    console.log(union)
    
  • 差集

  • let result = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)));
    

14.Map

<script>
        //声明 Map
        let m = new Map();

        //添加元素
        m.set('name', '尚硅谷');
        m.set('change', function () {
            console.log("我们可以改变你!!");
        });
        let key = {
            school: 'ATGUIGU'
        };
        m.set(key, ['北京', '上海', '深圳']);

        //size
        console.log(m.size);

        //删除
        m.delete('name');

        //获取
        console.log(m.get('change'));
        console.log(m.get(key));

        //清空
        m.clear();

        //遍历
        for (let v of m) {
            console.log(v);
        }

        console.log(m);

</script>

ES8新特性(复习)

1.async函数

  • async函数的返回值为promise对象,
  • promise对象的结果由async函数执行的返回值决定
async function fn(){
	// 返回一个字符串
	return '尚硅谷';
	// 返回的结果不是一个Promise类型的对象,返回的结果就是成功的Promise对象
	// return;
	// 抛出错误,返回的结果是一个失败的Promise
	throw new Error('出错啦!');
	// 返回的结果如果是一个Promise对象
	return new Promise(resolve,reject) => {
		// resolve('成功的数据');
		reject('失败的数据');
	}
}
// 返回的结果是一个Promise类型的对象,返回的状态由函数中的return决定
const result = fn();
console.log(result)

2.await表达式

  • await必须写在async函数中
  • await右侧表达式一般为promise对象
  • await返回的是promise成功的值
  • await的promise失败了,就会抛出一场,用try…catch…来捕获失败
// 创建 promise对象
const P = new Promise(resolve,reject) => {
	resolve("成功的值");
}

async function main(){
	let result = await P;
	//
	console.log(result);
}
main();

2.1 async和await结合

// 引入fs模块
const fs = require("fs");

// 读取...
function readWeiXue(){
	return new Promise((resolve,reject) => {
		fs.readFile("././路径文件.xx",(err,data) => {
			// 如果失败
			if(err) reject(err);
			// 如果成功
			resolve(data)
		})
	})
}

// 声明一个async函数
async function main(){
	// 获取xx内容
	let weixue = await readWeiXue();
    console.log(weixue.toString());
}

main();

2.2 async与await封装Ajax请求

// 发送Ajax请求,返回的结果是Promise对象
function sendAJAX(url){
	return new Promise((resolve,reject) => {
            // 1.创建对象
            const x = new XMLHttpRequest();
            // 2.初始化
            x.open('GET',url);
            // 3.发送
            x.send();
            // 4.事件绑定
            x.onreadystatechange = function(){
               if(x.readyState === 4){
                   if(x.status >= 200 && x.status <300){
                        // 成功
                        resolve(x.response);
                    }else{
                        // 失败
                        reject(x.status);
               }
          	}
      	}
    })
}

// promise then方法的测试
sendAJAX("https://接口地址").then(value => {
    console.log(value);
},reason =>{})

// async 与 await测试
async function main(){
    // 发送Ajax请求
    let result = await sendAJAX("https://接口地址");
    console.log(result);
}

3.ES8对象方法的拓展

 //声明对象
        const school = {
            name:"尚硅谷",
            cities:['北京','上海','深圳'],
            xueke: ['前端','Java','大数据','运维']
        };

        // 获取对象所有的键
        console.log(Object.keys(school));
        // 获取对象所有的值
        console.log(Object.values(school));
        entries
        console.log(Object.entries(school));
        // 创建 Map
        const m = new Map(Object.entries(school));
        console.log(m.get('cities'));

        // 对象属性的描述对象
        console.log(Object.getOwnPropertyDescriptors(school));

        const obj = Object.create(null, {
            name: {
                //设置值
                value: '尚硅谷',
                //属性特性
                writable: true,
                configurable: true,
                enumerable: true
            } 
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值