深入浅出之ES6(一)

1 篇文章 0 订阅

Babel 转码器

es6 -> es5
Babel 的配置文件是.babelrc,该文件用来设置转码规则和插件,基本格式如下

{
  "presets": [],
  "plugins": []
}

polyfill

Babel 默认只转换新的 JavaScript 句法(syntax),而不转换新的 API,比如Iterator、Generator、Set、Map、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign)都不会转码。

let&const ,顶层对象,globalThis

解构赋值

字符串扩展

模板字符串 (``)

字符串的遍历器接口(可以被for…of遍历)

字符串新增方法 

  1. includes():返回布尔值,表示是否找到了参数字符串。
  2. startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
  3. endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
  4. repeat(): 方法返回一个新字符串,表示将原字符串重复n次.
  5. padStart(): 用于头部补全, 返回的新字符串
  6. padEnd(): 用于尾部补全, 返回的新字符串
  7. trimStart(): 消除字符串头部的空格, 返回的新字符串
  8. trimEnd(): 消除尾部的空格, 返回的新字符串
  9. matchAll(): 方法返回一个正则表达式在当前字符串的所有匹配
  10. replaceAll(): 方法,可以一次性替换所有匹配。

数值的扩展

bigInt 

新增一种数据类型 BigInt(大整数),来解决:数值的精度只能到 53 个二进制位(相当于 16 个十进制位)的问题。

1234 // 普通整数
1234n // BigInt

Number新增属性和方法

  1. Number.EPSILON:实际上是 JavaScript 能够表示的最小精度
  2. Number.isFinite():用来检查一个数值是否为有限的(finite),即不是Infinity。
  3. Number.isNaN():用来检查一个值是否为NaN。
  4. Number.parseInt(): 函数可解析一个字符串,并返回一个整数。
  5. Number.parseFloat(): 该函数指定字符串中的首个字符是否是数字。如果是,则对字符串进行解析,直到到达数字的末端为止,然后以数字返回该数字,而不是作为字符串。
  6. Number.isInteger() : 判断是否为整数

Math的扩展

Math.trunc() :用于去除一个数的小数部分,返回整数部分。

函数的扩展

箭头函数 

普通函数 vs 箭头函数:

  1. 没有自己的thissuperargumentsnew.target绑定;
  2. 不可以当作构造函数,也就是说不能使用new来调用;
  3. 无法通过call、apply、bind改变this的指向;
  4. 没有原型对象;
  5. 形参名称不能重复;
  6. 不可以使用yield命令,因此箭头函数不能用作 Generator 函数

函数参数默认值

!!! 通常情况下,定义了默认值的参数,应该是函数的尾参数

rest 参数

rest 参数 -> arguments

rest vs arguments:
arguments: 对象不是数组,而是一个类似数组的对象。所以为了使用数组的方法,必须使用Array.prototype.slice.call先将其转为数组。
rest: 是一个真正的数组,数组特有的方法都可以使用
!!! rest 参数只能是最后一个参数

数组的扩展

扩展运算符

  1. 复制数组
  2. 合并数组
  3. 与解构赋值结合
  4. 字符串
  5. 实现了 Iterator 接口的对象
let nodeList = document.querySelectorAll('div');
let array = [...nodeList];
  1. Map 和 Set 结构,Generator 函数:
    扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口([Symbol.iterator])的对象,都可以使用扩展运算符,比如 Map 结构。

Array.from() - 数组的静态方法

Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。

Array.of() - 数组的静态方法

Array.of()方法用于将一组值,转换为数组。
!!这个方法的主要目的,是弥补数组构造函数Array()的不足。Array.of()基本上可以用来替代Array()或new Array()

数组实例的新增的方法

  1. find():用于找出第一个符合条件的数组成员
  2. findIndex():indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Object.is方法做到
  3. fill(): 使用给定值,填充数组
  4. keys(): 是对键名的遍历
  5. values(): 是对键值的遍历
  6. entries(): 是对键值对的遍历
  7. includes(): 返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。
  8. flat(): 展开数组(数组扁平化)
    flat()默认只会“拉平”一层,
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
  1. flatMap() : flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。

