-
Notifications
You must be signed in to change notification settings - Fork 10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【ES6/7/8】学习整理 #11
Comments
前言
此外还要注意这里不一定就是正式进入规范的语法。 1. let 和 const在我们开发的时候,可能认为应该默认使用 let 而不是 var,这种情况下,对于需要写保护的变量要使用 const。 然而另一种做法日益普及:默认使用 const,只有当确实需要改变变量的值的时候才使用 let。这是因为大部分的变量的值在初始化后不应再改变,而预料之外的变量的修改是很多 bug 的源头。
2. 模板字符串1. 模板字符串需要拼接字符串的时候尽量改成使用模板字符串:
2. 标签模板可以借助标签模板优化书写方式:
oneLine 的源码可以参考 《ES6 系列之模板字符串》 3. 箭头函数优先使用箭头函数,不过以下几种情况避免使用: 1. 使用箭头函数定义对象的方法
2. 定义原型方法
3. 作为事件的回调函数
4. Symbol1. 唯一值
2. 魔术字符串魔术字符串指的是在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。 魔术字符串不利于修改和维护,风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。
3. 私有变量Symbol 也可以用于私有变量的实现。
5. Set 和 Map1. 数组去重
2. 条件语句的优化
6. for of1. 遍历范围for...of 循环可以使用的范围包括:
2. 优势ES2015 引入了 for..of 循环,它结合了 forEach 的简洁性和中断循环的能力:
3. 遍历 Map
7. Promise1. 基本示例
2. finally
8. Async1. 代码更加简洁
2. 错误处理
3. "async 地狱"
9. Class构造函数尽可能使用 Class 的形式
10.Decorator1. log
log 的实现可以参考 《ES6 系列之我们来聊聊装饰器》 2. autobind
autobind 的实现可以参考 《ES6 系列之我们来聊聊装饰器》 3. debounce
debounce 的实现可以参考 《ES6 系列之我们来聊聊装饰器》 4. React 与 Redux
11. 函数1. 默认值
12. 拓展运算符1. arguments 转数组
2. 调用参数
3. 构建对象剔除部分属性,将剩下的属性构建一个新的对象
有条件的构建对象
合并对象
4. React将对象全部传入组件
13. 双冒号运算符
如果双冒号左边为空,右边是一个对象的方法,则等于将该方法绑定在该对象上面。
14. 解构赋值1. 对象的基本解构
2. 对象深度解构
3. 数组解构
4. 变量重命名
5. 仅获取部分属性
15. 增强的对象字面量
动态属性
16. 数组的拓展方法1. keys
2. entries
3. values
4. includes
5. find
6. findIndex
更多的就不列举了。 17. optional-chaining举个例子:
同样支持函数:
需要添加 @babel/plugin-proposal-optional-chaining 插件支持 18. logical-assignment-operators
Babel 编译为:
出现的原因:
需要 @babel/plugin-proposal-logical-assignment-operators 插件支持 19. nullish-coalescing-operator
举个例子:
需要 @babel/plugin-proposal-nullish-coalescing-operator 插件支持 20. pipeline-operator
21. Module 模块(import/export)Importsimport 'helpers'
// aka: require('···')
import Express from 'express'
// aka: const Express = require('···').default || require('···')
import { indent } from 'helpers'
// aka: const indent = require('···').indent
import * as Helpers from 'helpers'
// aka: const Helpers = require('···')
import { indentSpaces as indent } from 'helpers'
// aka: const indent = require('···').indentSpaces Exportsexport default function () { ··· }
// aka: module.exports.default = ···
export function mymethod () { ··· }
// aka: module.exports.mymethod = ···
export const pi = 3.14159
// aka: module.exports.pi = ···
export { default as MyComponent } from './my-component'
// Demo// A.js
export default 20
// use
import Num from './A'
// A.js
export const A = 20
// use
import { A } from './A'
// A.js
export default 20
export const name = 'Jhon'
export const gender = 'male'
// use
import A, { name, gender } from './A'
import A, { name as MyName, gender as MyGender } from './A'
import * as User from './A'
// A.js, B.js, C.js
// index.js
export { default as A } from './A'
export { default as B } from './B'
export { default as C } from './C' 其他新开了 知乎专栏,大家可以在更多的平台上看到我的文章,欢迎关注哦~ 参考
ES6 系列ES6 系列目录地址:https://github.com/mqyqingfeng/Blog |
《深入理解ES6》教程学习笔记转自:https://github.com/hyy1115/ES6-learning 发现问题欢迎pull commit 使用ES6开发已经有1年多了,以前看的是阮一峰老师的ES6教程,也看过MDN文档的ES6语法介绍。 最近买了《深入理解ES6》的书籍来看,为什么学习ES6这么久还要买这本书呢?主要是看到Daniel Abramove(react核心团队成员及redux的创造者)为本书做了序,作为一个react粉丝,还是挺看好这本书能给我带来一个新的升华,而且本书的作者也非常厉害。感谢 @lenville 的翻译贡献。 本章作为导读,用来汇总所有章节,每一章的内容也是我的学习笔记,也会加上自己对ES6新功能的理解分析,希望对前端爱好者也有帮助。
全剧终 |
. |
2 similar comments
. |
. |
《深入理解ES6》 |
ES6、ES7、ES8、ES9、ES10新特性一览源自:https://juejin.im/post/5ca2e1935188254416288eb2
ECMA规范最终由TC39敲定。TC39由包括浏览器厂商在内的各方组成,他们开会推动JavaScript提案沿着一条严格的发展道路前进。 从提案到入选ECMA规范主要有以下几个阶段:
ES6新特性(2015)ES6的特性比较多,在 ES5 发布近 6 年(2009-11 至 2015-6)之后才将其标准化。两个发布版本之间时间跨度很大,所以ES6中的特性比较多。 在这里列举几个常用的:
1.类(class)对熟悉Java,object-c,c#等纯面向对象语言的开发者来说,都会对class有一种特殊的情怀。ES6 引入了class(类),让JavaScript的面向对象编程变得更加简单和易于理解。
2.模块化(Module)ES5不支持原生的模块化,在ES6中模块作为重要的组成部分被添加进来。模块的功能主要由 export 和 import 组成。每一个模块都有自己单独的作用域,模块之间的相互调用关系是通过 export 来规定模块对外暴露的接口,通过import来引用其它模块提供的接口。同时还为模块创造了命名空间,防止函数的命名冲突。 导出(export)ES6允许在一个模块中使用export来导出多个变量或函数。 导出变量
ES6将一个文件视为一个模块,上面的模块通过 export 向外输出了一个变量。一个模块也可以同时往外面输出多个变量。
导出函数
导入(import)定义好模块的输出以后就可以在另外一个模块通过import引用。
3.箭头(Arrow)函数这是ES6中最令人激动的特性之一。 箭头函数的结构箭头函数的箭头=>之前是一个空括号、单个的参数名、或用括号括起的多个参数名,而箭头之后可以是一个表达式(作为函数的返回值),或者是用花括号括起的函数体(需要自行通过return来返回值,否则返回的是undefined)。
卸载监听器时的陷阱
除上述的做法外,我们还可以这样做:
4.函数参数默认值ES6支持在定义函数的时候为其设置默认值:
这样写一般没问题,但当
因为 所以说, 5.模板字符串ES6支持
在ES6中通过 6.解构赋值解构赋值语法是JavaScript的一种表达式,可以方便的从数组或者对象中快速提取值赋给定义的变量。 获取数组中的值从数组中获取值并赋值到变量中,变量的顺序与数组中对象顺序对应。
如果没有从数组中的获取到值,你可以为变量设置一个默认值。
通过解构赋值可以方便的交换两个变量的值。
获取对象中的值
7.延展操作符(Spread operator)
语法
应用场景
没有展开语法的时候,只能组合使用 push,splice,concat 等方法,来将已有数组元素变成新数组的一部分。有了展开语法, 构造新数组会变得更简单、更优雅:
和参数列表的展开类似,
展开语法和 Object.assign() 行为一致, 执行的都是浅拷贝(只遍历一层)。
在ECMAScript 2018中延展操作符增加了对对象的支持
8.对象属性简写在ES6中允许我们在设置一个对象的属性的时候不指定属性名。
对象中必须包含属性和值,显得非常冗余。
对象中直接写变量,非常简洁。 9.PromisePromise 是异步编程的一种解决方案,比传统的解决方案callback更加的优雅。它最早由社区提出和实现的,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
嵌套两个setTimeout回调函数:
上面的的代码使用两个then来进行异步编程串行化,避免了回调地狱: 10.支持let与const在之前JS是没有块级作用域的,const与let填补了这方便的空白,const与let都是块级作用域。
ES7新特性(2016)ES2016添加了两个小的特性来说明标准化过程:
1.Array.prototype.includes()
接下来我们来判断数字中是否包含某个元素:
使用
使用includes()验证数组中是否存在某个元素,这样更加直观简单:
2.指数操作符在ES7中引入了指数运算符
使用自定义的递归函数calculateExponent或者Math.pow()进行指数运算:
使用指数运算符**,就像+、-等操作符一样:
ES8新特性(2017)
1.async/awaitES2018引入异步迭代器(asynchronous iterators),这就像常规迭代器,除了
2.Object.values()
假设我们要遍历如下对象
从上述代码中可以看出 3.Object.entries()
接下来我们来遍历上文中的
4.String padding在ES8中String新增了两个实例函数
5.函数参数列表结尾允许逗号主要作用是方便使用git进行多人协作开发时修改同一个函数减少不必要的行变更。 6.Object.getOwnPropertyDescriptors()
返回
7.SharedArrayBuffer对象SharedArrayBuffer 对象用来表示一个通用的,固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象,它们都可以用来在共享内存(shared memory)上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分离。
8.Atomics对象Atomics 对象提供了一组静态方法用来对 SharedArrayBuffer 对象进行原子操作。 这些原子操作属于 Atomics 模块。与一般的全局对象不同,Atomics 不是构造函数,因此不能使用 new 操作符调用,也不能将其当作函数直接调用。Atomics 的所有属性和方法都是静态的(与 Math 对象一样)。 多个共享内存的线程能够同时读写同一位置上的数据。原子操作会确保正在读或写的数据的值是符合预期的,即下一个原子操作一定会在上一个原子操作结束后才会开始,其操作过程不会中断。
wait() 和 wake() 方法采用的是 Linux 上的 futexes 模型(fast user-space mutex,快速用户空间互斥量),可以让进程一直等待直到某个特定的条件为真,主要用于实现阻塞。
ES9新特性(2018)
1.异步迭代在
这段代码不会正常运行,下面这段同样也不会:
这段代码中,循环本身依旧保持同步,并在在内部异步函数之前全部调用完成。 ES2018引入异步迭代器(asynchronous iterators),这就像常规迭代器,除了
2.Promise.finally()一个Promise调用链要么成功到达最后一个
3.Rest/Spread 属性ES2015引入了Rest参数和扩展运算符。三个点(...)仅用于数组。Rest参数语法允许我们将一个布丁数量的参数表示为一个数组。
展开操作符以相反的方式工作,将数组转换成可传递给函数的单独参数。例如
ES2018为对象解构提供了和数组一样的Rest参数()和展开操作符,一个简单的例子:
或者你可以使用它给函数传递参数:
跟数组一样,Rest参数只能在声明的结尾处使用。此外,它只适用于每个对象的顶层,如果对象中嵌套对象则无法适用。 扩展运算符可以在其他对象内使用,例如:
可以使用扩展运算符拷贝一个对象,像是这样 4.正则表达式命名捕获组JavaScript正则表达式可以返回一个匹配的对象——一个包含匹配字符串的类数组,例如:以
这样的代码很难读懂,并且改变正则表达式的结构有可能改变匹配对象的索引。 ES2018允许命名捕获组使用符号
任何匹配失败的命名组都将返回 命名捕获也可以使用在
5.正则表达式反向断言目前JavaScript在正则表达式中支持先行断言(lookahead)。这意味着匹配会发生,但不会有任何捕获,并且断言没有包含在整个匹配字段中。例如从价格中捕获货币符号:
ES2018引入以相同方式工作但是匹配前面的反向断言(lookbehind),这样我就可以忽略货币符号,单纯的捕获价格的数字:
以上是 肯定反向断言,非数字
6.正则表达式dotAll模式正则表达式中点
7.正则表达式 Unicode 转义到目前为止,在正则表达式中本地访问 Unicode 字符属性是不被允许的。ES2018添加了 Unicode 属性转义——形式为
此特性可以避免使用特定 Unicode 区间来进行内容类型判断,提升可读性和可维护性。 8.非转义序列的模板字符串之前, ES10新特性(2019)
1.行分隔符(U + 2028)和段分隔符(U + 2029)符号现在允许在字符串文字中,与JSON匹配以前,这些符号在字符串文字中被视为行终止符,因此使用它们会导致SyntaxError异常。 2.更加友好的 JSON.stringify如果输入 Unicode 格式但是超出范围的字符,在原先JSON.stringify返回格式错误的Unicode字符串。现在实现了一个改变JSON.stringify的第3阶段提案,因此它为其输出转义序列,使其成为有效Unicode(并以UTF-8表示) 3.新增了Array的
|
The text was updated successfully, but these errors were encountered: