es6笔记

ES6新标准

1、数据类型var let const

var

  • 函数作用域,如果声名在函数之外,就会是一个全局变量,
    可以重复声名,赋值。

let

  • 块级作用域,在同一个作用域里面无法重复声名

const

  • 块级作用域,值无法被直接赋值
  • 常量本身无法被改变,但是其值可以被改变

三者之间一个明显区别

  • 在全局作用域下面有一个for循环,定义一个循环变量i,如果使用
    var来定义,那么,这个i就是一个全局变量,i因为它不在函数中。如果使用let
    来定义,i在for循环结束之后会销毁,在for循环之外也无法访问到这个i了。
  • 如果直接声名let和const变量在全局作用域里,它会是一个全局变量,只要声名在大括号{ }里,他就是一个局部变量
  • let同样也会提前声名,但是会有临时死区,未付值之前使用会报错

2、箭头函数

箭头函数特性

  • 箭头函数没有自己的this属性,是继承其父作用域的this
  • 其this属性是函数定义时就被指定
	function Person(name,age,sex){
		this.name=name,
		this.age=age,
		this.sex=sex,
		this.hobbies=["girl","leg","stocking"],
		this.printHobbies=function(){
			//输出爱好
			this.hobbies.map(function(hobbie){ //map函数里面的函数是一个独立运行的函数,在该函数作用域内的this指向的是window
				console.log(`${this.name} love ${hobbie}`); //因为this指向的是window,所以名字无法正常输出
			})
		}
	}
	let chen=new Person();

使用箭头函数解决以上问题

	function Person(name,age,sex){
		this.name=name,
		this.age=age,
		this.sex=sex,
		this.hobbies=["girl","leg","stocking"],
		this.printHobbies=function(){
			//输出爱好
			this.hobbies.map((hobbie) => { 
				console.log(`${this.name} love ${hobbie}`); 
			})
		}
	}
	let chen=new Person();

不适合用箭头函数的场景

  • 该函数作为构造函数,或作为一个方法绑定到对象
	function Person(name,age,sex){
		this.name=name,
		this.age=age,
		this.sex=sex
		}
	//给Person的原型对象里添加一个方法
	Person.prototype.sayHello=function()
	{
		consol.log(`${this.name} say Hello`);
	}
	//使用箭头函数添加(错误添加方法)
	Person.prototype.sayHello=() => {
		
		//箭头函数不会绑定this到Person,此时的this是延用最外层的window
		consol.log(`${this.name} say Hello`);
	}
	//实例化一个对象时,里面的this无法绑定到新生成的对象
	const chen=new Person("","","");
	//person里面的this不会绑定到chen

箭头函数的this不会执行绑定,只会继承其父作用域

当一个函数单独运行时,没有被绑定,不是作为对象的方法,其this属性指向window或者Globle,在严格模式下是undefined


箭头函数总结:

当这个函数独立运行,但需要沿用其父作用域的this时,建议使用箭头函数

当这个函数需要通过绑定对象来沿用父对象的this,不适合使用箭头函数

当这个函数里需要获取参数对象arguments时不建议使用箭头函数,因为箭头函数中不包含这个对象

3、模板字符串

  • 使用反引号定义一个模板字符串
	const str=`
		<div class="great">
			<p>模板字符串</p>
		</div>`.trim();         //.trim()去除模板字符串两边的空格
	
	//还可以在其中增加变量
	const str1="模板字符串";
	const str2=`
		<div class="great">
			<p>${str1}</p>
		</div>`

一个例子:

	const peate={
		name:"peate",
		date:"2019-4-23",
		todos:[
			{name:"go to walk",conpleted:false},
			{name:"make a handjob",conpleted:false}
		]
	}
	//将其计划以无序列表形式打印
	const plan=`
	<ul>
		${peate.todos.map(todo =>`<li>${todo.name}</li>`).join("")} //转换数组为字符串,将逗号转换为空
	</ul>
	`
	console.log(plan);

标签模板字符串

	let st="你好";
	let st1="peatechen"

	function temp1(strings, ...values)      //参数1:被变量分隔的字符串  参数2:各变量
	{
		let high=values.map(value => `${value}`);
		console.log(strings);
		let result="";
		strings.forEach(function(string,i){
			result+= `${string}${high[i] || ''}`
			console.log(result);
		});
		return result; //可对原字符串进行操作
	}
	let st3=temp1`${st} 呦呦呦 嘿嘿嘿${st1} 结束`;
	let st4=`${st} 呦呦呦 嘿嘿嘿${st1} 结束`;
	console.log(st3===st4);     //拼串后结果相等
	
	//过滤用户不合法输入
	let st7=`<div class="temp" onload="alert('av')"> ${st1} </div>`  //假如这个字符串是用户输入的内容,里面有一个onload事件
	let st8=DOMPurify.sanitize(st7); //过滤不规范输入
	

