ES6的新特性

简介: const 和 letlet: 声明在代码块内有效的变量。

const 和 let


let: 声明在代码块内有效的变量。

特点:

在存在变理提升(不能在变量声明之前使用)

let的暂时性死区: 其实与1差不多,只要在块作用域有声明,就不能在本作用域声明前用主个变量。

不允许重复声明。

const: 声明一个只读的常量

特点:

一但声明,这个值不能被改变(对于引用类型,是引用的地址不能被改变)

声明时必须赋值

面试中常会问到var let const 三都的区别,回答的时候注重各自的特点,其实const let就是弥补var 的各种缺点,两都的特点就是var 的缺点。

工作中声明变量多用const 和 let

其中当声明的变量为引用类型如Array,如果没有直接更改引用的地址,可以使用const

解构赋值


什么是解构赋值?


按照一定模式从数组或对象中提取值,然后对变量进行赋值(先提取,再赋值)

数组:

let [a, b] = [1, 2]
// 以下的结果为右边数剩下的值所组成的数组
let [c, d ,...e] = [1, 2, 3, 4]
// 有默认值的写法
let [f = 100] = []  // f = 100
// 其中String也被视为类数组
let [a, b] = 'abcd' // a = a; b = b

对象:

变理名要与对象的属性名一样才可以:

1. let { foo } = { foo: 1, bar: 2 } // foo = 1
2. // 重新命名(后面那个才是新变量)
3. let { foo: newFoo } = { foo: 1, bar: 2 } // newFoo = 1

实际使用:

  1. 交换两个变量的值
[x, y] = [y, x]

2. 函数的封装

1. function fn({ x, y } = {}) {
2. console.log(x, y)
3. }

其中,函数参数为一个对象,不会像(x, y)的形式这样固定参数的顺序,而{} = {}后面又赋一个空的对象就是为了在调用fn时不传参数而不会抛出错误导至程序中止

3. 函数返回值的解构

函数返回多个值

// 有次序的
function foo() {
return [a, b, c]
}
const [a, b, c] = foo()
// 无次序的
function foo() {
return { a, b, c}
}
const { b, a, c} = foo()

3. 模板字符串

1. const h = 'hello'
2. `${ h } word`

${}中可以使用任意的javaScript表达试、运算、引用对象属性、函数调用等。结果是其返回值。

可以换行,但是所有的空格和换行会被保留。

特点:

可以换行,但是所有的空格和换行会被保留。

${}中可以使用任意的javaScript表达试、运算、引用对象属性、函数调用等。结果是其返回值。

函数的扩展

函数的默认值

function m(x = 1) {}

2. rest参数(用于获取函数的多余参数)

1. function a(...values) {
2. // value 是一个数组,第个元素是传入的各个参数
3. }

3. 函头函数

特点:

函数体内的this = 定义时所在的对像

不可以当作构造函数(不能用new)

不可以用arguments对像,可以用rest

不可以用yield命令(不能用作Generator函数)

阮老师的书中这一章讲到了有关尾调用,尾递归的内容,值得一看。

数组的扩展

扩展运算符。

用于替代数组的apply。


call apply bind的区别:


用于改变this的指向, 第一个参数为this指向的对像,后面的参数是作为函数的参数。

区加在于:call apply 会即调用,而bind是生成一个等调用的函数。call bind参数是一个个用逗号罗列,而apply 是传入一个数组。

fn.apply(null, [1, 2, 3])
fn.call(null, 1, 2, 3)
fn.bind(null, 1, 2, 3)()
// 指最大值
Math.max(...[3,4,5,62,8])
  1. 合并数组
1.// ES5
[1, 2].concat(3)
// ES6
[1, 2, ...[3]]
  1. 新增的方法
  2. Array.from()将类数组转为数组
  • 可遍历的对象(iterable)(Set, Map)
  • 类似数组的对
{ '0': 'a', '1': 'b' }
  1. 实例的方法
  • find()findIndex()找出第一个符合条件的成页/下标(位置)
  • entries()keys()values() 用于遍历数组。(配合for...of)
  • includes() 是否存在指定无素(返回布尔值)


对象的扩展


  1. 属性的简写:
let a = 100
{ a }
// 等同于
{ a: 100 }

