ES6学习笔记

变量


  1. var 声明变量
    没有块级作用域
    可以重复声明
    不能限制
  2. let 声明变量
    支持块级作用域
    禁止重复声明
  3. const 声明常量
    支持块级作用域
    禁止重复声明
    控制修改

作用域


  1. 传统
    没有块级作用域
    函数级作用域
  2. ES6
    有块级作用域的概念,针对let和const
    语法块包括:{}、if(){}、for(){}

解构赋值


let {a,b,c}={a: 12, b: 55, c: 99};
let [a,b,c]=[12,5,8];

  1. 左右两边一样
  2. 右边是一种数据格式

函数


  1. 箭头函数
    传统:function (参数){}
    ES6:(参数)=>{}
    如果,有且仅有1个参数,()也可以省
    如果,有且仅有1条return语句,{}可以省
    箭头修复this指向问题,在声明中就已经定义好
  2. 参数展开
    剩余参数——必须放在函数形参的最后一个位置
    function show(a, b, ...arr) {
        console.log(a, b, arr); // arr === [44, 7, 85, 34, 33]
    }
    show(12, 5, 44, 7, 85, 34, 33);
    
    展开数组——就跟把数组的东西写在那儿一样
    let arr=[12,5,8,99,27]; // ...arr === 12,5,8,99,27
    function sum(a, b, c, d, e) {
        return a + b + c + d + e;
    }
    sum(arr[0], arr[1],  arr[2], ..., arr[n-1], arr[n]) === sum(...arr) === sum(12, 5, 8, 99, 27);
    let arr1 = [1,2,3];
    let arr2 = [4,5,6];
    let arr = [...arr1, ...arr2];
    arr === [1, 2, 3, 4, 5, 6];
    

系统对象


  1. Array
    map——形参(value, index, array) 映射 1对1
    forEach 遍历 循环一遍
    filter 过滤
    reduce——形参(tmp, value, index, array) 减少 多对1
    let arr = [12, 66, 81, 92];
    let res = arr.reduce((tmp, item, index) => {
        if (index < arr.length - 1) {
            return tmp + item;
          } else {
            return (tmp + item) / arr.length;
        }
    });
    
  2. String
    字符串模板
    let age= 18;
    let str = `我的年龄是:${age}`
    
    startsWith: url.startsWith("http://")
    endsWith: url.endsWith(".com")
  3. JSON
    标准写法: {"key": "aaa", "key2": 12}
    JSON对象: JSON.stringify()、JSON.parse()

异步处理


  1. 什么是异步操作?
    异步——多个操作可以一起进行,互不干扰
    同步——操作一个个进行
  2. Promise
    封装异步操作的对象
    Promise.all()
    let p1 = $.ajax('data/1.json');
    let p2 = $.ajax('data/2.json');
    let p3 = $.ajax('data/3.json');
    Promise.all([p1, p2, p3]).then(([data1, data2, data3]) => {  // 形参用到了解构赋值
        console.log(data1, data2, data3);
    });
    
  3. async/await
    async函数是可以暂停的,在等待promise完成之前会被暂停
    async function show(){
        // 部分成功,部分失败的时候
        try{}catch() {}
        // 一般情况下
        let data1 = await $.ajax({url: 'data/1.json', dataType: 'json'});
        if (data1.a < 10) {
            let data2 = await $.ajax({url: 'data/2.json', dataType: 'json'});
            alert('a');
        } else {
            let data3 = await $.ajax({url: 'data/3.json', dataType: 'json'});
            alert('b');
        }
    }
    show();
    

兼容性


  1. babel
    Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。
  2. 在线编译(不推荐使用)
    引用babel
    设置页面脚本script标签type="text/babel"
    在线编译会给浏览器造成负担,导致页面的卡顿
  3. 提前编译
    npm i @babel/core @babel/cli @babel/preset-env -D
    添加脚本——package.json中加入"scripts": {"build": "babel src -d dest"},
    添加.babelrc——声明preset,{ "presets": ["@babel/preset-env"]}

ES其他版本新增特性


  1. ES7(ECMA 2016)
    ** 求幂
    Array.includes()
  2. ES8(ECMA 2017)
    await/async
  3. ES9(ECMA 2018)
    rest/spread,替代await/async
    异步迭代
    Promise.finally()
    正则

面向对象


  1. 语言发展
    机器语言 -> 汇编 -> 低级语言(面向过程) -> 高级语言(面向对象) -> 模块 -> 框架 -> API
  2. 面向对象特性
    封装性
    继承性
    多态性
  3. ES6中的面向对象基本写法
    关键字 class、constructor、extends、super
    class Person {
        constructor(name, age) {
            this.name = name;
            this.age = age;
      }
        show() {
            alert(this.name);
            alert(this.age);
        }
    }
    class Worker extends Person {
        constructor(name, age, job) {
            super(name, age);
            this.job = job;
        }
        showJob() {
            alert(this.job);
        }
    }
    let w = new Worker('wj', 18, 'worker');
    w.show();
    w.showJob();
    

