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)
image.png

它会告诉你a已经被定义过了,不能重复定义

2.控制修改

const a = 5;
a = 12;
console.log(a);
image.png

它告诉你你给常量赋值,这是不行的

3.支持块级作用域
ES5只有函数级作用域

function sum(a, b) {
  return a+b;
}
console.log(a)
image.png

这时候它在外面是访问不到a的
ES6有块级作用域

  • {}
  • if(){}
  • for(){}
  • {}
{
  var a = 12;
}
console.log(a);

输出12

{
  let a = 12;
}
console.log(a);
image.png

解构赋值

不用解构赋值

//后台读取的数据
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};//右边是啥,对象?数组?都不是
image.png

函数

箭头函数

使用箭头函数不仅写起来简单而且能修复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);
image.png

剩余参数必须得是最后一个形参

(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);
image.png

(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代码在IE是没法跑的,因为ie是不支持ES6,两种办法,1、在线编译,2、发布前一次性编译完。

方法一:在线(不推荐)

1.下载browser.min.js
https://download.csdn.net/download/qq_30765479/9665195
2.引入
3.编写script,加上属性type为text/babel

<script src="browser.min.js"></script>
<script type="text/babel">
<!-- Your custom script here -->
let a = 12;
let b = 5;
let show = (a,b)=>{
  return a+b;
}
alert(show(a,b))
</script>

推荐第二种,第一种会给浏览器带来负担。编译的时间需要过程,如果代码量大,可能过个三五秒才能出来,用户是等不了的

方法二:编译(推荐)

npm是node自带的,在使用npm前请先安装node,https://nodejs.org/zh-cn/
我的版本v10.15.3

1.npm init -y
在你文件目录下执行这个命令,执行完会生成package.json,-y的作用是默认操作
2.npm i @babel/core @babel/cli @babel/preset-env
下载babel

i是install缩写,下载的元素,core是核心,没有它不行,cli是脚本,可以批量处理,preset是预设

3."build": "babel src -d dest"
修改package.json文件

image.png

这条命令的作用是把src目录下的文件(比如js文件)编译到dest目录下
4.在./新建名字为.babelrc,内容为
{
"presets": ["@babel/preset-env"]
}
5.npm run build
此时,此时,已经编译完成
验证
你会发现dest目录下的js代码已经被编译成ES6,
把dest目录下的js文件引到html,就能在ie上面跑,而且也不会影响性能

面向对象

class

class xx extends xxx{
  constructor(){
    super();
  }
  show(){
  }
}

模块化

目前浏览器还不支持模块化,因此需要用到webpack来编译。
1.npm i webpack -g
全局下载webpack,已经装过可以不安装
2.在./新建webpack.config.js

const path = require('path');
module.exports={
  mode: 'production',
  entry: './index.js',
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: 'budle.js'
  }
}

entry:入口、output:出口
output必须是对象
path必须是绝对路径
entry必须加./,因为node对当前路径的理解就是./才是当前目录下
mode有生产模式(production)和开发模式(develop)

3.这个时候我们就可以在index.js写模块化了
./index.js

import * as mod1 from './mod1'
alert(mo1.a);

./mod1.js

export let a = 12;

index.html
在html引用一下./build/bundle.js

export

export let a = 12;
export const b = 13;
let a = 12;
let b = 5;
let c = 17;
export{a,b,c}
export function() {}
export class xxx{}
export defaut xx;
//从另外一个模块导出
export * from 'mod2.js'
export {default} from 'mod2.js'

import

import * as mod1 from './mod1.js'
import {a,b,c} from './mod1.js'
//引入default
import mod1 from './mod1.js'
import '1.png'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,472评论 1 45
  • PNG 有PNG8和truecolor PNG PNG8类似GIF颜色上限为256,文件小,支持alpha透明度,...
    hudaren阅读 1,517评论 0 0
  • 1、新的声明方式 以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种...
    令武阅读 1,005评论 0 7
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,080评论 0 2
  • 世人都称你黄河 路过秦晋之时的你 的确雄浑 河水涛涛 一路奔腾 挟带着黄土高坡的外衣 往中国的东方流去 到了中原大...
    关中月阅读 213评论 4 1