方法名同样可以简写,vue中就常常用这种写法:

export default {
name: 'VueComp',
data() {},
create() {},
}
// 等同于
export default {
name: 'VueComp',
data: function() {},
create: function() {},
}

2. 属性名可心使用表达式:

let foo = 'foo'
let obj = {
[foo]: 'fooValue'
}

3. 新增一些方法:

  • Object.is()
  • Object.assign()
  • 对像的一些遍历:

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

for(let key of Object.keys(obj)) {}
for(let value of Object.values(obj)) {}
for(let [key,value] of Object.entries(obj)){}

扩展运算符(常用)(es2017新增,在webpack中要另外的babel转换)


Symbol


javascript又新增的一种数据类型(第七种,另外6种为:Undefined、Null、Boolean、String、Number、Object)

注:symbol作为对象的属性名时不会被for...in,for...of,Object.keys()识别;可以改用Reflect.ownkeys方法.


Set、Map


Set和map是ES6新增的数据结构。


Set


特点: 1. 类似数组,但其成员是唯一的。

是一个构造函数。

用法:

数组去重:

[...new Set([1,1,1,2,3,4,3])]
Array.from(new Set([1,1,1,2,3,4,3]))
  • Map

特点:

  1. 为了解决javascript的对象只能用了符串作为键的问题。

用法: (使用实例的set,get,delete方法增,查,删)

const m = new Map()
const obj = {a: 'aa'}
m.set(obj, 'obj as key')
m.get(obj) // 'obj as key'
m.delete(obj)

也可以在new 时接受一个数组

1. const obj = { a: 'aa'}
2. const m = new Map([
3. ['name': 'ym'],
4. [obj, { b: 'bbbb' }]
5.
这段时间有一个很火的文章讲如何使用map组构来优化长长的if..else的

Promise


是异步编程的一种解决方案。

特点:

  1. 状态不受外界影响(有三种状态:padding, fulfilled,redected)
  2. 一旦状态改变就不会再变。

用法:

const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, 1000)
}).then(res => {})
.catch(err => {})

注: then方法有两个参数,第一个是成功的回调,第二个为失败的回调,即:


.then(res =>{}, err => {})

但是最好用catch方法, 因为catch方法会捕获then里的错误,then里有错误程序不会中止。

Promise.all()

将一组promise再包装成一个promise

var pa = Promise.all([p1, p2, p3])

特点:

当所有都fulfilledj时,promise.all才fulfilled

当只有一个rejected时,promise.all就会rejected

Iterator和for...of

Iterator的3个作用:

为各种数据提供统一的,简便的访问接口

使数据结构的成员能按某种次序排列

主要供for...of用

原生有iterator的数据结构:

Array, Map, Set, String, TypeArray, arguments, NodeList

(object是没有的)

for...of与其他循环的比较

for循环写法比较麻烦

数组的forEach: 无法用break;return跳出循环。

For...in

数组的键名是数字,而for...in以字符串作为键名(也就是用for...in循环数组,其键名是字符串,笔者被坑过)

不仅可以遍历键名,还可以遍历手动添加的其他键,包括原型链上的

某些情况下,会心任意次序遍历

( for...in主要为对象而设计的)

Generator与async await

generator是ES6提供的一种异步编程解决方案。使异步写法更像同步。

Async await是ES2017的标准,是generator的一个语法糖。

用法:

async function a() {
await ...
console.log(111)
await ...
}

当执行a时,其不会阻塞涵数外面的代码(a内的代码会安顺序执行)

1. console.log('开始')
2. a()
3. console.log('a后面')
4. // 开始 -> a后面 -> 111

Class


产生的原因: 原ES5语法的没有成型的类的概念。而面向对象编程又离不开类的概念。

ES5定义一个类:

function Point(x, y) {
this.x = x;
this.y = y;
}
var p = new Point(1, 2)

ES6的class:

1. class Point {
2. constructor(x, y) {
3. this.x = x;
4. this.y = y;
5. }
6. }

其中:

constructor方法是类的默认方法,通过new 命令生成对象时会调用该方法,如果声明类时没有定义constructor,会默认定义一个空的。

生成实例时必须用new ,不用会报错

不存在变里提升(选定义类,再new实例)