4、字符串操作

  • .startsWith("str",index)
	let id="4211231996";
	console,log(id.startsWith("1996",6))
  • .endsWith("str",index)
	let id="4211231996";
	console.log(id.endsWith("1996",10));
  • .includes()
	let id="4211231996";
	console.log(id.includes("1996",10)); //10以后有没有
  • .repeat()
	let id="4211231996";
	console.log(id.repeat("1996",10));  //重复10次

5、对象(数组)解构

  • 如果我们要获取对象中的多个属性,之前的做法是:
	const PeateChen={name:"Peate",sex:"man",age:"18"};
	//获取对象中的值
	let name=PeateChen.name;
	let sex=PeateChen.sex;
	...... //非常繁琐

可以看到及其繁琐,这时就可以使用对象解构:

	const PeateChen={name:"Peate",sex:"man",age:"18"};
	let {name,age}=PeateChen; //大括号内变量名称需要与对象属性名相同
	console,log(name,age);   //输出结果:Peate 18

数组解构相同

	const PeateChen=["Peate","man","18"];
	let [value1, ,value3]=PeateChen;
	console.log(value1,value3);  //输出值:Peate 18
  • 如果我们在解构里面定义了一个对象里面没有的属性,可以给他一个值:
	const PeateChen={name:"Peate",sex:"man",age:"18"};
	let {name,age,sex="wman",hobbite="girl"}=PeateChen; //大括号内包含了对象里没有的属性
	console,log(name,age,sex,hobbite);   //Peate 18 man girl
	//可以初始给他一个值,通过传入对象,去覆盖初始值

6、for of循环

  • forEach方法循环无法终止跳过循环
  • for....in循环会去除循环对象可枚举属性,不适合遍历数组
  • for....of循环只会遍历值,适合遍历数组
	let names=["peate","chen","ayoung"];
	for(let value of names)
	{
		console.log(value);
	}
	//可以发现,没有获取到索引值
	//如果要获取索引的话可以这样操作:
	for(let [i,value] of names.entries()){
		console.log(i,value);
	}

7、数组的其他方法Arry.from()和Arry.of(),将类数组转换成数组

通过document.querySelectorAll()得到的并不是一个数组,
而是一个类数组对象,所以他不能使用数组的方法

  • 将类数组对象转换为数组
	const vs =document.querySelectorAll("")
	const v_array=Array.from(vs);
	console.log(v_array);
  • Array.of()

输入参数,返回数组

	return Array.of(1,2); //返回[1,2]

8、ES6数组新方法

  • 查找数组元素find
	let names=["peate","chen","ayoung"];
	let biuty=names.find((name,i)=>{
		if(i==2)
		return true;
	});
	//biuty结果为ayoung
  • 查找数组元素索引findIdex
	let names=["peate","chen","ayoung"];
	let biuty=names.findIndex((name,i)=>{
		if(name=="ayoung")
		return true;
	});
	//biuty结果为2
  • some()如果数组某一个元素满足条件则返回true
	let names=["peate","chen","ayoung"];
	let biuty=names.some(name => name=="ayoung");
	console.log(biuty);  //true
  • every()如果数组每一个元素满足条件则返回true
	let names=["peate","chen","ayoung"];
	let biuty=names.every(name => name!="");
	console.log(biuty);  //true

9、扩展运算符(超好用)

可以将可遍历对象扩展到一个数组中

  • 拼接数组
	let array=["peate","chen","ayoung"];
	let others=["fa","mi","ly"];
	//将第二个数组拼接到第一个中
	array=[...array,...others];
	console.log(array);
	//结果:["peate", "chen", "ayoung", "fa", "mi", "ly"]
  • 运用场景

将获取到的DOM对象类数组转换为数组

	let lis=document.querySelectorAll(".Menu>div a");
	//采用扩展运算符得到真正的数组
	let lis=[...document.querySelectorAll("ul>li")];
	//这时就可以调用数组方法处理它
	console.log(lis.map(value => lalue.innerHTML));

可将字符转转换为数组

 const str="Hello";
 const arr=[...str];

使用扩展运算符传参

 const str=[1997,2015,1320];
 funct(...str); //分别传入str中的值

10、promies 异步处理

