ES6新特性的用法

为什么要学习ES6?

  1. ES5语言的先天性不足。比如变量提升、内置对象的方法不灵活、模块化实现不完善…
  2. 为了后面vue、尤其是react框架做好了准备
  3. 目前大部分公司的项目都在使用es6

ES6新特性有哪些?

  • let和const命令
  • es6的模板字符串
  • 增强的函数
  • 扩展的字符串、对象、数组功能
  • 结构赋值
  • Symbol
  • Map和Set
  • 迭代器和生成器
  • Promise对象
  • async的用法
  • 类class
  • 模块化实现

1、let和const命令

<script type="text/javascript">
			//1.let声明变量,没有变量提升
			console.log(a);
			let a=10;
			//2.是一个块作用域
			if(1==1){
				var b=10;
			}
			//3.不能重复声明
			let a=3;
			let a=1;
			console.lo(a);
			//const声明常量,一旦被声明,无法修改
			const max=30;
			const max=40;
			consolo.log(max);
			
			const person={
				name:'小花'
			}
			// person.name='alex';
			// person={
			// 	age:20
			// }
			// console.log(person);
			//作用1:for循环是个经典例子
			const arr=[];
			for(var i=0;i<10;i++){
				arr[i]=function(){
					return i;
				}
			}
			console.log(arr[5]());
			//作用2:不会污染全局变量
			let regExp=10;
			console.log(RegExp);
			console.log(window.RegExp);
			//建议:在默认情况下用const,而只有在知道变量值需要被修改的情况使用Let
		</script>

2、es6的模块化

<script>
		//模板字符串:使用tab上面的反引号``,插入变量时使用${变量名}
		const oBOX=document.querySelector('.box');
		// oBOX.innerHTML="<ul><li><p id="+id+">"+name"</p></li></p>"
		let id=1,
		name='小马哥';
		let htmlStr=`<ul>
		<li>
		<p id=${id}>${name}</p>
		</li>
		</ul>`;
		oBOX.innerHTML=htmlStr;
	</script>

3、增强的函数

<script>
			//1.带参数默认值的函数
			//es5的写法
			/*function add(a,b){
				a =a // 10;
				b =b // 20;
				return a+b;
			}
			console.log(add());
			*/
			function add(a=10,b=20){
				return a+b;
			}
			console.log(add());
			
			//2.默认的表达式也可以是一个函数
			function add(a,b=getVal(5)){
				return a+b;
			}
			return getVal(val){
				return val+5;
			}
			console.log(add(10));
		   

4、剩余的参数

<script>
			//es5写法
			/*function pick(obj){
				let result=Object.create(null);
				for(let i=1;i<arguments.length;i++){
					result[arguments[i]]=obj[arguments[i]]
				}
				return result;
			}
			let book={
				title:'es6的教程',
				author:'小花',
				year:2019
			}
			let bookDate pick(book,'author','year');
			console.log(bookDate);
			*/
			//剩余参数:由三个点...和一个紧跟着的具名参数指定...keys
			function pick(obj,...keys){
			console.log(keys);
			let result=Object.create((null));
			for(let i=0;i<keys.length;i++){
						   result[keys[i]]=obj[keys[i]];
			}
			return result;
			}
			let book={
				title:'es6的教程',
				author:'小花',
				year:2019
			}
			let bookDate pick(book,'author','year');
			console.log(bookDate);
		</script>

5、扩展运算符、箭头函数

<script>
			//4.扩展运算符
			//剩余运算符:把多个独立的合并到同一个数组中
			//扩展运算符:讲一个数组分割,并且是将各个项作为分离的参数传给函数
			const maxNum=Math.max(20,30);
			const.log(maxNum);
			//处理数组中的最大值使用apply
			const arr=[10,20,50,30,90,100,40];
			//console.log(Math.max.apply(null,arr));
			
			//es6扩展运算符更方便
			consle.log(Math.max(...arr));
			
			//ES6的箭头函数
			//使用=>来定义 function(){}等于与()=>{}
			let add=function(a,b){
				return a+b;
			}
			let add=(a,b)=>(a,b)=>{
			return a+b;
			}
			console.log(add(10,20));
			
			let add=(val1,val2)=>val1+val2;
			console.log(add(10,20));
			
			let fn=(function(){
				return function(){
					console.log('hello es6');
				}
			})
			
			let fn=(()=>{
				return()=>{
					console.log('hello es6 2');
				}
			})
		</script>

6、箭头函数this指向