类的静态方法:

所有在类中定义的方法都会被实例继承,如果不想被继承,可以在定义时加上static。表示为静态方法。


class Foo {
static match() {}
}
Foo.match()
const f = new Foo()
f.match() // 报错

类的静态属性


很遗憾,ES6没有给类设静态属性,但是可以用以下方法定义(有提案,写方同静态方法)

class Foo {}
Foo.porp = 1
// 使用
Foo.porp // 1

类的实例属性


类的方法默认被实例继承,那么属性呢?也是继承的,写法如下:

class Foo {
myProp = 111;
...
}

classr的继承 extends

1. class Point {}
2. class PointSon extends Point {
3. constructor(x, y, z) {
4. super(x, y)
5. this.z = z
6. }
7. }

其中:

super等同于父类的constructor。

子类必须在constructor中调用super, 也就是说用extends去继承一个类,就必须调用这个类(父类)的constructor。是因为子类没有自己的this对象,而是继承父类的this,然后对其进行加工

如果了类没有写constructor,会默认生成一个,并包含了super(...args)


相关文章
|
存储 分布式计算 数据库
阿里云国际版设置数据库云分析工作负载的 ClickHouse 版
阿里云国际版设置数据库云分析工作负载的 ClickHouse 版
|
Oracle Java 关系型数据库
聊聊 datax 的 OceanBase 数据同步插件 ||批处理参数 rewriteBatchedStatements=true&useCursorFetch=true
聊聊 datax 的 OceanBase 数据同步插件 分析下批处理参数 rewriteBatchedStatements=true&useCursorFetch=true 对大规模数据读写的性能影响
聊聊 datax 的 OceanBase 数据同步插件 ||批处理参数 rewriteBatchedStatements=true&useCursorFetch=true
|
Linux
CentOS 7.x时间同步服务chrony配置详解
文章详细介绍了在CentOS 7.x系统中如何安装和配置chrony服务,以及它与ntpd服务的对比,强调了chrony在时间同步方面的高效性和准确性。
1077 2
CentOS 7.x时间同步服务chrony配置详解
|
存储 安全 Java
Java.security包中的KeyStore类详解
Java.security包中的KeyStore类详解
797 0
|
开发框架 前端开发 Java
响应式编程实战(02)-响应式编程的适用场景
响应式编程实战(02)-响应式编程的适用场景
307 0
|
机器学习/深度学习 存储 弹性计算
阿里云服务器X86计算、ARM计算、GPU/FPGA/ASIC等架构区别及选择参考
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群之分,很多初次接触阿里云服务器的用户并不知道他们之间有何区别,本文来介绍一下阿里云服务器各个架构的特点及适用场景,以供大家了解他们之间的区别,从而对选择哪种架构做一个参考。
1884 2
阿里云服务器X86计算、ARM计算、GPU/FPGA/ASIC等架构区别及选择参考
阿里云软件著作权登记申请流程
阿里云软件著作权登记申请流程,阿里云计算机软件著作权登记20天下证,那么如何申请阿里云软件著作权登记呢?阿里云百科来详细说下注册账号、实名认证、软件著作权选择、信息填写、纸质材料邮寄一直到版权中心审查和下证详细说明:
678 1
阿里云软件著作权登记申请流程
|
编解码 图形学 Python
ArcMap:如何渲染一幅精美的地形图
ArcMap:如何渲染一幅精美的地形图
525 1
|
数据采集 Web App开发 Python
用Python爬取了拉勾网的招聘信息+详细教程+趣味学习+快速爬虫入门+学习交流+大神+爬虫入门
关于 一直埋头学习,不知当前趋势,这是学习一门技术过程中最大的忌讳。刚好利用python爬虫,抓取一下拉勾网关于python职位的一些基本要求,不仅能知道岗位的基本技能要求,还能锻炼一下代码能力,学以致用,一举两得。
1977 0
|
弹性计算 人工智能 负载均衡
什么是阿里云服务器?云服务器的优缺点
阿里云是阿里巴巴集团的旗舰云计算品牌,它为全球各种规模的企业提供了云计算服务。阿里云服务器是阿里云的一项核心业务,它是一种可靠的云服务解决方案,具有许多优势。
950 0