闭包


  1. 闭包涉及到GC——垃圾回收,释放不用的缓存
  2. 闭包的底层:栈
    计算机执行函数的时候,每调用一次函数,计算机就会替这个函数分配一个空间,这个空间叫做栈。函数所有的局部变量都在这个栈里面。函数执行结束的时候,回收这个栈。闭包可以使这个函数执行结束的时候,这个栈不会被回收。
  3. 闭包的上层:函数当作对象处理
    调用函数的时候,会创建一个对象,这个对象包含这个函数里面各种执行的细节。
  4. 闭包——留着别删

ES6的模块化


  1. js模块发展
    没有模块 -> CMD -> AMD -> ES6语言提供的模块化支持
    ES6的模块化 -> 浏览器还不支持 -> webpack
  2. webpack编译
    entry——入口地址
    output——输出 (path:绝对路径) (filename:文件名)
    mode——模式
    所有当前路径前面加./
    // webpack.config.js
    const path = require('path');
    module.exports = {
        mode: 'production',
        entry: './index.js',
        output: {
            path: path.resolve(__dirname, 'build'),
            filename: 'bundle.js'
        }
    };
    
  3. export
    export let a = xx;
    export const b = xx;
    export function xxx () {};
    export class xxx {}
    export {a, b, c, ...};
    export default memberName;
    //从另一个模块导出
    export * from './m2';
    export {x, x, x, x} from './m2';
    export {default} from './m2';
  4. import
    import * as mod from "./xxx";
    import {a, b, c, ...} from "./xxx";
    //引入默认成员
    import memberName from './mod';
    //模块的代码引入进来,不引入内部成员
    import "./1.jpg";
    import "./1.css";
    //异步引入
    let promise=import("./mod1");

正则


  1. 定界符
    //
  2. 修饰符
    i 不区分(ignore)大小写,例如: /abc/i 可以匹配 abc、aBC、Abc
    g 全局(global)匹配,如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回。如果带g,则字符串从左到右,找到每个符合条件的都记录下来,直到字符串结尾位置。
    var str = 'aaaaaaaa'
    var reg1 = /a/;  str.match(reg1)  // 结果为:["a", index: 0, input: "aaaaaaaa"]
    var reg2 = /a/g; str.match(reg2)  // 结果为:["a", "a", "a", "a", "a", "a", "a", "a"]
    
  3. 元字符[]
    任何一个——例子:/a[abc]q/,可以匹配aaq,abq,acq,不能匹配abbq
    范围——例子:/[a-z]/i,/[0-9]/,/[a-z0-9]/,可以匹配任意一个字母或者任意一个数字
    排除——例子:[^a-z0-9],匹配除了字母和数字以外的字符
  4. 转义
    \d,匹配任意一个数字,等价于[0-9]
    \w,匹配任意一个数字或者字母或者下横线,等价于[a-z0-9_]
    \s,匹配任何空白字符,包括空格、制表符、换页符等等,等价于[ \f\n\r\t\v]。
    . ,匹配任意一个字符
    \D,匹配非数字字符,等价于[^0-9]
    \W,匹配非数字或者字母或者下横线字符,等价于[^a-z0-9_]
    \S,匹配 非空白
  5. 量词——数量
    {n},匹配符合左边规则的字符n次,例如:/a{6}/匹配a6次,/\d{11}/匹配数字11次
    {n,m},匹配符合左边规则的字符n到m次,例如:/\d{5,12}/,匹配数字5到12之间的任意次数
    {n,},匹配符合左边规则的字符最少n次,例如:/\w{6,}/,匹配任意一个数字或者字母或者下横线,最少6次
    +,匹配符合左边规则的字符最少1次,等价于{1,}
    ?,匹配符合左边规则的字符0到1次,等价于{0,1},例如/.jsx?/,匹配.js或者.jsx
  6. 修饰符=>条件
    ^ 行首,从开始就要符合右边的规则。在[]里面是排除
    $ 行尾,结束的时候要符合左边的规则。
  7. 逻辑或运算符符 |
    或的运算优先级最低
    /.jpg|gif|png$/,等价于匹配包含.jpg或者包含gif或者以png结尾的字符
    (),可以提升优先级。/.(jpg|gif|png)$/,匹配以.jpg或者.gif或者.png结尾的字符。例子:/^\d|[1-9]\d{1,3}$/,可以匹配开始和结尾是数组,但是有或|,无法限制中间的字符,应该写成/^(\d|[1-9]\d{1,3})$/。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容