学习ES6-11的第一天

学习ES6-11的第一天

一、ES6

1.1let关键字四大特性

在这里插入图片描述

1.2let点击变色小案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			.item{
				width: 200px;
				height: 100px;
				border: 1px solid red;
				margin: 0 5px;
				float: left;
			}
		</style>
	</head>
	<body>
		<h2>点击切换颜色案例</h2>
		<div>
			<div class="item"></div>
			<div class="item"></div>
			<div class="item"></div>
		</div>
	</body>
</html>
<script>
	// let item = document.getElementsByClassName('item');
	// for(var i = 0; i < item.length; i++){
	// 	item[i].οnclick=function(){
	// 		this.style.background='pink';
	// 	}
	// }
	// console.log(i);   //i的值最后增加到3了如果这里使用item[i]做事件就会报错
	
	let item = document.getElementsByClassName('item');
	for(let i = 0; i < item.length; i++){
		item[i].onclick=function(){
			item[i].style.background='pink';
		}
	}
	
	//因为let具有块级作用域,不像var那样有全局作用域
	//执行代码的大致样式
// 	{
// let i = 0
// {
// 		item[i].οnclick=function(){
// 			item[i].style.background='pink';
//  这里执行向外层去找i=0,不像var那样找到一个3
// 		}
// }
// 	{
// let i = 1
// //-------
// }
// 	{	
// let i = 2
// //----------
// }
</script>

在这里插入图片描述

1.3const关键字五大特性

最后一个只是修改了地址里面的值并没有修改地址所以不会报错
在这里插入图片描述

1.4解构赋值

<script>
	//数组
	const str = ['zhangshan','lisi','wangermazi'];
	let [zhang,li,wang] = str;
	console.log(zhang);
	console.log(li);
	console.warn('---------------------');
	//对象
	const duixiang = {
		name:'houwang',
		age:18,
		kk:function(){
			console.log('猴王爱吃香蕉');
		}
	}
	let {name,age,kk} = duixiang;
	console.log(name);
	kk();
</script>

在这里插入图片描述

1.5模板字符串

在这里插入图片描述

1.6对象的简化写法

<script type="text/javascript">
	let name = 'houwang';
	let age = function(){
		console.log('我的年龄18岁');
	}
	//ES6之前的写法
	// let duixiang = {
	// 	name:name,
	// 	age:age,
	// 	kk:function(){
	// 		console.log('这是ES6前面的写法');
	// 	}
	// }
	
	/**ES6写法**/
	let duixiang = {
		name,
		age,   //重名既可省略
		kk(){
			console.log('ES6新写法');
		}
	}
	console.log(duixiang);
</script>

在这里插入图片描述

1.7箭头函数

1.7.1箭头函数中this是静态的,始终指向函数声明作用域下的this的值

<script>
	//1.箭头函数中this是静态的,始终指向函数声明作用域下的this的值
	function getName1(){
		console.log(this.name);
	}
	var getName2 = () => {
		console.log(this.name);
	}
	window.name='houwang';
	const name = {
		name:'猴子爷爷'
	}
	// getName1();		//均指向houwang
	// getName2();		//均指向houwang
	//使用call改变
	getName1.call(name);
	getName2.call(name);
</script>

在这里插入图片描述

1.7.2不能构造实例化对象,不能使用arguments变量

在这里插入图片描述

1.7.3demo01点击方块两秒变色

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			div{
				width: 200px;
				height: 200px;
				background-color: aqua;
			}
		</style>
	</head>
	<body>
		<div></div>
	</body>
</html>
<script>
	let div = document.getElementsByTagName('div');
	//以前的写法
	// div[0].οnclick=function(){
	// 	var that = this;
	// 	setTimeout(function(){
	// 		that.style.background='pink';
	// 	},2000);
	// }
	//箭头函数中this是静态的,始终指向函数声明作用域下的this的值
	div[0].onclick=function(){
		setTimeout(() => {
			this.style.background='pink';
		},2000);
	}
</script>

1.7.4demo02从数组中返回偶数

<script>
	var str = [2,3,5,8,10];
	//filter方法筛选数组  返回true进行保留
	//之前的方法
	// var arr = str.filter(function(item){
	// 	if(item % 2===0){
	// 		return true;
	// 		}else{
	// 	return false;
	// 	}
	// })
	var arr = str.filter(item => item % 2 === 0); 
	console.log(arr);
