《深入理解ES6》读书笔记
这篇书评可能有关键情节透露
遗留问题
- setter函数以及getter函数的作用
- 对象的访问器属性:get的作用
- 54-58的函数多种用途以及块级函数看不懂
- 64-65的箭头函数没有this绑定看不懂
- call、apply和bind方法
- 正确使用Symbol的方法
变量: 不可以访问 变量声明后:可以访问 但是值为undefined 变量初始化后:可以访问 值不是undefined 使用let或者const实现块级声明,这个时候语言引擎会将声明放到临时死区中。 使用var会覆盖一个已经存在的全局属性。 使用策略:默认使用const,只有确定变量需要改变的时候才使用let。 字符串: 如果文字的编码超过了基本多文种平面的话(16位二进制),则需要加入代理对来表示这个文字。 准确比较字符串a.normalize() === b.normalize() 字符串识别方法:includesstartsWithendsWith 返回新字符串:repeat 正则的修饰符:sticky ?u修饰符:代理对检测修饰符i修饰符:大小写无关修饰符global修饰符 获取正则原表达式的文本:source属性获取修饰符:flags属性 模板字面量基础用法:用反撇号替换了引号,内部使用反撇号需要用反斜杠转义;可以直接换行也可以用\n转义字符串占位符:${任意的JS表达式}模板标签:创建领域专用语言DSL,函数化处理literals(文字)以及substitutions(模板字面量) 函数: 在函数中使用默认参数 使用argument对象将入参重制为初始值,ES6以及ES5严格模式下,argument对象不受入参的影响 函数在临时死区进行默认参数的顺序处理 使用argument处理不定量参数:不被箭头函数支持 使用不定参数(...keys)来处理无命名参数:必须放在函数末尾,整合参数为一个可以无限长度的数组,对原来的argument没有影响 展开运算符使用:来将数组打散作为独立的参数传入函数;作用域任意和迭代对象(168),例如:items.pushAll(arr2)(325) 箭头函数:let doNothing = () => {};和sort、map、reduce这类数组方法合用在箭头函数上调用call、apply和bind方法 重写递归函数,利用尾调用优化来优化程序 对象: 创建对象: Object.create(xx) 对于对象方法的定义消除了冒号和function关键字 比较两个参数的类型和值:Object.is(a,b),用于判断NaN和NaN等价 混合:一个对象接收来自另一个对象的属性和方法。 Object.assign()方法可以接收任意数量的对象,并按照制定的顺序将属性复制到接收对象中。同时:如果属性重复,获取最后一个属性。 通过Object.getOwnPropertyNames()来明确定义枚举顺序(82)。 使用Object.setPrototypeOf()来修改对象的原型(82)。使用super来调用对象的原型(84),并始终指向正确的对象(86)。 解构: 对象:解构赋值 +默认值 + 为非同名变量赋值 + 嵌套 数组:解构赋值 +默认值 + 嵌套 + 不定元素 混合解构:对象解构 + 数组解构 解构参数:用比较冗余的方式设立解构参数;用比较不溶于的方式设立; Symbol: 定义方法 使用方法 共享体系:全局访问列表 Set创建:new Set([1,2,3,4]); add,重复的参数调用会忽略(132)。删除元素:delete修改:无查询:has遍历:注意回调函数的前两个参数的值是一样的(134)。转化为数组:利用展开运算符缺点:无法通过索引值访问元素;不受到原引用的影响优点:保证元素的值不重复 WeakSet创建: new WeakSet();add缺点(138-139):只能add对象,不可迭代,不支持size属性优点:当其最后一个引用被移除的时候(= null),其会被回收并释放内存 Map创建:new Map(arr1, arr2, arr3....);set([key], [value])删除:删除元素delete([key]),移除所有元素clear()修改:猜测:set()查询:get([key]), has([key])遍历:value、key、其本身(142)缺点:调用比较麻烦优点:不会像对象一样,将属性名强制转换为字符串类型;可以将对象作为属性名(唯一选择147) WeakMap缺点:key值只能是对象优点:不支持遍历、size属性和clea()r方法 迭代器的使用场景和历史(149) 目的:消除循环复杂性减少错误 生成器目的:用于简化创建迭代器对象过程创建:函数命名前增加星号,yield(152)特性:yield无法超过函数边界(153)地位:ES6的重要特性 迭代器应用场景:可迭代对象:数组、Set、Map、字符串(155)访问默认迭代器:value[Symbol.iterator]() (156)访问内建迭代器:entries() values() keys() 迭代:next() 内部传值会替代生成器上一条yield语句返回的值throw(),for of:数组和Set集合使用values,Map结合使用entries,NodeList使用values。 没懂部分:使用生成器生成简洁的异步代码没看懂 类 目的:简化原来的实现类的方法 创建:类声明;类表达式 使用: 地位:和函数一样,可以传入函数、从函数返回、赋值给变量,为一等公民 ES6的类型继承:先由基类创建this的值,然后由派生类的构造函数修改这个值(204):class MyArray extends Array {} 没懂部分:大部分 改进的数组功能 1. 创建数组Array.of:传入元素值Array.from:将可迭代对象映射转换为数组(215) 2. 新增方法findfindIndexfillcopyWithin 3. 定型数组目的:节约内存,加快运算速度实现:跳过 异步 JS是单线程:同一时刻只允许一个代码块执行,代码会放在人物队列中,按照先后顺序执行Java是多线程:同一时刻允许多个不同的代码块执行 事件模型是异步编程的最基础的形式,只有当前面的任务都完成后才会被执行,异步代码在未来的某个时间点执行 回调函数用于改造异步编程,多个调用更加容易,但是其局限性在于无法执行两个异步操作(239) Promise地位:JS的内建类型之一非暴露生命周期:进行中 -> 成功/ 失败方法:resolve(),reject(),race,all()使用:then()方法采取特定的行动(resolve),catch()方法监控失败(reject)(257) 没懂部分:大部分 代理和反射API 代理作用:拦截并改变底层JavaScript引擎操作的包装器,通过它暴露内部运作的对象。创建基础:new Porxy(目标对象, {处理程序}) 处理程序分为:
- 拦截写入属性操作的set代理陷阱
- 拦截读取属性操作的get代理陷阱
- 拦截查询属性操作(in)的has代理陷阱
- 拦截删除属性操作(delete)的deleteProperty代理陷阱
其余内容:279~298没看懂,299~310感觉无用,略看 用模块封装代码 导出:export xx导入:import {xx} from xx重命名:as导出默认值:export default导入默认值:import xx from xx 其余改动
- Number.isInteger()
- Number.isSafeInteger()
ES7的内容
- 求幂运算: **
- array.includes()