对象的扩展

属性加填写

方法的 name 属性

属性的可枚举性和遍历 

对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象

  {
    value: 123,
    writable: true,
    enumerable: true,
    configurable: true // 是否可枚举
  }

详见:JS回归基础之面向对象(OOP)

可枚举性
  1. for…in循环: 遍历对象自身和继承的可枚举属性
  2. Object.keys():遍历对象自身的可枚举属性
  3. JSON.stringify():只串行化对象自身的可枚举的属性。
  4. Object.assign():忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
属性遍历 

ES6 一共有 5 种方法可以遍历对象的属性。

  1. for…in: 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性);
  2. Object.keys(obj): 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
  3. Object.getOwnPropertyNames(obj): 返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
  4. Object.getOwnPropertySymbols(obj): 返回一个数组,包含对象自身的所有 Symbol 属性的键名。
  5. Reflect.ownKeys(obj): 返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
    !!! 注意是Reflect.ownKeys(obj)不是Object.ownKeys(obj)
    这里总结一下,画个图
    在这里插入图片描述

super 关键字

this关键字总是指向函数所在的当前对象,ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象。

对象的扩展运算符

解构赋值
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
扩展运算符

对象的扩展运算符(…)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。

链判断运算符 ?.
const firstName = message?.body?.user?.firstName || 'default';
Null 判断运算符 ??

只有运算符左侧的值为null或undefined时,才会返回右侧的值

const headerText = response.settings.headerText ?? 'Hello, world!';

对象的新增方法

Object.is()

比较两个值相等
es5:

  1. 相等运算符(==)
    缺点:会自动类型转换
  2. 严格相等运算符(===)
    缺点:NaN 不等于 NaN ,+0 等于 -0
    在这里插入图片描述

es6:
Object.js(): 与与严格比较运算符(===)的行为基本一致,区别有两个:一是+0 不等于 -0,二是NaN等于自身。
在这里插入图片描述

Object.assign(target,obj1,obj2)

对象合并:将源对象(source)的所有可枚举属性和Symbol属性(不包含不可枚举属性和继承属性),复制到目标对象(target)
常见用途:
(1)浅拷贝对象

Objct.assign({},obj)

(2)为对象添加属性

class Point {
  constructor(x, y) {
    Object.assign(this, {x, y});
  }
}

(3)为对象添加方法

Object.assign(SomeClass.prototype, {
  someMethod(arg1, arg2) {
    ···
  },
  anotherMethod() {
    ···
  }
});

Object.getOwnPropertyDescriptors()

es5:
Object.getOwnPropertyDescriptor(): 返回某个对象属性的描述对象(descriptor)
es7:
Object.getOwnPropertyDescriptors()方法,返回指定对象所有自身属性(非继承属性)的描述对象。

__proto__属性

__proto__用来读取或设置当前对象的原型对象(prototype)。目前,所有浏览器(包括 IE11)都部署了这个属性。实现上,__proto__调用的是Object.prototype.__proto__
建议不要直接使用__proto__这个属性,使用下面几种方法代替:

  1. Object.setPrototypeOf(): 写操作
  2. Object.getPrototypeOf(): 读操作
  3. Object.create(): 生成操作

Object.keys(),Object.values(),Object.entries()

  1. Object.keys(): 自身可遍历键名
  2. Object.values(): 自身可遍历键值
  3. Object.entries()(): 自身可遍历键值对数组

Object.fromEntries()

Object.fromEntries()方法是Object.entries()的逆操作,用于将一个键值对数组转为对象。

Object.fromEntries([
  ['foo', 'bar'],
  ['baz', 42]
])
// { foo: "bar", baz: 42 }

该方法的主要目的,是将键值对的数据结构还原为对象,因此特别适合将 Map 结构转为对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
曾经听许多前端从业者说:“前端发展太快了。”这里的快,十有八九是说层出不穷的新概念,余下的一二,大抵只是抒发一下心中的苦闷罢——前两日刚习得的新技术转眼就“落后”——仔细品味这苦闷,除却不得不持续奔跑的无奈,更多的是一口气,一口卯足了劲儿也要把新知识全数揽入囊中的不服气。作为刚入行的新人,对这点体会颇深。就像是蓦地从某个时间点切入,半数时间向前走,半数时间向后看,瞻前顾后,回味揣摩这十年间的岁月精魄,还得翘首盼着花花新世界,不时再问自己一句,这样走下去真的会好么?是的,其实答案人尽皆知,同时也无人知晓,因为没人能预言未来,顶多只能预测未来,但有一件事情永不会错,当你笃定地沿着一条路走下去,结果通常不会太糟糕,但凡能在浮躁的社会冷静下来潜心磨砺,多少总会有收获。幸而我有意弱化了对新信息的执念,开始做一些事情,《深入浅出ES6》就是其中一件。 纵观整个系列,亦即纵观ECMAScript 2015的整个体系,吸取了诸多成功经验:借鉴自CoffeeScript的箭头函数;始于C++项目Xanadu,接着被E语言采用,后来分别于Python和JavaScript框架Dojo中以Deferred对象的面貌出现的Promise规范(详见Async JavaScript一书3.1章);借鉴了C++、Java、C#以及Python等语言的for-of循环语句;部分借鉴Mustache、Nunjucks的模板字符串。 当然,新的语言体系也在之前的基础上查漏补缺:弥补块级作用域变量缺失的let和const关键字;弥补面向大型项目缺失的模块方案;标准委员会甚至为JavaScript增加了类特性,有关这一方面的特性褒贬不一,Douglas Crockford曾在2014年的Nordic.js大会发表了题为《The Better Parts》的演讲,重新阐述了他个人对于ECMAScript 6的看法,他认为Class特性是所有新标准中最糟糕的创新(我个人也略赞同这一说法,类的加入虽然有助于其它语言的使用者开始使用JavaScript,但是却无法发挥出JavaScript原型继承的巨大优势);以及为了保持非侵入式弥补其它新特性而诞生的Symbols。 其它的新特性也相当诱人,熟练掌握可以大幅度提升开发效率:迭代器Iterator、生成器Generators、不定参数Rest、默认参数Default、解构Destructuring、生成器Generator、代理Proxy,以及几种新类型:Set、Map、WeakSet、WeakMap、集合Collection。 以上提及的新特性只是其中的一部分,更多的新特性等待着大家进一步挖掘。整个系列的翻译历时150余天,坚持专栏翻译的日子艰苦也快乐,编辑徐川细心地帮我审校每一篇文章,编辑丁晓昀赠予钱歌川先生详解翻译之著作让我大开眼界,与李松峰老师的交流也让我深刻理解了“阅读、转换、表达”的奥义所在,最感谢我的母亲,在我遇到困难需要力量的时候永远支持着我。选择ES6作为前端生涯的切入点实之我幸,恰遇这样的机会让我可以一心一意地向前走,向未来走。我很敬佩在“洪荒”和“战乱”年代沉淀无数经 验的前辈们,你们在各种不确定的因素中左右互搏,为终端用户提供统一的用户体验,直到如今你们依然孜孜不倦地吸取业内新鲜的经验。技术在进步,也为前端人 提供着无限的可能性,我们有责任也有义务去推动新标准的发展和普及,诚然在商业的大环境下我们不愿放弃每一寸用户的土壤,但携众人之力定将能推动用户终端 的革新。ES7标准的提案纷纷提上日程,用不了多久也将登上前端大舞台。也感谢午川同学友情提供译文《深入浅出ES6(十):集合 Collection》,让我在困难时期得以顺利过渡。最后祝愿国内前端社区向着更光明美好的未来蓬勃生长!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值