<script>
			/*
			没有this绑定
			es5中this指向:取决于调用该函数的上下文对象
			let PageHandle={
				id:123,
				init:function(){
					document.addEventListener('click',function(event){
				    console.log(this);
					this.doSomeThings(event.type);
					})
				},
				doSomeThings:function(type){
					console.log(`事件类型:${type},当前id:${this.id}`);
				}
			}
		    PageHandle.init();*/
		 
		 let PageHandle={
		 	id:123,
		 	init:function(){
				//箭头函数没有this指向,箭头函数内部this值只能通过查找作用域链来确定
		 		document.addEventListener('click',(event)=>{
		 	    console.log(this);
		 		this.doSomeThings(event.type);
		 		},false)
		 	},
		 	doSomeThings:function(type){
		 		console.log(`事件类型:${type},当前id:${this.id}`);
		 	}
		 }
		 PageHandle.init();
		 
		 //使用箭头函数的注意事项1:使用箭头函数 函数内部没有arguments
		 let getVal=(a,b)=>{
			 console.log(arguments);
			 return a+b;
		 }
		 console.log(getVal(1,3));
		 //2.箭头函数不能使用new关键字来实例化对象
		 let Person=()=>{
		 };
		 function函数也是一个对象,但是箭头函数不是一个对象它其实就是一个语法糖
		 console.log(Person);
		 let p=new Person();
		</script>

7、解构赋值

<script>
			//解构赋值是对赋值运算符的一种扩展
			//它针对数组和对象来进行操作
			//优点:代码书写上简洁易读
			let node={
				type:'iden',
				name:'foo'
			}
			//let type=node.type;
			//let name=node.mode;
			//完全解构
			let{type.name}=node;
			console.log(type,name);
			
			let obj={
				a:{
					name:"张三"
				},
				b:[],
				c:'hello world',
			}
			//不完全解构 可忽略
			// let{a}=obj;
			// console.log(a);
			//剩余运算符
			//let{a,...res}=obj;
			//console.log(res);
			
			//对数组解构
			let arr=[1,2,3];
			let[a,b]=arr;
			console.log(a,b);
			//可嵌套
			let[a,[b]]=[1,[2],3];
		</script>

8、扩展对象的功能

