ES6语法篇

Es6

第一章:ECMASript 相关介绍

1.1.什么是 ECMA

	ECMA(European Computer Manufacturers Association)中文名称为欧洲计算机制

	造商协会,这个组织的目标是评估、开发和认可电信和计算机标准。1994 年后该

	组织改名为 Ecma 国际。

1.2.什么是ECMAScript

	ECMAScript 是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言。

1.3.什么是 ECMA-262

	Ecma 国际制定了许多标准,而 ECMA-262 只是其中的一个,所有标准列表查看

	[http://www.ecma-international.org/publications/standards/Standard.htm](http://www.ecma-international.org/publications/standards/Standard.htm)

1.4.ECMA-262 历史

	ECMA-262(ECMAScript)历史版本查看网址

	[http://www.ecma-international.org/publications/standards/Ecma-262-arch.htm](http://www.ecma-international.org/publications/standards/Ecma-262-arch.htm)

1.5.谁在维护ECMA-262

 	TC39(Technical Committee 39)是推进 ECMAScript 发展的委员会。其会员都是

	公司(其中主要是浏览器厂商,有苹果、谷歌、微软、因特尔等)。TC39 定期

	召开会议,会议由会员公司的代表与特邀专家出席

1.6.学习ES6 的意义

	⚫ ES6 的版本变动内容最多,具有里程碑意义

	⚫ ES6 加入许多新的语法特性,编程实现更简单、高效

	⚫ ES6 是前端发展趋势,就业必备技能

第二章:ECMASript 6** 新特性

1. let

// 声明变量
 let a;
 let b, c, d;
 let e = 100;
 e = 45;
 let f = 521, g = 'love', h = []

 
 // 1.let变量不能够重复命名,否者会报错;var可以重复命名,不会报错
 // let star = 'lqc'
 // let star = 'lqz'
 
 // var g = 21;
 // var g = 21;
 
 // 2. 新增块级作用域,之前的es5只有全局作用域和函数作用域,es6新增了块级作用域
 // 	就是let与{}大括号配合使用形成块级作用域,块级作用域还有for ,if 
 		{
 			let name='路飞'
 		}
 		console.log(name);
 // 3. 不存在变量提升
 // console.log(song);
 // let song='童声'
 // 报错,显示未定义 
 // var 
 console.log(song1);
 var song1='童声'
  // 显示undefined
  // 4.不影响作用域链
  // 作用域就是在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域。

 // var a = "xiaoxujs";
 // function fun1(){
 //     function fun2(){
 //         console.log(a)
 //     }
 // }
 // 作用域链就是 当fun2调用a的时候,就会先在函数fun2中寻找,找不到就会去fun1中寻找,再找不到就会去全局里面寻找。

  let school="尚硅谷";
  function fn(){
 	 console.log(school);
  }
  fn()
  

实例:

<h3>切换颜色</h3>
 	<div class="item"></div>
 	<div class="item"></div>
 	<div class="item"></div>
 	<script type="text/javascript">
 		let items=document.getElementsByClassName('item'); // length是3
 		for(let i=0;i<items.length;i++){
 			items[i].onclick=function(){
 				items[i].style.background='pink';
 			}
 		}
 	</script>

2. const

const SCHOOl='尚硅谷'
 		
 		// 1.要初始值
 		// 2.常量名要大写
 		console.log(SCHOOl);
 		// 3.赋值之后不能修改
 		// SCHOOl="l"
 		{
 		const PLAYER='UZI';
 		}
 		// 4.报错,因为const也有块级作用域,应该放在大括号里面
 		console.log(PLAYER);
 		// 5.对数组和对象的元素的元素修改,不算对常量做修改,常量的地址是堆内存的地址
 		const TEAM=['UZI',"MXLG","Ming"];
 		TEAM.push('meiko')
 		console.log(TEAM);
 			

3.解构赋值

 	const zong=['one','two','three','four']
 	let [a,b,c,d]=zong
 	console.log(a);
 	console.log(b);
 	
 	let zong0={
 		name:'lqc',
 		age:21,
 		height:function(){
 			console.log('gaodu');
 		}
 	}
 	
 	let {name,age,height}=zong0 //name要相对应
 	console.log(name,height);
 	

4.模板字符串(多用于模板的定义dom元素)

 // 1.内容可以直接换行
 	let template=`
 	<div id="">
 		<li>java</li>
 		<li>C</li>
 	</div>
 	`

5.对象简化写法

一般我们都是把数据写到对象里面的,而这种写法是移至进来的
// 类似字面量的加强写法
 	let  name='lqc'
 	let change=function(){
 			console.log('我可以改变你');
 		}
 	const school={
 		name,
 		change,
 		improve:function(){
 			console.log('技能');
 		}
         //简化改为这种写法
         improve(){
 			console.log('技能');
 		}
 	}
 	console.log(school);

6. 箭头函数

// 1.写法
			let fn=function(){
				
			}
			let fn1=(a,b)=>{
				console.log(a+b);
			}
			
// 2.箭头函数的this是静态的,
		function getName(){
			console.log(this.name);
		}
		window.name="硅谷";
		
		let getName1=()=>{
			console.log(this.name);
		}
		const school={
			name:'ATGUIGU'
		}
		
		getName.call(school) // ATGUIGU
		getName1.call(school) //硅谷
// 3. 箭头函数不能进行实例化
		let Person=(name,age)=>{
			this.name=name
			this.age=age
		}
		let p=new Person('lqc',20)
// 4.箭头函数不可以使用arguments
		let a=function(){
			console.log(arguments[0]); //1
			// 对象类型,是一个伪数组
		}
		a(1,2,3,4)
		
		let b=()=>{
			console.log(arguments[0]); //报错
		}
		b(1,2,3,4,5)
// 5.箭头函数的简写
		// 当参数只有一个的时候,就不需要括号了
		// 当大括号只有一条语句的时候,就省略return和大括号了
		let mess=math=>
			 math*math;
		
		console.log(mess(2));
		

例子:

1.this的指向

<style type="text/css">
		#one{
			width: 40px;
			height: 40px;
			background-color: aqua;
		}
</style>	
	<div id="one">
			
	</div>
// js代码,版本一
let one=document.getElementById("one")
		one.addEventListener('click',function(){
			_this=this//这里的function是由one进行调用的
			window.setTimeout(function(){
				console.log(this);//window,因为setTimeout是在window里面的
				_this.style.background="red";
			},2000)
            //setTimeout(function(){},时间)
		})
//js代码版本二
let one=document.getElementById("one")
		one.addEventListener('click',function(){
			_this=this
			window.setTimeout(()=>{
				console.log(this);//one
				this.style.background="red";
			},2000)
		})

心得:使用function(){}的this,是看是谁调用了这个函数;

使用箭头函数则是看,箭头函数的上一级非箭头函数的this值

2.filter()方法的使用,求偶数

心得:1.filter()方法对数组是暂时性的修改,想要永久修改可以设置新的变量,进行保存

let arrs=[2,3,4,5,7,6,7,5,234,443,32]
		const list=arrs.filter(item=>
			item%2===0 
		)
        console.log(list);// [2, 4, 6, 234, 32]
let arrs=[2,3,4,5,7,6,7,5,234,443,32]
		const list=arrs.filter(function(item){
			if(item%2===0){
				return true
			}else{
				return false
			}
		})
		console.log(list);// [2, 4, 6, 234, 32]

两个都是一样的效果,因为item%2===0 这个语句返回的是true和false,所以可以替代return true和return false

7. 函数默认值

// 1.形参给初始值,给的值一般要靠后
			function a1(a,b,c=5){
				return a+b+c
			}
			const result=a1(1,2)
			console.log(result);

8. argument与args

function data(){
				console.log(arguments);
// arguments是指data()括号里面的数据
			}
data('java','c','tcp')
// argument是伪数组(可以用索引),原型链上是object(用的是object方法)

			function date(...args){
				console.log(args);
			}
			date('java','c','tcp')
			// ...args是放在最后的,语法限制
			function date1(a,b,...args){
				console.log(a);
				console.log(b);
				console.log(args);
			}
			date1(1,2,'java','c','ip')

9.扩展运算符

<script type="text/javascript">
		//扩展运算符号用在Object型上
		//...扩展运算符号,讲数组转换为逗号分隔符
			function mess(a,b,c){
				console.log(a,b,c);//java c ip
			}
			a=['java','c','ip']
			mess(...a)
			
			
			

实例:

// 1.数组合并
			let name=['java','c','c++']
			let name1=['ip','icp']
			let ht=name.concat(name1)
			console.log(ht);
			let ht1=[...name,...name1]
			console.log(ht1);
			i=Array(...name)
			console.log(i);
			// 2.数组克隆
			let name3=[...name]
			console.log(name3);
			// 3.数组与逗号分隔符相互转化
			let ht3=[...name]

10.symbol

//ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。

// ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。
			let a=Symbol()
			console.log(a);
			let b=Symbol('java')
			let b1=Symbol('java')
			console.log(b===b1);
			// Symbol.for()
			let c=Symbol.for('c');
			let c1=Symbol.for('c');
			console.log(c===c1);
			// let result=b+'la';
			// 不能与其他数据进行运算
			// console.log(result);
			// number string null undfind object boolean symbol 		
			
			let obj={
				name:'java',
				[Symbol('say')](){
					console.log('say');
				}
			}

11.迭代器

1.迭代器的基本知识

		// 1.迭代器是一种接口,为各种不同的数据提供统一的遍历操作,有一些数据没有原生的iterator
			// 接口,我们可以自己安装,这个接口就是和for...of搭配使用的,让for...of进行消费. 
			const op={
				a:Symbol('ab'),
			}
			console.log(op.a);//Symbol('ab')
		
			const xiyou=['tz','swk','sz']
			// 2. for ...of 是保存的是数组里面的数据,for...in 是保存索引
			for(let v of xiyou){
				console.log(v);
			}
			console.log(xiyou);//查看一个Symbol(Symbol.iterator)查看是否有这个东西
			// 3.工作原理
			// 创建一个指针对象,指向一个数据结构起始位置
			// 每调用一个next(),就会不断往后移动,直到最后一个成员
			//next()返回一个{value:值,done:false}
			
			let Iterator=xiyou[Symbol.iterator]() //{value: undefined, done: true}
			console.log(Iterator.next());
			console.log(Iterator.next());
			console.log(Iterator.next());
			console.log(Iterator.next());
			// done:true 表示遍历完成,如果为false会不停遍历下去的
			// next()返回一个done和value值

2.制造一个迭代器



// 1. 使用for ...of 是可以检查对象有没有iterator,没有的话使用for...of报错
			const banji={
				name:'一班',
				stus:['tz','swk','sz'],
				[Symbol.iterator](){
					let index=0;
					let _this=this
					return{
						next(){
							if(index<_this.stus.length){
								
								const result= {value:_this.stus[index],done:false}//超出范围value就是undifind
								index++;
								return result;//在这里可以控制返回的代码时间
						}else{
							return {value:undefined,done:true}
							
						}
						}	
					};
				}
			}
			for(let v of banji){
				console.log(v);
			}

12. Promise

node.js读取文件格式

const fs=require('fs')
 
// 2.调用方法读取文件
fs.readFile('./为学.md',(err,data)=>{
	  // 失败就抛出错误
	  if(err) throw err;
	  console.log(data.toString());
})


node.js与Promise一起使用


	const p=new Promise(function(resolve,reject){
		fs.readFile('./为学.md',(err,data)=>{
			if(err)reject(err);
			resolve(data);
	})})

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

const p=new Promise((resolve,reject)=>{
	fs.readFile('./为学.md',(err,data)=>{
		resolve(data)
	})
	
})
p.then(value=>{
	// console.log(value.toString());
	return new Promise((resolve,reject)=>{
		fs.readFile('./李白.md',(err,data)=>{
			resolve([value,data])
		})
	})
	// value是数组,可以使用join变成string
}).then(value=>{
	return new Promise((resolve,reject)=>{
		fs.readFile('./python.md',(err,data)=>{
			value.push(data)
			resolve(value)
		})
	}).then(
	value=>{
		// join()是加入的意思,参数会在不同索引之间加入参数
		console.log(value.join("\r\n"));
		// console.log(value.toString());
	}
)
})


	const p=new Promise(function(resolve,reject){
		fs.readFile('./为学.md',(err,data)=>{
			if(err)reject(err);
			resolve(data);
	})})

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

	const p=new Promise((resolve,reject)=>{
			// 1.创建对象
			// XMLHttpRequest是与服务器进行交互的
			const xhr=new XMLHttpRequest();
			// 2.初始化
			xhr.open("GET",'https://api.apiopen.top/getJoke',true);
			// 3.发送
			xhr.send()
			// 4.绑定时间,处理响应结果
			// 在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。
			xhr.onreadystatechange=function(){
				// 进入
				//  0 - (未初始化)还没有调用send()方法
				 // 1 - (载入)已调用send()方法,正在发送请求
				 // 2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
				 // 3 - (交互)正在解析响应内容
				 // 4 - (完成)响应内容解析完成,可以在客户端调用了
				if(xhr.readyState===4){
					// 判断状态响应码在200至299之间
					if(xhr.status>=200&& xhr.status<300){
						// console.log(xhr.response);
						resolve(xhr.response)
					}else{
						// 如果失败
						// console.log(xhr.status);
						reject(xhr.status)
					}
				}
			}
			
			})
			
			p.then(function(value){	
				console.log(value);
				},function(reason){
				console.log(reason);
			
				
				
			})


13. ES6暴露语法

// 模块化的好处
// 1.不同模块的冲突 (不同模块出现相同变量名字,不会影响) 2.代码复用 3.高维护性(人员各自修改自己的文件)
// 2. es6有自己的模块化规范,之前有commonJs,AMD,CMD
// 3. ES6的模块化语法

// 分别暴露
 export let school='java';

 export function teach(){
	console.log('我们教学java');
 }


// 选择暴露
let school='java';
function teach(){
	console.log('我们教学java');
 }
 export {school,teach}
 
// 默认暴露
export default{
	school:'java',
	teach(){
		console.log('我们教学java');
	}
}
	<script type="module"> //这里是模块类型的引入,不是<script type="text/javascript"> </script>
			//1.通用导入形式
			import * as a from "./js1.js" //* 代表所有的引入的东西
			
			// // 2.解构赋值(一般都是js文件是   export {school,teach})之后才解构赋值
			import {school as pp,teach} from "./js1.js"
			import {school as guigu,teach} from "./js1.js"
				
			//3.默认暴露,使用在export default{},括号里面对象很多的时候的情况下
			import {default as m3} from './js1.js'
			conslo.log(a)
			console.log(a.default.school);
			
			// 4.默认暴露(针对export default 只有一个的时候)
			import m3 from './js1.js'
	</script>

14. Set对象

基本语法(可以在原型链看语法)

let s=new Set()
			console.log(s);
			 // 返回的是Set对象
			let s1=new Set([1,2,3,4,5,6,1,2,3])
			const s2=[12,45]
			console.log(s1);
			// console.log(s1);
			s1.add('lol')
			console.log(s1);
			s1.delete(1)
			console.log(s1);
			console.log(s1.has(2));//返回的是boolean类型
			// s1.clear()
			console.log(s1);
			for(var i of s2){
				console.log(i);
			}

例子:与filter()一起使用

let arr=[1,2,3,4,5,6,1,2,3,4]
			const p=new Set(arr);
			console.log([...p]);
			// 2.交集
			let arr2=[1,2,3,41,1]
			// filter()方法最终返回的元素,可以存储到数组之中
			let result=[...p].filter(item=>{
				const p1=new Set(arr2);
				if(p1.has(item)){
					// 用has()返回的是boolean,可以很快的判断一个元素是否在数组里面,
					// 之前都是拿一个元素与数组里面的元素一个一个遍历
					return true
				}else{
					return false
					}
				// return p1.has(item) 简洁的做法
			})
			console.log(result);
		// 3.并集
		let arrcount=[...arr2,...arr]
		console.log(arrcount);
		let arrcount1=new Set(arrcount)
		console.log(arrcount1);


14.Map()对象

// 1.key可以放任何类型. 
			// 声明元素
			let m=new Map();
			//添加元素
			console.log(m);
			m.set('name','硅谷')
			m.set("changge",function(){
				console.log('改变一切');
			})
			let key={
				school:'TGUIGU'
			}
			m.set(key,['北京','上海','深圳'])
			
			m.delete('name') //根据key值
			console.log(m);
			// m.clear()
			// Map()可以用的键值对可以用数组找到
			for(let v of m){
				console.log(v[1]);
			}

15.async函数

// async 函数和await函数让异步代码像同步代码一样
		// async返回的是promise类型,类型里面的数据是由返回值决定
		async function fn(){
// 这种是成功的情况,return 
			// resolve
			// return '12'
			// 返回的是promise,返回成功的的信息resolve和信息
// 失败的情况是 	throw new Error("")		
			// reject
			// throw new Error('出错啦!')    
			//返回的是promise类型,返回成功的的信息rejected和信息

			// 返回的是promise类型
			
			// 类似于
			new Promise((resolve,reject)=>{
			})
			
			return new Promise((resolve,reject)=>{
				reject('失败的数据')
			})//返回的是promise,返回成功的的信息rejected和信息
		}	
			
		const result=fn()
		
		result.then(value=>{ 
			console.log(value);
		},reason=>{console.log(reason);})
			

16. await函数


// 1.await 放在async函数里面;2.
			// 创建一个promise对象
			// promise对象是一个object类型
			const p=new Promise((resolve,reject)=>{
				resolve("success")
			})
			
			async function fn(){
				// return 'success1'\
				throw new Error('err')
			} 
			const o=fn()
			
			console.log(o);
			async function main(){
				try{
				let result=await o;
				//await是取得成功的值}
				console.log(result);	
			}catch(e){
				console.log(e);
			}
			}
			main()

17.async和await结合读取文件读取

运行的话在终端使用node 文件名.js

			const fs=require("fs")
			
			// resolve,reject 是一个Buff流
			function readweixue(){
			return new Promise((resolve,reject)=>{
				fs.readFile('./为学.md',(err,data)=>{
					if(err)reject(err);
					resolve(data);
				})
			})}
			
			function readweixue1(){
			return new Promise((resolve,reject)=>{
				fs.readFile('./李白.md',(err,data)=>{
					if(err)reject(err);
					resolve(data);
				})
			})}
			// 让每一个行数读取一个文件,彼此不相连,读取到的数据会让 await 提取出来,之后汇总
async function main(){
	let o=await readweixue();	
	let o1=await readweixue1()
	console.log(o.toString());
	console.log(o1.toString());
}
main()		


结合ajax读取数据
思路:就是让函数去拿数据,之后在总函数提取数据,之后在总函数存起来,需要时用try包裹起来

function readAjax(url){
	return new Promise((resolve,reject)=>{
		const x=new XMLHttpRequest();
		x.open('get',url)
		x.send()
		x.onreadystatechange=function(){
			if(x.readyState==4){
				if(x.status>=200 && x.status<=300){
					resolve(x.response)
				}else{
					reject(x.status)
				}
			}
		}
	})
}


readAjax().then(value=>{
	
})

async function main(){
	// 因为result可能是报错的信息,用try{}catch{}包裹
	try{
	let result=await readAjax();
	// await是提取Promise的数据内容的,因为有了这个函数,所以外面要放async
	console.log(result);
	}catch(err){
		console.log(err);
	}
}

// 思路:就是让函数去拿数据,之后在总函数提取数据,之后在总函数存起来,需要时用try包裹起来


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@追求卓越

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

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

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

打赏作者

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

抵扣说明:

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

余额充值