学习笔记(四)—— ECMAScript 新特性

let / const 与块级作用域

  • 作用域
    • 全局作用域
    • 函数作用域
    • 块级作用域
      • 使用 let / const 定义变量
      • {} 括起来的胃块级作用域
  • let不会像var出现变量提升
  • const
    • 声明时必须初始化
    • 只读
      • 不允许重新赋值(改变内存指向)
      • 但是可以改变引用类型的属性值(堆内存内的内容)

数组的解构

  • 根据数组位置匹配提取
  • 可以使用...rest获取剩余内容,得到一个剩余元素组成的数组
  • 没匹配到的成员会返回undefined,可以指定默认值,只在undefined时生效

对象的解构

  • 根据属性名匹配提取
  • 没匹配到的成员会返回undefined,可以指定默认值,只在undefined时生效
  • 可以对提取的属性进行重命名
    • 在属性名后添加冒号,冒号后面接重命名的内容
    • const {a : b} = object,提取object.a属性,并重命名为b

模板字符串

  • 使用反引号括起来
  • 支持直接换行
  • 可以使用 ${} 嵌入变量或者JS表达式

标签模板

用于对模板字符串进一步加工

  • 函数名标签 + 模板字符串
  • 函数接收的第一个参数为 模板字符串经过 ${} 表达式分割后的字符串数组
  • 函数剩余的其他参数,依次是模板字符串中${} 表达式的值
  • 标签模板的返回值为标签函数对应的返回值

字符串的扩展方法

  • includes
  • startsWith
  • endsWith
  • ...

参数默认值

  • 参数 = xxx 方式设置默认值
  • 参数接收到的值为undefined时生效(未传值)
  • 提供默认值的参数需在最后

剩余参数

  • ...rest 获取剩余参数
    • 得到剩余参数组成的一个数组
    • 未传参数时获得一个空数组[]
  • 只能出现在参数最后
  • 只能使用一次

展开操作

  • ...array 展开数组
  • ...object 展开对象
  • 浅拷贝
    • [...array]
    • {...object}

箭头函数

  • () => ()
  • this指向函数定义时所在的对象,不会随调用改变

对象字面量的增强

  • 变量名与属性名一致,可以省略变量名与冒号
  • 属性值为函数,可以简化为 fn() {}
  • 计算属性名
    • 属性名使用方括号[]
    • 方括号中可以使用表达式,动态设置属性名

Object.assign(target, source1, source2, ...)

  • 从后向前依次合并多个源对象属性到目标对象
  • 返回目标对象(即第一个参数,返回对象与第一个对象相等===)
  • 应用场景
    • 创建一个属性相同的新对象 Object.assign({}, object),等同于{...object}
    • 赋默认值 Object.assign(options, defaultOptions)

Object.is(value1, value2)

  • +0 与 -0
    • +0 === -0 // true
    • Object.is(+0, -0) // false
  • NaN
    • NaN === NaN // false
    • Object.is(NaN, NaN) // true

Proxy 代理器

  • new Proxy(targetObject, handlerObject)
  • 可以但不限于捕获对象的数据访问(get、set),实现数据响应及双向数据绑定
  • 对比Object.defineProperty()
    • 可以监视除读取、写入外更多的对象操作
    • 更好的支持数组对象的监视
    • 以非侵入的方式监管了对象的操作

Reflect

统一对象的API操作

  • 静态对象,不能使用new 创建
  • 封装了对对象的底层操作
  • 与Proxy可以代理的操作一一对应
  • 可以使用Reflect在Proxy中调用对象的默认行为

Promise

解决传统异步编程中回调函数嵌套过深的问题

class类

类似面向对象语言中的类定义

  • 实例方法 vs 静态方法
    • 实例方法
      • 由new返回的实例调用
      • this指向实例
    • 静态方法
      • 由类直接调用
      • static关键字声明
      • this指向类本身
  • 继承
    • ES2015之前使用原型模拟实现继承
    • ES2015 class使用extends继承
    • 使用super关键字访问父类的属性、方法与构造函数

Set

存放不重复的数据的集合,可以用来去重

  • 使用add添加,delete删除,clear清除
  • 可以链式调用
  • 可以使用size获取集合大小
  • 遍历
    • 可以使用for...of遍历(意味着实现了Iterator)
    • 可以使用forEach
    • 可以使用展开操作...

Map

  • Key-Value 键值对结构数据集合
  • 可以使用任意类型作为Key,Object只能使用String类型作为Key
  • 使用set设值、get取值、delete删除、clear清除
  • 遍历类似Set

Symbol

新类型,用于创建唯一值

  • 不使用new创建,直接Symbol()直接创建
  • Symbol() === Symbol() // false
  • 可以传入描述字符串 Symbol('aaa')
  • 可以作为对象的key
    • 用来实现对象的私有成员
  • Symbol.for
    • 接收一个字符串,返回一个全局注册的Symbol,如果传入的不是字符串,会toString转换为字符串
    • Symbol.for(true) === Symbol.for('true') // true
  • Symbol会被Object.keys()、JSON.stringify()等忽略
  • 可以使用Object.getOwnPropertySymbols()、等访问Object中的Symbol类型的Key

for...of循环

作为遍历所有数据结构的统一方式

  • 可以遍历所有实现了Iterator迭代器接口的对象
    • Array
    • Map
    • Set
    • Object.keys()/Object.values()/Object.entries()
  • 其他遍历方法
    • forEach遍历无法中断
    • for...in 只能遍历对象
    • for
    • while
    • array.map
    • ...展开操作

实现迭代器接口

const obj = {
    store: [1, 2, 3],
    [Symbol.iterator](){
        const self = this
        let index = 0
        return {
            next() {
                return {
                    value: self.store[index],
                    done: index++ >= self.store.length
                }                
            }
        }
    }
}

迭代器模式

提供统一的数据遍历接口,只需要实现Iterator接口

Generator生成器

  • 使用生成器函数实现Iterator迭代器接口

    const obj = {
        store: [1, 2, 3],
        [Symbol.iterator]: function * (){
            const self = this
            for (const item of self.store) {
                yield item
            }
        }
    }
    

ES Modules

ES2015 模块化标准

ES2016

  • Array.prototype.includes
  • 指数运算符 **

ES2017

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