</script>

在这里插入图片描述

1.8给函数参数赋初始值

<script>
	function add(a,b,c=240){
	return a+b+c;
	}
	console.log(add(5,5)); 	//输出250
	console.log(add(5,5,15));	//输出25,15替换了c默认值
	console.warn(' ');
	//与解构赋值结合
	//以前的写法
	// function jiegou(options){
	// 	console.log(options.user);
	// 	console.log(options.user);
	// 	console.log(options.password);
	// }
	function jiegou({url='127.0.0.1',user,password}){
		console.log(url);
		console.log(user);
		console.log(password);
	}
	//传了url替换掉url默认值
	jiegou({url:'localhost',user:'root',password:'123456'})
</script>

在这里插入图片描述

1.9rest参数

<script>
	//ES6中新增rest参数,用来获取函数的实参,替代arguments
	//ES5写法
	function date1(){
		console.log(arguments);
	}
	date1('重庆','高等','猴王');
	//ES6写法
	function date2(...agrs){
		console.log(agrs);
	}
	date2('重庆','高等','猴王');
</script>

两者不同点就是ES5的是一个对象,ES6是一个数组

在这里插入图片描述

二、ES6

2.1扩展运算符

2.1.1扩展运算符介绍

<script>
	var str = ['重庆','高等','猴王'];
	function houwang(){
		console.log(arguments);
	}
	houwang(str);  //['重庆','高等','猴王']
	houwang(...str);	//'重庆','高等','猴王'
</script>

注:ES5是只有一个参数数组,ES6有三个参数
在这里插入图片描述

2.1.2扩展运算符应用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div></div>
		<div></div>
		<div></div>
	</body>
</html>
<script>
	//1.数组的合并
	var houhome = ['猴子','猴王'];
	var fenghuang = ['曾毅','玲花'];
	// //ES5的写法
	// var str1 = houhome.concat(fenghuang);
	//ES6的写法
	var str2 = [...houhome,...fenghuang];
	console.log(str2);
	//2.数组的克隆  //注意如果数组中的数据是引用数据类型则是浅拷贝
	var houhomecopy = [...houhome];
	console.log(houhomecopy);
	//3.将伪数组转化成真正的数组
	var div = document.querySelectorAll('div');
	console.log(div);   //伪数组
	console.warn(' ');
	div2 = [...div];
	console.log(div2);
</script>

在这里插入图片描述

2.2Symbol介绍与创建

2.2.1介绍

在这里插入图片描述

<script>
	//这个字符串猴王只是做个描述 实际跟注释的差不多
	var s1 = Symbol('猴王');
	console.log(s1,typeof s1);
	var s2 = Symbol('猴王');
	console.warn(s1 === s2);
	//symbol.for访问的是一个全局的symbol表,如果有了就访问对应对象,没有就重新创建
	var s3 = Symbol.for('猴王');
	console.log(s3,typeof s3);
	var s4 = Symbol.for('猴王');
	console.warn(s3 === s4);
</script>

在这里插入图片描述

2.2.2往对象里面添加值demo01

	var obj = {
		name:'俄罗斯方块',
		top:function(){
			console.log('我可以快速向上移动');
		},
		down:function(){
			console.log('我可以快速向下移动');
		}
	}
	//例如我们这里有一个obj对象   我们向里面添加top和down这两个方法
	//但我们不确定这里面有没有这个两个方法   为避免破坏里面的数据使用Symbol
	//1.先声明一个对象
	var methods = {
		top:Symbol(),
		down:Symbol()	
	}
	//2.安全快速高效的添加进去这两个方法
	obj[methods.top]=function(){
		console.log('我可以快速向上移动');
	}
	obj[methods.down]=function(){
		console.log('我可以快速向下移动');
	}
	console.log(obj);

在这里插入图片描述

2.2.3往对象里面添加值demo02

let youxi = {
		name:'狼人杀',
		[Symbol('say')]:function(){
			console.log('我可以发言');
		},
		[Symbol('zibao')]:function(){
		console.log('我可以自爆');
		}
	}
	console.log(youxi);

在这里插入图片描述

2.2.4Symbol内置值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3迭代器

2.3.1for in和for of循环

<script>
	var houhome = ['猴子','猴儿','猴王'];
	//result保存的是键值
	for(let result of houhome) console.log(result);
	//result保存的是键名(我理解为下标)
	for(let result in houhome) console.log(result);
