ES6新增功能(部分)

126 阅读3分钟

ES6全称 ECMAScript 6.0,也是一个统称,是 Javascript 2015.06 及以后版本的统称

1. let关键字

自从知道 let 关键字后,我就很少用 var 关键字来声明变量了,它有以下几个特点要注意一下:

1.1 使用 let 关键声明的变量有块级作用域

块级作用域就是 { } 中的作用域,像if中和for中的 { } 就是一个块级作用域,如果在for中使用 var 来声明计数器 i 的话,那这个 i 就会成为全局变量,在for循环结束后 i 的值还会存在,如下所示:

 for (var i = 0; i < 10; i++) {
 }
console.log(i); // 10

而使用 let 来声明计数器就不会有这个问题

  for (let i = 0; i < 10; i++) {
  }
console.log(i); // i is not defined

1.2 使用 let 声明的变量没有变量提升,必须先声明才能使用

变量提升就是把所有的变量声明全部提升到最前面

console.log(a)
var a = 10 // undefined

// 相当于如下代码
var a
console.log(a);
a = 10
console.log(a)
let a = 10 // 直接报 Cannot access 'a' before initialization

1.3 使用 let 关键字声明的变量具有暂时性死区特性

// 定义一个全局变量
 var a = 10
// 一个块级作用域
{
console.log(a);
let a = 20
}

上面代码执行后会报 Cannot access 'a' before initialization(初始化之前无法访问) 的错误,它无法访问到外部的 a ,因为在块级作用域中声明了一个变量 a ,这个 a 就和这个块级作用域绑定了。

2. const关键字

const 关键字是 js 用来声明常量的,常量懂的都懂,就是无法被更改的值,这么说好像也不对,也可以说是无法被更改的变量,反正大概就是这个意思吧。

用 const 关键字声明的常量也有块级作用域和不存在变量提升

2.1 使用 const 定义的常量必须赋初始值

 const a

这段代码直接就会报错

 const a = 10

这样才是正确的

2.2 使用const定义常量后的值不可更改

当然,这得分情况,如果是基本数据类型,那值确实无法修改,但如果是复杂数据类型的话,数据结构内部的值是可以更改的,但是数据结构本身的值是不可更改的。

// 利用字面量的方式定义了一个数组
const arr = ['bbb', 'yuanshen', 'epic seven']
arr[0] = 'lol'
arr[1] = 'cf'

因为数组属于复杂数据结构,所以它内部的值是可以更改的,上面操作正确

const arr = ['bbb', 'yuanshen', 'epic seven']
arr = ['a', 'b']

直接对数组赋值会报Assignment to constant variable.(赋值给常数变量)的错误。

3. 数组解构

数组解构允许我们按照一 一对应的关系从数组中提取值

let arr = ['bbb', 'yuanshen', 'epic seven']
let [a, b, c, d, e] = arr
console.log(a); // bbb
console.log(b); // yuanshen
console.log(c); // epic seven
console.log(d); // undefine
console.log(e); // undefine

4. 对象解构

对象解构允许我们使用变量的名字匹配对象的属性,匹配成功将对象的值赋值给变量

let obj = {
name: 'bbb',
time: 687
}

let {name,time} = obj

使用指定的变量名字来接收解构的变量

let obj = {
name: 'bbb',
time: 687
}
// 此处的 n 和 t 才是用户声明并接收对象值的变量名
let{name:n,time:t} = obj

5. 箭头函数

这是我最喜欢的一个了,它的出现大大的简化了函数定义的语法,太妙了

5.1 简单使用

const fn = () => {
console.log('bbb');
}
fn()

5.2 省略函数体大括号和return

const fn = (v, i) => console.log(v, i)
fn('bbb', 1)

在箭头函数中,如果函数体中只有一句代码,并且代码的执行结果就是函数的返回值,函数体大括号可以省略

5.3 省略形参外侧的小括号

const fn = v => console.log(v)
fn('bbb')

在箭头函数中,如果形参只有一个,形参外侧的小括号也是可以省略的

5.4 箭头函数中this指向的问题

const obj = {
name: 'bbb'
}

function fn() {
console.log(this);
return () => {
console.log(this);
 }
}

var fun = fn.call(obj)
fun()

// 结果是 {name: 'bbb'} {name: 'bbb'}

箭头函数不绑定this,箭头函数没有自己的 this 关键字,如果在箭头函数中使用 this,那么 this 将指向箭头函数定义位置中的 this

上面代码中因为使用了call 改变了fn 函数的 this 指向,现在 fn 函数中的 this 指向的是 obj 对象,fun中保存的是返回的箭头函数,因为箭头函数中的 this 指向的是箭头函数定义位置中的 this,也就是指向 fn,而 fn 已经被改变了指向,所以箭头函数也跟着改变了指向,最后指向了obj对象

6. 剩余参数

因为箭头函数中是无法使用argument来访问所有实参的,所以只能使用剩余参数来获取箭头函数的实参

const fn = (...args) => {
args.forEach(v => console.log(v))
}

fn(1, 2)
fn(1, 2, 3)

剩余参数和数组解构配合使用来合并数组

const arr = ['yuanshe', 'bbb', 'epic seven']
// s1得到的是'yuanshe',s2得到的仍然是一个数组,是['bbb', 'epic seven']
let [a1, ...a2] = arr
console.log(a1);
console.log(a2);

7. 扩展运算符

扩展运算符 ... 可以把数组类型转换成类似离散型数据,也就是将本来 [1,2,3] 的数据转换成 1,2,3 类型的数据

利用扩展运算符也可以来合并数组,就像上面写的那样,在函数形参中 ... 叫剩余参数,而在别的地方它又叫扩展运算符,可以将伪数组转换成真正的数组,如下:

let lis = document.querySelectorAll('li')
let arr = [...lis]
// 此时 arr 是一个真正的数组了,所以可以使用数组中的push方法来追加数据
arr.push('span')

8. 模板字符串

模板字符串是用 反引号来包括的,其上档符号是“~ ”

8.1 模板字符串中可以引用变量、常量

let a = '变量'
const b = '常量'
const str = `我要引用${a},我还要引用${b}`

8.2 模板字符串中可以换行

const str = `
        我要换行了,啊哈哈哈哈
        -----------------
        我真的换行了
        `

8.3 模板字符串中可以调用函数

const fn = () => console.log('我是一个被调用的函数');
const str = `啊哈哈哈哈${fn()}`

以上就是我所学的ES6新增的部分功能,还有很多新特性还没学,学了之后再添加进来。