<script>
			//es6直接写入变量和函数,作为对象的属性和方法
			const name='小花',
			age=20;
			const person={
				name,//等价于name:name
				age,
				SayName(){
					console.log(this.name);
				}
			}
			person.SayName();
			function fn(x,y){
				return(x,y);
			}
			console.log(fn(10,20));
			
			let cart={
				wheel:4,
				set(newVal){
					if(newVal<this.wheel){
						throw new Error('轮子数太少了')
					}
					this.wheel=newVal;
				},
				get(){
					return this.wheel;
				}
			}
			cart.set(6);
			console.log(cart.get())
			
			const obj={};
			obj,isShow=true;
			
			const name='a';
			obj[name+'bc']=123;
			console.log(obj);
			
			//对象的方法
			//is() ===
			//比较两个值是否严格相等
			console.log(NaN === NaN);
			console.log(Object.is(NaN,NaN);
			//assign()
			//对象的合并
			//Object.assign(target,obj1,obj2,...)
			
			let newObj=Object.assign({},{a:1},{b:2});
			console.log(newObj);
		</script>

9、Symbol类型

<script>
			//原始数据类型Symbol,它表示是独一无二的值
			//最大的用途:用来定义对象的私有变量
			const name=Symbol('name');
			const name2=Symbol('name');
			console.log(name === name2);
			
			let s1=Symbol('s1');
			console.log(s1);
			let obj={};
			obj[s1]='小花';
			//如果用Symbol定义的对象中的变量,取值时一定要用[变量名 ]
			console.log(obj[s1]);
			//console.log(obj.s1);
			
			// for(let key in obj){
			// 	console.log(key);
			// }
			
			// console.log(Object.key(obj));
			
			let s=Object.getOwnPropertySymbols(obj);
			console.log(s[0]);
			//获取Symbol声明的属性名(作为对象的key)
			let m=Reflect.ownKeys(obj);
			console.log(m);
		</script>

10、Set集合数据类型

<script>
			//集合:表示无重复值的有序列表
			let set=new Set();
			console.log(set);
			//添加元素
			set.add(2);
			set.add('4');
			set.add('4');
			set.add([1,2,3]);
			//删除元素
			set.delete(2);
			//校验某个值是否在set中
			console.log(set.has('4'));
			console.log(set.size);
			set.forEach((val,key));=>{
				console.log(val);
				console.log(key);
			}
			
			//将set转换成数组
			let set2=new Set([1,2,3,3,4]);
			//扩展运算符
			let arr=[...set2]
			console.log(set2);
			
			//1.set中的对象的引用无法被释放
			let set3=new Set(,obj={};
			set3.add(obj);
			//释放当前的资源
			obj=null;
			console.log(set3);
		</script>

11、Map数据类型

<script>
			//Map类型是键值对的有序列表,键和值是任意类型
			
			let map=new Map();
			map.set('name','张三');
			map.set('age',20);
			console.log(,ap.get('name'));
			console.log(map);
			map.has('name');//true
			map.delete('name');
			map.clear();
			console.log(map);
			
			let m=new Map
			([['a',1]['c',2]
			]);
		</script>

12、数组的扩展方式一

<script>
			//数组的方法  from()  of()
			//1.()将伪数组转换成真正的数组
			function add(){
				console.lo(arguments);
				//es5转换
				let arr=[].slice(.call(arguments));
				console.log(arr);
				
				//es6写法
				let arr=Array.from(arguments);
				console.log(arr);
			}
			add(1,2,3);
			
			let lis=document.queryCommandIndeterm('li');
			console.log(Array.from(lis));
			//扩展运算符,将伪数组转换成真正的数组
			console.log([...lis]);
			
			//from()还可以接受第二个参数,用来对每个元素进行处理
			Array.from(lis,ele=>ele.textContent);
			console.log(liContents);
			
			//2.of() 将任意的数据类型,转换成数组
			console.log(Array.of(3,11,20,[1,2,3],id:1));
			
			//3.copywithin()  数组内部将指定位置的元素复制到其他的位置,返回当前数组
			//从3位置往后的所有数组,替换从0位置往后的三个数组
			[1,2,3,8,9,10].copyWithin(0,3);//[8,9,10,8,9,10]
			
			//4.find() fingIndex()
			//find()找出第一个符合条件的数组成员
			let num=[1,2,-10,-20,9,2].find((n=> n<0)
			console.log(num);
			//findIndex()找出第一个符合条件的数组成员的索引
			let numIndex=[1,2,-10,-20,9,2].find(n=>n<0)
			console.lo(numIndex);
			})
		</script>

13、数组的扩展方式二

<script>
			//entries() keys() values()返回一个遍历器  可以使用for...of循环进行遍历
			//console.log(['a','b'].keys());
			//keys()对键名遍历
			//entries()对键值进行遍历
			for(let index of['a','b'.keys()]){
				console.log(index);
			}
			for(let ele of ['a','b'].values()){
				console.log(ele);
			}
			for(let [index,ele] of['a','b'].entries()){
				console.log(index,ele);
			}
			let letter=['a','b','c'];
			let it=letter.entries();
			console.log(it.next().value);
			console.log(it.next().value);
			console.log(it.next().value);
			console.log(it.next().value);
			//6.includes()返回一个布尔值,表示某个数值是否包含给定的值
			console.log([1,2,3].includes(2));
			console.log([1,2,3].includes('4'));
			//之前 indexof()
			console.log([1,2,3].indexOf('2'));
		</script>

14、迭代器interator的用法

<script>
			//Interator
			//是一种新的遍历机制,两个核心
			//1、迭代器是一个接口,能快捷的访问数据,通过Symbol.iterator来创建迭代器
			//2.迭代器是用于遍历数据结构的指针(数据库的游标)
			const item=['one','two','three'];
			//1.创建新的迭代器
			const ite=items[Symbol.iterator]();
			console.log(ite.nex());
			console.log(ite.next());
			console.log(ite.next());
			console.log(ite.next());
			console.log(ite.next());
		</script>

15、生成器Generator的用法

<script>
			//genterator函数 可以通过yield关键字 将函数挂起,为了改变执行流提供了可能性,同时为了做异步编程提供了方法
			//它普通函数的区别
			//1.function后面 函数名之前有个*
			//2.只能在函数内部使用yield表达式,让函数挂起
			
			function* func(a){
				console.log('one');
				yield 2;
				console.log('two');
				yield 3;
			}
			//返回一个遍历器对象,可以调用next()
			let fn=func();
			console.log(fn.nex());
			console.log(fn.nex());
			console.log(fn.nex());
			//总结:generator函数是分段执行的,yield语句是暂停执行,而next()是恢复执行
			
			function* add(){
				console.log('start');
				let x=yield '2';
				console.log('one:'+x);
				let y=yield '3';
				console.log('two:'+y);
				return x+y;
			}
			const fn=add();
			console.log(fn.nex());
			//使用场景:为不具备interator接口提供了遍历操作
			function* objectEntried(obj){
				//获取对象的所有的key保存到数组[name,age]
				const propKeys=Object.keys[obj];
				for(const propkey of propKeys){
					yield [propKeys,obj[propKeys]]
				}
			}
			const obj={
				name:'小花',
				age:18
			}
			obj[Symbol.iterator]=objectEntries;
			console.log(obj);
			for(let [key,value] of objectEntried(obj)){
				console.log(`${key},${value}`);
			}
		</script>

16、Generator的应用

<script>
			//Generator 部署ajax操作,让异步代码同步化
			//回调地狱
			// $.ajax({
			// 	url:'https://free-api.heweather.net/se/weather/now?location=beijing&key=4693ff5ea653469f8bb0c2963803976';
			// 	method:'get',
			// 	success(res){
			// 		console.log(res);
			// 		//继续发送请求
			// 		$.ajax({
			// 			url:'',
			// 			method:'get',
			// 			success(res1){
			// 				//发送ajax
			// 			}
			// 		})
			// 	}
			// })
			function* main(){
				 let res=yield request('https://free-api.heweather.net/se/weather/now?location=beijing&key=4693ff5ea653469f8bb0c2963803976'){		
				}
				console.log(res);
				//执行后面的操作
				console.log('数据请求完成,可以继续操作')
				}
				const ite=main();
				ite.next();
				
				function request(url){
					$.ajax({
						url,
						method:'get',
						success(res){
							ite.next(res);
						}
					})
				}
				//加载loading...页面
				//数据加载完成...(异步操作)
				//loading关闭掉
				function* load(){
					loadUI();
					yield showData(){
						hideUI();
					}
					let itload=load();
					itload.next();
					function LoadUI(){
						console.log('加载loading...页面')
					}
				}
				function loadUI(){
					console.log('加载loading...页面');
				}
				function showData(){
					setTimeout(()=>{
						console.log('数据加载完成');
					},1000);
				}
				function hideUI(){
					console.log('隐藏loading...页面')
				}
		</script>

17、Promise的使用

<script>
			//promise 相当于一个容器,保存着未来才会结束的时间(异步操作)的一个结果
			//各种异步操作都可以用同样的方法进行处理axios
			//特点:1、对象的状态不受外界影响 处理异步操作 三个状态 penging(进行) Resolved(成功) Rejected(失败)
			//2.一旦状态改变,就不会再变,任何时候都可以得到这个结果
			
			let pro=new Promise(function(Resolved,rejected){
				//执行异步操作
				
				let res={
					code:201,
					data:{
						name:'小马哥'
					},
					error:'失败了' 
				}
				setTimeout(()=>{
					if(res.code===200){
						resolved(res.data);
					}else{
						rejected(res.error);
					}
				},1000);
			})
			console.log(pro);
			pro.then((val)=>{
				console.log(val);
			},(err)=>{
				
			})
			
			function timeOut(ms){
				return new Promise((resolved,rejected)=>{
					setTimeout(()=>{
						resolved('hello promise success!!')
					},ms);
				})
			}
			timeOut(2000).then((val)=>{
				console.log(val);
			})
		</script>

18、使用Promise封装Ajax

<script>
			const getJSON=function(){
				return new Promise((resolve,reject)=>{
					const xhr=new XMLHttpRequest();
					xhr.open('GET',url);
					xhr.onreadystatechange=handler;
					xhr.responseType='json';
					xhr.setRequestHeader('Accent','application/json');
					//发送
					xhr.send();
					function handler(){
						console.log(this);
						
						if(this.readyState===4){
							if(this.status===200){
								resolve(this.response);
							}else{
								reject(new Error(this.statusText))
							}
						}
					}
				})
			}
			getJSON('https://free-api.heweather.net/se/weather/now?location=beijing&key=4693ff5ea653469f8bb0c2963803976')
		.then((data)=>{
			console.log(data);
		},(error)=>{
			console.log(error);
		});
		//then()方法
		//then()第一个参数是relove回调函数,第二个参数是可选的,是reject状态回调的函数
		//then()返回一个新的promise实例,可以采用链式编程
		
		</script>

19、Promise的其他方法

<script>
			//resolve() reject() all() race() done() finally()
			//resolve()能够将现有的任何对象转换成promise对象
			//let p=promise.resolve('foo');
			let p=new Promise(resolve=>resolve('foo'));
			p.then((data)=>{
				console.log(data);
			})
            //应用:一些游戏类的素材比较多、等待图片、flash、静待资源文件都加载完成,才进行页面的初始化
			let Promise1=new Promise((resolve,reject)=>{});
			let promise2=new Promise((resolve,reject)=>{});
			let promise3=new Promise((resolve,reject)=>{});
			let p4=promise.all([promise1,promise2,promise3])
			p4.then(()=>{
				//三个都成功 才成功
			}).catch(err=>{
				//如果有一个失败,则失败
			})
			//race()某个异步请求设置超时时间,并且在超时时间内执行相应的任务
			//1.请求图片资源
			function requestImg(imgSrc){
				return new Promis((resolve,reject)=>{
					const img=new Image();
					img.onload=function(){
						resolve(img);
					}
					img.src=imgSrc;
				});
				function timeout(){
					return new Promise((resolve,reject)=>{
						setTimeout(()=>{
							reject('图片请求超时');
						},3000);
					})
				}
				Promise.race([requestImg('https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E7%89%87&hs=0&pn=1&spn=0&di=7214885350303334401&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&ie=utf-8&oe=utf-8&cl=2&lm=-1&cs=2759886675%2C3050232684&os=4175619537%2C842558139&simid=4175794174%2C861041753&adpicid=0&lpn=0&ln=30&fr=ala&fm=&sme=&cg=&bdtype=0&oriquery=%E5%9B%BE%E7%89%87&objurl=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2Fc%2F5799c819cd9ae.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3Botg9aaa_z%26e3Bv54AzdH3Fowssrwrj6_kt2_8alm89_c_z%26e3Bip4s&gsm=&islist=&querylist=&dyTabStr=MCwxLDYsMyw0LDUsMiw3LDgsOQ%3D%3D')
				console.log(data);
				document.body.appendChild(data);
				]).catch(err=>{
					console.log(err);
				});
				
				server.listen(3000).then(()=>{
				}).finally(server.stop());
			}
		</script>

20、async的用法

<script>
			//Generator Promise async  1、解决回调地狱的问题 2、使得异步操作更加方便
			//作用:使得异步操作更加方便
			//基本操作 async它会返回一个Promise对象 then catch
			//async是Generator的一个语法糖
			async function f(){
				return await 'hello world';
				let data=await s.split('');
				return data;
			}
			//如果async函数中有多个await 那么then函数会等待所有的await指令 运行完的结果
			f().then(v=>{console.log(v)}).catch(e=console.log(e));
		</script>

21、class类的用法

<script>
			//es5造类
			function Person(name,age){
				this.name=name;
				this.age=age;
			}
			Person.prototype.sayName=function(){
				return this.name;
			}
			let p1=new Person('小花',22);
			console.log(p1);
			class Person{
				//实例化的时候会立即被调用
				constructor(name,age){
					this.name=name;
					this.age=age;
				}
			}
			//通过Object.assign()方法一次性向类中添加多个方法
			Object.assign(Person.prototype,{
				sayName(){
					return this.name
				}
			})
			let p1=new Person('小花',22);
			console.log(p1);
		</script>

22、类的继承extend

<script>
			//使用关键字 extends
			class Animal{
				constructor(name,age){
					this.name=name;
					this.age=age;
				}
				sayName(){
					return this.name;
				}
				sayAge(){
					return this.age;
				}
			}
			class Dog extends Animal{
				constructor(name,age,color){
					super(name,age);
					//Animal.call(this,name,age);
					this.color=color;
				}
				//子类自己的方法
				sayColor(){
					return `${this.name}${this.age}岁了,它的颜色是${this.color}`
				}
				//重写父类的方法
				sayName(){
					return this.name+supper.sayAge()+this.color; 
				}
			}
			
			let d1=new Dog('小王',22,'green');
			console.log(d1.sayName());
			console.log(d1.sayName());
		</script>

23、module模块的使用

//CommonJs和AMD
			//ES6 module
			//es6模块功能主要有两个命令构成:export和import
			//export用于规定模块的对外接口 import用于输入其他模块提供的功能
			//一个模块就是一个独立的文件
			export const name='张三';
			export const age=18;
			export function sayName(){
				return 'my name is 小花';
			}
			export{
				name,age,sayName
			}
			/*const obj={
				foo:'foo'
			}*/
			class Person{
				constructor(){
				}
				sayAge(){
					console.log('16');
				}
			}
<script type="module">
			//CommonJs鍜孉MD
			//ES6 module
			import Person,{name,age,sayName} from './module.js'
			//import *as f from './module.js'
			//console.log(Person);
			const p=new Person();
			p.sayAge();
			//console.log(f.default);
			//console.log(name,sayName());
		</script>

🌈本篇博客的内容【ES6新特性的用法】已经结束。
🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头小锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值