</script>

在这里插入图片描述

2.3.2遍历原理

在这里插入图片描述

<script>
	var houhome = ['猴子','猴儿','猴王'];
	//Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用。
	var iterator = houhome[Symbol.iterator]();
	console.log(iterator);
	console.warn(iterator.next());
	console.warn(iterator.next());
	console.warn(iterator.next());
	console.warn(iterator.next()); //done为真,表示遍历完成
</script>

在这里插入图片描述

2.3.3自定义遍历数据

在这里插入图片描述

<script>
	var banji = {
		name:'花果山',
		arr:[
			'houwang',
			'houer',
			'houba',
			'houye'
		],
		[Symbol.iterator](){
			let index = 0;
			let _this = this;
			return {
				next:function(){
					if(index < _this.arr.length){
					let result = {value:_this.arr[index],done:false};
					index++;
					return result;
					}else{
						return {value:undefined,done:true};
					}
				}
			}
		}
	}
    for(let v of banji){
		console.log(v);
	}
</script>

在这里插入图片描述

2.4生成器

2.4.1函数声明及调用

在这里插入图片描述
next分割

<script type="text/javascript">
	//yield函数代码的分隔符  通过next方法来控制代码执行
	function * gen(){
		console.log('我是第1个');
		yield '1'
		console.log('我是第2个');
		yield '2'
		console.log('我是第3个');
		yield '3'
		console.log('我是第4个');
	}
	let iterator = gen();
	iterator.next();
	console.log('-----------');
	iterator.next();
	iterator.next();
	iterator.next();
</script>

在这里插入图片描述
每次调用的函数结果是yield的自变量的值

<script type="text/javascript">
	//yield函数代码的分隔符  通过next方法来控制代码执行
	function * gen(){
		//console.log('我是第1个');
		yield '111'
		//console.log('我是第2个');
		yield '222'
		//console.log('我是第3个');
		yield '333'
		//console.log('我是第4个');
	}
	let iterator = gen();
	console.log(iterator.next());
	console.log('-----------');
	console.log(iterator.next());
	console.log(iterator.next());
	console.log(iterator.next());
</script>

在这里插入图片描述

2.4.2生成器函数的参数

gen调用可以传入参数
在这里插入图片描述
next方法可以传入实参
注:第n次调用传入的实参将作为第n-1个yield的整体返回结果

<script>
	function * gen(arg){
		console.log(arg);
		let one = yield 111;
		console.warn(one);
		let two = yield 222;
		console.log(two);
		let three = yield 333;
		 console.log(three);
	}
	let iterator = gen('gen传入的参数');
	console.log(iterator.next('传入却没有输出'));
	console.log(iterator.next('AAA'));  //第二次调用传入的实参将作为第一次yield返回的结果
	console.log(iterator.next('BBB'));  //这次调用将作为第二次yield整体的返回结果
	console.log(iterator.next('CCC'));
</script>

在这里插入图片描述

2.4.3生成器的实例demo01(回调地狱)

回调地狱典型案例
<script>
	// 一秒后输出111,再过一秒输出222,再过一秒输出333
	//回调地狱
	setTimeout(() => {
		console.log(111);
		setTimeout(() => {
			console.log(222);
			setTimeout(() => {
				console.log(333);
			},1000)
		},1000)
	},1000)
</script>

咱们使用gen生成器函数来安排他

<script>
	let one = () => {
		setTimeout(() => {
			console.log(111);
			//执行完毕后自动执行下一个
			iterator.next();
		},1000)
	}
	let two = () => {
		setTimeout(() => {
			console.log(222);
			//执行完毕后自动执行下一个
			iterator.next();
		},1000)
	}
	let three = () => {
		setTimeout(() => {
			console.log(333);
		},1000)
	}
	function * gen(){
		yield one();
		yield two();
		yield three();
	}
	let iterator = gen();
	iterator.next();
</script>

2.4.4生成器的实例demo02

<script>
	//获取用户数据传给订单数据再查询商品数据
	let user = () => {
		setTimeout(() => {
			let data = '1用户数据'
			//这是第二次调用next会作为第一次yield的整体返回结果
			iterator.next(data);
		},1000)
	}
	let getOrder = () => {
		setTimeout(() => {
			let data = '2订单数据'
			iterator.next(data);
		},1000)
	}
	let getGoods = () => {
		setTimeout(() => {
			let data = '3商品数据'
			iterator.next(data);
		},1000)
	}
	function * gen(){
		let one = yield user();
		console.log(one);
		let two = yield getOrder();
		console.log(two);
		let three = yield getGoods();
		console.log(three);
	}
	let iterator = gen();
	iterator.next();