通常用于调用API、JSON数据、ajax结果的一种反馈、承诺

  • Promies作用
    官方推荐使用axios这个Promies库,为了加深理解,编写自己的promies

  • Promies用法:

	const P=new Promies(function(resolve,reject){
		//异步处理(API、JSON数据、ajax请求)
		{
			resolve(数据) //请求成功
		}
		
		{
			reject(erro) //请求失败
		}
	});
	
	P.then(function(数据){
		//成功后操作
	},function(erro){
		//失败后操作
	})
//输入id找到你年龄
	function getDetail(Id){
		return new Promise((reslove,reject) =>{
			let owner=owners.find(value=>value.id===Id);
			if(owner){
				reslove(owner.name);
			}else{
				reject(Error("No found"));
			}
		}).then(data=>{
				getAge(data);
			},erro=>{
				console.log(erro);
			});
	}
  • Promies.all用法
	Promies.all([Promies对象1,Promies对象2.....])
	.then(function(results){
		let [data1,data2]=results;  //所有数据组成的数组,解构到data中
		//操作
	},function(){
		//失败
	})
	.catch(erro=>{
		consol.error(erro);
	})
  • Promies.race用法

与Promies.all用法相同,不过其是否执行成功操作,由第一个promies决定

11、symbol类型

  • 生成一个symbol类型变量
	const peate=Symbol("peate");  //生成唯一标识
	const person={
		[Symbol("chen")]:{name:"chen",age:"15"},
		[Symbol("chen")]:{name:"chen",age:"20"},
		[Symbol("ayoung")]:{name:"ayoung",age:"20"}
	}
  • Symbol类型无法用常规方式遍历,遍历和获取方式如下
	const sym=Object.getOwnPropertySymbols(person); //得到三个person
	const sym_value=Object.getOwnPropertySymbols(person).map(value=>person[value]);
	     //得到三个属性的值

12、模块化

13、类Class

  • 语法
	class Persons{
		constructor(name,age,sex) {
		    this.name=name;
			this.age=age;
			this.sex=sex;
		}
		
		sayHello(){
			console.log(`Hello my name is ${this.name}`);
		}
		
		static Hello(){
			console.log("Nice to meet you");  //静态方法,由Persons调用
		}
	}
	let chen6=new Persons("peate",25,"男"); //实例化
	chen6.sayHello();
	Persons.Hello();
  • 类的继承
	class Persons{
		constructor(name,age,sex) {
		    this.name=name;
			this.age=age;
			this.sex=sex;
		}
		
		sayHello(){
			console.log(`Hello my name is ${this.name}`);
		}
		
		static Hello(){
			console.log("Nice to meet you");  //静态方法,由Persons调用
		}
	}
	
	// 继承自基类Persons
	class Chen6 extends Persons {
		constructor(name,age,sex,girlfrend) {
			super(name,age,sex);
			this.girlfrend=girlfrend;
		}
		mygirl(){
			console.log(`my girlfrend is ${this.girlfrend}`);
		}
	}
	
	let peateChen=new Chen6("peateChen",18,"男","ayoung");
	peateChen.sayHello();
	peateChen.mygirl();
	

14、生成器函数

  • 语法
	function* functionName(){
		yield 'result1'; //函数本次执行的返回值
		yield 'result2'; //第二次执行的返回值
		。。。
	}
	
	//调用
	functionName.next();//
  • 应用场景:ajax工作流

15、对象扩展

  • Object.assign(target,source1,source2..)将原对象属性赋值到目标对象
	let obj={na:"af"};
	let obj1={sex:"nan"};
	let obj2={};
	Object.assign(obj2,obj,obj1);

Set、Map、WeakSet、WeakMap

  • Set 可以理解为一个类似数组的容器,但是与数组不同的是 Set里面的元素不可以有重复,且不可以通过索引来取值。
    /* 创建 */
    let set = new Set();

    /* 添加元素 */
    set.add("123");

    /* 删除元素 */
    set.delete("123");

    /* 获取长度 */
    set.size();
    
    /* 另一种创建方式 */
    let set = new Set([1,2,3,4]);
    
  • 利用Set给数组去重
    let arr = [1,1,2,2,3,3];
    let set = new Set(arr);
    arr = [...set];
  • Map 一个存放键值对的容器,特别的是该键值对的 Key 和对象不同,Key 可以是对象、数组、数字等
    let map = new Map();
    map.set("s",0);
    let obj = {name:"jj"};
    map.set(obj,1);
    map.get(obj) // 返回 1
posted @ 2019-08-18 17:45  SmallPeate  阅读(308)  评论(0编辑  收藏  举报