ES6简述
啥是ES6
大家都知道,JavaScript由DOM、BOM、ECMAScript组成,ECMAScript是标准。
ES6的全称其实是ES2015(6.0)每年更新,依次类推
ES2016(7)
...
ES2019(10)
为啥要推ES6
两个字:方便。不用ES6也能写,使用ES6就是为了方便,能用更少的代码去做更多的事情,为了提高工程性。
ES6有哪些东西
变量
let用于声明变量
const用于声明常量,且不可修改
相比var,ES6的变量有啥好处
1.禁止重复声明
ES5
var a = 12;
var a = 5;
console.log(a)
输出为5,一点问题没有
ES6
let a = 12;
let a = 5;
console.log(5)
它会告诉你a已经被定义过了,不能重复定义
2.控制修改
const a = 5;
a = 12;
console.log(a);
它告诉你你给常量赋值,这是不行的
3.支持块级作用域
ES5只有函数级作用域
function sum(a, b) {
return a+b;
}
console.log(a)
这时候它在外面是访问不到a的
ES6有块级作用域
- {}
- if(){}
- for(){}
- {}
{
var a = 12;
}
console.log(a);
输出12
{
let a = 12;
}
console.log(a);
解构赋值
不用解构赋值
//后台读取的数据
var json = {age: 12,height: 168}
console.log(json.age,json.height);
用完解构赋值
let {age,height} = {age: 12,height: 168};
console.log(age,height)
你就不需要去点了
注意事项
1.左右两边一样
let {a,b,c}={a: 12, b: 55, c: 99};//同是对象
let [a,b,c]=[12,5,8];//同是数组
2.右边得是个东西
let {a,b,c} = {12,5,13};//右边是啥,对象?数组?都不是
函数
箭头函数
使用箭头函数不仅写起来简单而且能修复this的问题
1.简单
ES5
- function xx() {}
- var xx = function() {}
ES6
let xx = (参数)=>{} - 有且仅有一个参数 ()可以省略
- 有且仅有一条语句 return {}可以省略
let show=()=>({a: 12, b: 5});//用()包一下
2.修复this
ES5
在ES5,谁调用this,this就是谁
在ES6,this绑定在当前的环境
参数展开
(1)剩余参数
function show(a, b, ...arr){
console.log(a, b, arr);
}
show(12,5,44,7,85,34,33);
12,5,44,7,85,34,33
注意:必须是最后一个
function show(a, b, ...arr, c){
console.log(a, b, arr, c);
}
show(12,5,44,7,85,34,33);
剩余参数必须得是最后一个形参
(2)数组展开
...arr等价于1,5,12,3
let arr = [1,5,12,3];
var sum=(a, b, c, d)=>a+b+c+d;
console.log(sum(...arr))
21
let arr = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr3 = [...arr1, ...arr2];
console.log(arr3);
1,2,3,4,5,6
系统对象
Array
4个API,由对象来调用
map 映射
forEach 循环
filter 过滤(删除)
reduce 减少
(1)map
映射:1对1,进去100个,出来100个
var scores = [100,60,52,48,98,13,45,66,75,98];
//两个参数item,index
var res = scores.map((item)=>item>=60);
console.log(scores,res);
(2)forEach
把true筛出来
let arr = [1,5,12];
arr.forEach((item,index)=>{
console.log(`第${index}个:${item}`);
});
第0个:1
第1个:5
第2个:12
(3)filter
let scores = [1,2,3,5,6,95,63,45,68,60];
let pass = scores.filter((item)=>item>=60);
console.log(pass)
(4) [95, 63, 68, 60]
(4)reduce
求和
let arr = [1,5,3,16];
let res = arr.reduce((temp,item,index)=>{
console.log(`temp:${temp}`);
return temp+item;
});
console.log(`res:${res}`);
temp:1//第一次是第一个数
temp:6//后面都是和
temp:9
res:25
求平均数
let arr = [1,5,3,16];
let res = arr.reduce((temp,item,index)=>{
if(index<arr.length - 1)
return temp+item;
else
return (temp+item)/2;
});
console.log(`res:${res}`);
String
(1)字符串模板
let name = '小明';
console.log(`name : ${name}`);
name : 小明
好处:能折行,对于大段的东西很适用
let str = `<div>
<p>第一行${item1}</p>
<span>第二行${item2}</span>
</div>`;
(2)startsWith
let url = 'http://www.baidu.com';
if(url.startsWith('http')||url.startsWith('https')) console.log('是网址');
else console.log('不是网址')
(3)endsWith
JSON
标准写法:
let json = {"name":"zhangsan","age":12};
- stringify:对象转json
let xiaoming = {
name: 'xiaoming',
age: 25
};
console.log(JSON.stringify(xiaoming));
{"name":"xiaoming","age":25}
- parse:字符串转对象
let json = '{"name":"xiaoming","age":25}';
console.log(JSON.parse(json));
{name: "xiaoming", age: 25}
异步操作
- 优点:程序性能好,资源利用率高、用户体验好
- 缺点:程序员体验不好
问题:按顺序拉取数据
环境:服务器
我用的是WampServer
data/1.json
{a: 1}
./data/2.json
{b: 12}
./data/3.json
{c: 16}
./html
$.ajax({
url: 'data/1.json',
dataType: 'json',
success(data1) {
$.ajax({
url: 'data/2.json',
dataType: 'json',
success(data2) {
$.ajax({
url: 'data/3.json',
dataType: 'json',
success(data3) {
console.log(data1,data2,data3)
}
});
}
});
}
});
{a: 1} {b: 12} {c: 16}
因为这种写法恶心,所以Promise出现了
了解一下Promise,其实jQuery的ajax也是Promise
let p=new Promise(function (resolve, reject){//resolve成功,reject失败
$.ajax({
url: 'data/1.json',
dataType: 'json',
success(data){
resolve(data);
},
error(res){
reject(res);
}
});
});
p.then(function (data){
alert('成功');
console.log(data);
}, function (res){
alert('失败');
console.log(res);
});
怎么用
Promise.all([
$.ajax({url:'data/1.json', dataType: 'json'}),
$.ajax({url:'data/2.json', dataType: 'json'}),
$.ajax({url:'data/3.json', dataType: 'json'})
]).then(([data1,data2,data3])=>{
console.log(data1,data2,data3);
},(res)=>{
alert('错了')//一个接口出错就不渲染
})
{a: 1}a: 1__proto__: Object
{b: 12}b: 12__proto__: Object
{c: 16}c: 16__proto__: Object
但是Promise有个致命的缺点,处理不了逻辑(第一个数据可能决定后面读什么)
因此async/await登场了,专门配合Promise,用同步的方法来写异步。
但是其实编译完还是恶心的嵌套,只不过不需要我们程序员来写,编译就完了
let show = async ()=> {
let data1 = await $.ajax({url: 'data/1.json', dataType: 'json'});//await后面跟的是Promise
let data2 = await $.ajax({url: 'data/2.json', dataType: 'json'});
let data3 = await $.ajax({url: 'data/3.json', dataType: 'json'});
console.log(data1,data2,data3)
}
show();
{a: 1} {b: 12} {c: 16}
处理逻辑
let show = async ()=> {
let data1 = await $.ajax({url: 'data/1.json', dataType: 'json'});
if(data1<10) {
let data2 = await $.ajax({url: 'data/2.json', dataType: 'json'});
console.log(data1,data2)
}else {
let data3 = await $.ajax({url: 'data/3.json', dataType: 'json'});
console.log(data1,data3)
}
}
show();
{a: 1} {c: 16}
ES6简述的更多相关文章
- 简述ES5 ES6
很久前的某一天,一位大神问我,你知道ES6相对于ES5有什么改进吗? 我一脸懵逼的反问,那个啥,啥是ES5.ES6啊. 不得不承认与大神之间的差距,回来深思了这个问题,结合以前的知识,算是有了点眉目. ...
- ES6 开发常用新特性以及简述ES7
一.关于变量 ES6新增:块级作用域变量 1.let定义块级作用域变量 没有变量的提升,必须先声明后使用 let声明的变量,不能与前面的let,var,conset声明的变量重名 { { consol ...
- 简述ES6其他的东西
第一是修饰器是ES7的一个提案,现在Babel转码器已经支持.那么什么是修饰器呢,修饰器是对类的行为的改变,在代码编译时发生的,而不是在运行时发生的且修饰器只能用于类和类的方法.修饰器可以接受三个函数 ...
- 简述es6各种简单方法
1.取代var的let和const 局部变量都可以使用let 固定变量都可以使用const 2.字符串的变化 反引号的使用 3.解构赋值 let [a, b, c] = [1, 2, 3]; let ...
- JavaScript作用域闭包简述
JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...
- React入门 (1)—使用指南(包括ES5和ES6对比)
前言 本篇会简明扼要的介绍一下React的使用方法.代码会用JSX+ES5和JSX+ES6两种方式实现. React简介 React来自Facebook,于2013年开源.至今不断修改完善,现在已经到 ...
- 前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)
写在前面 参考答案及资源在看云平台发布,如果大家想领取资源以及查看答案,可直接前去购买.一次购买永久可看,文档长期更新!有什么意见与建议欢迎您及时联系作者或留言回复! 文档描述 本文是关注微信小程序的 ...
- ES6进阶之路
1.说出至少5个ES6的新特性,并简述它们的作用. . let关键字,用于声明只在块级作用域起作用的变量. . const关键字,用于声明一个常量. . 结构赋值,一种新的变量赋值方式.常用于交换变量 ...
- ES6语法知识
let/const(常用) let,const用于声明变量,用来替代老语法的var关键字,与var不同的是,let/const会创建一个块级作用域(通俗讲就是一个花括号内是一个新的作用域) 这里外部的 ...
随机推荐
- matplotlib和numpy 学习笔记
1. 在二维坐标系中画一个曲线 import matplotlib.pyplot as plt #data len=400, store int value data = [] #set x,y轴坐标 ...
- Java多线程系列 基础篇04 线程中断
1. 中断线程 中断可以理解为线程的一个标志位属性,它表示一个运行中的线程是否被其他线程进行了中断操作,其他线程通过调用该线程的interrupt()方法对其进行中断操作,线程通过检查自身是否被中断来 ...
- quick check
- matlab程序计时
t1=datetime(); %程序 t2=datetime() totaltime=t2-t1; disp(t2-t1); 或者: tic %代码块 toc disp(['运行时间: ',num2s ...
- aop 例子(annotation方式实现)
面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之 ...
- python 列表之队列
列表实现队列操作(FIFO),可以使用标准库里的 collections.deque,deque是double-ended quene的缩写,双端队列的意思,它可以实现从队列头部快速增加和取出对象. ...
- Spring管理Filter和Servlet(在servlet中注入spring容器中的bean)
在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建.如果要在servlet中使用spring容器管理业务对 ...
- Grunt:常见错误
ylbtech-Grunt:常见错误 1.返回顶部 1. D:\lab6\DS.JZB.Web>grunt build Running "clean:dist" (clean ...
- hibernate学习五 Hibernate补充
1 MiddleGenIDE可以生成映射类和映射文件. 2
- VS2005打开VS2008项目的2种方法
vs2008支持.net3.5,而vs2005支持.net2.0,所以使用vs2005打开vs2008的项目,要确定你的项目是.net2.0的. 下面介绍2种方法: 方法1:用记事本打开.sln文件, ...