</script>

在这里插入图片描述

2.5set集合

2.5.1集合介绍和api

<script>
		let s = new Set();
		console.log(s,typeof s);
		let s1 = new Set(['1','2','3','1'])
		//自带去重功能
		console.log(s1);
		//检测长度
		console.log(s1.size);
		//分割
		console.warn('');
		//新增
		s1.add('4');
		console.log(s1);
		//删除
		s1.delete('4');
		console.log(s1);
		//检测有没有当前元素
		console.log(s1.has('5'));
		//清空
		s1.clear();
		console.log(s1);
</script>

在这里插入图片描述

2.5.2集合基操

<script>
	var arr1 = [1,2,3,4,5,4,3,2,1];
	var arr2 = [3,4,5,8,9];
	//1.数组去重
	//不使用三个点转换为数组,这里得到的是一个对象
	let result1 = [...new Set(arr1)];
	console.log(result1);
	console.warn('-----------');
	//2.求arr1和arr2的交集
	//先去重减少空间复杂度
	// let result2 = [...new Set(arr1)].filter(item => {
	// 	let s2 = new Set(arr2);
	// 	if(s2.has(item)) return true;
	// 	return false
	// })
	//简化19-23行代码
	let result2 = [...new Set(arr1)].filter(item => new Set(arr2).has(item));
	console.log(result2);
	console.warn('-----------');
	//3.求arr1和arr2并集   合并再去重
	let result3 = [...new Set([...arr1,...arr2])];
	console.log(result3);
	console.warn('-----------');
	//4.差集 arr1和arr2的差集就是在arr1里面有arr2里面没有的集合2
	//就是并集取反
	let result4 = [...new Set(arr1)].filter(item => !(new Set(arr2).has(item)));
	console.log(result4);
</script>

在这里插入图片描述

2.6map

2.6.1map介绍和api

在这里插入图片描述

<script>
	var m = new Map();
	//1.增加元素  键名,键值
	m.set('name','猴王');
	m.set('change',function(){
		console.log('猴王可以改变你~~~');
	});
	let obj = {
		address:'花果山'
	}
	//键名obj是一个对象,键值是一个数组
	m.set(obj,['水帘洞','白骨精','牛魔王'])
	console.log(m);
	console.warn('-------------------')
	//2.size
	console.log(m.size);
	//3.删除
	//console.log(m.delete('name'));
	//4.遍历
	for(let result of m ){
		console.warn(result);
	}
	//5.清空
	m.clear()
	console.log(m);
</script>

在这里插入图片描述

2.7Class类基操

2.7.1Class初体验

<script>
	//ES5前写法
	function HUAWEI(brand,price){
		//对实例对象做初始化
		this.brand=brand;
		this.price=price;
	}
	//添加方法
	HUAWEI.prototype.call = function(){
		console.log('我可以打电话');
	}
	let huawei = new HUAWEI('华为','5999');
	huawei.call();
	console.log(huawei);
	//Class写法
	class ONEPLUS{
		constructor(brand,price){
			this.brand=brand;
			this.price=price;
		}
		call(){
			console.log('我可以打电话');
		}
	}
	let oneplus = new ONEPLUS('1+','4999');
	console.log(oneplus);
</script>

在这里插入图片描述

2.7.2Class的静态成员介绍

<script>
	//实例对象和函数对象是不相通的
	function HUAWEI(){
		
	}
	//brand和price是属于函数对象的 这样的属性称之为静态成员
	HUAWEI.brand = '华为';
	HUAWEI.price = function(){
		console.log('我的价格是 5999');
	}
	HUAWEI.prototype.size = '6.72inch';
	let huawei = new HUAWEI();
	console.log(huawei.size); 
	console.log(huawei.brand);
	//huawei.price();		//报错  实例对象访问不到函数对象的属性和方法
	class ONEPLUS{
		//静态属性
		static name='1+'
		price(){
			console.log('我的价格是 4999');
		}
	}
	let oneplus = new ONEPLUS();
	console.log(oneplus.name);
	console.log(ONEPLUS.name);
	oneplus.price()
</script>

在这里插入图片描述

2.7.3继承

<script type="text/javascript">
	class Person{
		constructor(age,sex){
			this.age = age;
			this.sex = sex;
		}
		call(){
			console.log('我会打人');
		}
	}
	class Son extends Person{
		constructor(age,sex,city){
			super(age,sex);
			this.city = city;
		}
	}
	let son = new Son('18','男','花果山');
	console.log(son);
	son.call();
</script>

在这里插入图片描述

2.7.4get和set

<script>
	class Houwang{
		get age(){
			console.log('我不知道我多少岁');
			return '18';
		}
		set city(value){
			console.log('我住'+value);
		}
	}
	let houwang = new Houwang();
	console.log(houwang.age);   //age属性的值就是方法的返回值
	houwang.city='花果山'
</script>

在这里插入图片描述

2.8数值扩展和对象扩展

2.8.1数值扩展

<script type="text/javascript">
	//1.Number.EPSILON
	//Number.EPSILON实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,
	//就可以认为已经没有意义了,即不存在误差了
	console.log('javascript中最小精度为:'+Number.EPSILON);
	function main(a,b){
		if(a-b < Number.EPSILON) return true;
		return false
	}
	console.log(0.1+0.2 == 0.3);
	console.log(main(0.1+0.2,0.3));
	console.warn('---------------------')
	//2.Number.isFinite  检测是不是一个有限数值
	console.log(Number.isFinite(100));
	console.log(Number.isFinite(100/0));
	console.log(Number.isFinite(Infinity));	//Infinity表示无穷
	console.warn('--------------------')
	//3.Number.isNaN  检测是不是一个NaN
	console.log(Number.isNaN(123));
	//4.Number.parseInt和Number.parseFloat截断字符串
	console.log(Number.parseInt('1314520love'));
	console.log(Number.parseFloat('3.1415926神奇数字'));
	console.warn('--------------------')
	//5.Number.isInteger判断是不是一个整数
	console.log(Number.isInteger(555));
	console.log(Number.isInteger(5.55));
	//6.Math.trunc抹掉小数部分
	console.log(Math.trunc(3.1415926));
	console.warn('--------------------')
	//7.Math.sign判断一个数是正数(1),零(0),负数(-1)
	console.log(Math.sign(100));
	console.log(Math.sign(0));
	console.log(Math.sign(-100));
</script>

在这里插入图片描述

2.8.2对象扩展

<script>
	//1.Object.is判断两个值是否相等
	console.log(Object.is(100,100));
	console.log(Object.is(NaN,NaN));
	console.log(NaN === NaN);	//NaN与任何数值做比较都是false
	console.warn('---------------');
	//2.Object.assign对象合并 有的属性后面那个覆盖前面那个
	let configOne = {
		url:'127.0.0.1',
		name:'root',
		user:'root',
		password:'123456',
	}
	let configTwo ={
		url:'localhost',
		user:'admin',
		password:'cqhg'
	}
	console.log(Object.assign(configOne,configTwo));
	console.warn('---------------');
	//3.Object.setPrototypeOf设置和获取原型 
	let objOne = {
		name:'猴王'
	}
	let objTwo = {
		city:'花果山'
	}
	//设置objOne的原型有objTwo
	Object.setPrototypeOf(objOne,objTwo);
	console.log(objOne);
	//获取
	console.log(Object.getPrototypeOf(objOne));
</script>

在这里插入图片描述

2.9模块化

2.9.1暴露数据三种方式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.9.2导入数据三种方式

在这里插入图片描述

在这里插入图片描述
模块化
在这里插入图片描述

在这里插入图片描述

三、ES6

3.1bable模块化代码转换(解决兼容性问题)

在这里插入图片描述

1.初始化

npm init --yes

安装(-D开发依赖)

npm i babel-cli babel-preset-env browserify -D

2.代码转换(局部安装的命令前要使用npx)

//        原文件路径              (可选参数) 需要转换到的文件目录         (必加参数) 
npx babel ES6/20模块化基操/20原文件js -d ES6/20模块化基操/21babel打包js --presets=babel-preset-env

3.打包

//注意路径 
npx browserify ES6/20模块化基操/21babel打包js/20模块化基操app.js -o ES6/20模块化基操/21babel打包js/bundle.js

此时已经多了一个bundle.js文件
在这里插入图片描述
4.准备工作完成我们的代码已经能跑了
在这里插入图片描述
5.当我们修改了原文件app.js的内容需要重新进行转换和打包
在这里插入图片描述

在这里插入图片描述

四、ES7

4.1查找数组元素存在,和幂运算

<script type="text/javascript">
	//查找数组存在某元素不   跟indexOf有点儿类似
	var arr = ['猴王','猴子','猴儿'];
	console.log(arr.includes('猴王'));
	console.log(arr.includes('猴爸'));
	console.warn('-------');
	// **幂运算
	console.log(2**10);
	//Math的幂运算
	console.log(Math.pow(2,10));
</script>

在这里插入图片描述

五、ES8

5.1async和await

参见csdnPromise

5.2对象方法扩展

<script>
	var obj = {
		name:'houwang',
		arr:['猴王','猴子','猴儿']
	}
	//获取键名
	console.log(Object.keys(obj));
	//获取键值
	console.log(Object.values(obj));
</script>

在这里插入图片描述

<script>
	var obj = {
		name:'houwang',
		arr:['猴王','猴子','猴儿']
	}
	//返回的是一个数组,而每一个成员又是一个数组
	//数组第一个值是键名,第二个是键值
    console.log(Object.entries(obj));  
	//创建map
	var m = new Map(Object.entries(obj));
	console.log(m);
	console.log(m.get('name'));
</script>

在这里插入图片描述

<script>
	var obj = {
		name:'houwang',
		arr:['猴王','猴子','猴儿']
	}
	//对象属性的描述对象
	console.log(Object.getOwnPropertyDescriptors(obj));
	//					第一个参数原型对象设置为null  第二个参数描述对象
	const objone = Object.create(null,{
		name:{
			//设置值
			value:'houwang',
			//属性特征
			writable:false,  ///是否可写
			configuarble:true, //是否可以删除
			enumerable:true  //是否可以枚举
		}
	})
	objone['name']="666"   //重写name值失败
	console.log(objone);
</script>

在这里插入图片描述

六、ES9

6.1rest参数

<script>
	function kk({name,password,...arr}){
		console.log(name);
		console.log(password);
		console.log(arr);
	}
	kk({
		name:'admin',
		password:'123456',
		type:'master',
		port:'3306',
		url:'localhost'
	})
</script>

在这里插入图片描述

6.2扩展运算符(对象的合并)

<script>
	var houzi = {
		q:'我可以偷桃子'
	}
	var houwang = {
		w:'我可以吃香蕉'
	}
	var houmu = {
		e:'我可以生猴子'
	}
	const huaguoshan = {...houzi,...houwang,...houmu};
	console.log(huaguoshan);
</script>

在这里插入图片描述

6.3正则扩展(捕获命名)

<script>
	let str = '<a href="www.baidu.com">百度</a>'
	//提取域名和文字      ?<变量名> .*通配符         \用于转义
	var reg = /<a href="(?<url>.*)">(?<wangzhi>.*)<\/a>/;
	const result = reg.exec(str);
	console.log(result);
	console.log(result.groups.url);
</script>

在这里插入图片描述

6.4正则扩展(反向断言:根据前后面的东西做唯一识别)

<script>
	var str = 'ffgf567快快快555没有了'
	//1.正向断言    取‘没有了’前面的数字
	var reg1 = /\d+(?=没有了)/;
	const result1 = reg1.exec(str);
	console.log(result1);
	//反向断言
	var reg2 = /(?<=快)\d+/;
	const result2 = reg2.exec(str)
	console.log(result2);
</script>

在这里插入图片描述

6.5正则扩展(dotAll模式)

<script>
	let str = `	<ul>
			<li>
				<a>铠甲勇士</a>
				<p>上市时间:2012-10-15</p>
			</li>
			<li>
				<a>刑天铠甲</a>
				<p>上市时间:2013-08-30</p>
			</li>
		</ul>`;
	//dot  .  元字符  除了换行符以外的任意单个字符
	// 普及一哈:贪婪匹配多个,非贪婪带问号,匹配一个,
	//              ?防止贪婪          模式修正符g全局匹配    模式修正符s,.将匹配任意字符
	var reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs
	//循环处理将数据保存好
	let data = [];
	let result;
	while(result = reg.exec(str)){
		console.log(result);
		 data.push({title:result[1],time:result[2]});
	}
	console.log(data);
</script>

在这里插入图片描述

七、ES10

7.1对象扩展方法(二维数组转化为对象)

<script>
	var arr = [['name','猴王,猴子,猴儿'],['number','1,2,3']];
	console.log(arr);
	let result1 = Object.fromEntries(arr)
	console.log(result1);
	var m = new Map();
	m.set('name','猴王');
	console.log(m);
	let result2 = Object.fromEntries(m)
	console.log(result2);
</script>

在这里插入图片描述

<script>
	//ES8对象转换为二维数组
	const arr = Object.entries({
		name:'猴王,猴子',
		city:'花果山'
	})
	console.log(arr);
</script>

在这里插入图片描述

7.2字符串扩展方法(清除左右空格)

<script>
	let arr = '     5201314     '
	console.warn(arr);
	console.log(arr.trim());   //左右
	console.log(arr.trimEnd());  //右
	console.log(arr.trimStart());  //左
</script>

在这里插入图片描述

7.3数组扩展方法(维度降低)

<script>
	//1.flat多维数组转换为一维数组
	let arrOne = [1,2,3,4,[5,6]];  //二位数组
	console.log(arrOne);
	//数字1表示深度
	console.log(arrOne.flat(1));
	let arrTwo = [1,2,3,4,[5,6,[7,8,9]]];  //三位数组
	//数字2表示深度
	console.log(arrTwo.flat(2));
	console.warn('------------')
	//2.flatmap
	let arrThree = [1,2,3,4];
	let result1 = arrThree.map(item => [item * 10])   
	console.log(result1);  //这里得到是一个二维数组
	//相当于flat和map的操作结合
	let result2 = arrThree.flatMap(item => [item * 10])
	console.log(result2);
</script>

在这里插入图片描述

7.4获取Symbol描述字符串

<script>
	var m = Symbol('猴王')
	console.log(m.description);
</script>

在这里插入图片描述

八、ES11

8.1私有属性

<script>
	//私有属性只可以在类内部可以访问   其他地方访问不了
	class Gril{
		//公有属性
		name;
		//私有属性
		#age;
		#naizi;
		constructor(name,age,naizi){
			this.name = name;
			this.#age = age;
			this.#naizi = naizi;
		}
		intro(){
			console.log(gril.name);		
			console.log(gril.#age);		
			console.log(gril.#naizi);	
		}
	}
	let gril = new Gril('小鑫',20,'C');
	gril.intro();
	// console.log(gril.name);		//正常访问
	// console.log(gril.#age);		//直接报错
	// console.log(gril.#naizi);		//直接报错
</script>

在这里插入图片描述

8.2Promise.allSeetled()

<script>
	//1.返回的结果始终是成功的   成功的值是Promise对象和状态
	const p1 = new Promise((resolve,reject) => {
		setTimeout(() => {
		resolve('成功')
		},1000)
	})
	const p2 = new Promise((resolve,reject) => {
		setTimeout(() => {
		reject('失败')
		},1000)
	})
	const result = Promise.allSettled([p1,p2]);
	console.log(result);
</script>

在这里插入图片描述

8.3字符串扩展(数据批量提取)

<script>
	let str = `	<ul>
			<li>
				<a>铠甲勇士</a>
				<p>上市时间:2012-10-15</p>
			</li>
			<li>
				<a>刑天铠甲</a>
				<p>上市时间:2013-08-30</p>
			</li>
		</ul>`;
	var reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs
	const result = str.matchAll(reg);
	console.log(result);
	// //两种方法均可
	 console.log([...result]);
	// for(let v of result){
	// 	console.log(v);
	// }
</script>

在这里插入图片描述

8.4可选链操作符

<script>
	function main(config){
		//以前的写法
		//const result = config && config.db && config.db.url;
		const result = config?.db?.url;
		console.log(result);
	}
	main({
		db:{
			user:'root',
			url:'127.0.0.1'
		}
	})
</script>

在这里插入图片描述

8.5动态import

在这里插入图片描述

在这里插入图片描述

8.6Bigint类型(超大数值运算)

<script>
	let  n  =  521n;
	console.log(n,typeof(n));
	let n1 = 88;
	console.log(BigInt(n1));
	//js能运算的最大数值
	let max = Number.MAX_SAFE_INTEGER;
	console.warn(max);
	console.log(max+1);
	console.log(max+10000+'运算错误的');//无效果
	console.log(BigInt(max)+BigInt(10000));
</script>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值