es6面试

1,const 和 let

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

在存在变理提升(不能在变量声明之前使用
let的暂时性死区: 其实与1差不多,只要在块作用域有声明,就不能在本作用域声明前用主个变量。
不允许重复声明。

const: 声明一个只读的常量
特点:
一但声明,这个值不能被改变(对于引用类型,是引用的地址不能被改变
声明时必须赋值

(附:其实面试中常会问到var let const 三个的区别,回答的时候注重各自的特点。

其实const let就是弥补var 的各种缺点(没有块级作用域,变量为全局变量windows等等),两者的特点就是var 的缺点。

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

2.解构赋值:
数组按照一定的模式从数组和对象中提取出来值然后对变量赋值,其实就是找规律看眼缘。
按照一定模式从数组或对象中提取值,然后对变量进行赋值(先提取,再赋值)

  1. 模板字符串
const h = 'hello'
`${ h } word`

${}中可以使用任意的javaScript表达试、运算、引用对象属性、函数调用等。结果是其返回值。
可以换行,但是所有的空格和换行会被保留。
特点:
可以换行,但是所有的空格和换行会被保留。
${}中可以使用任意的javaScript表达试、运算、引用对象属性、函数调用等。结果是其返回值。

  1. 函数的扩展
    函数的默认值
function m(x = 1) {}
. rest参数(用于获取函数的多余参数)

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

. 函头函数

特点:

函数体内的this = 定义时所在的对像
不可以当作构造函数(不能用new)
不可以用arguments对像,可以用rest
不可以用yield命令(不能用作Generator函数)

  1. 数组的扩展
    扩展运算符。
    用于替代数组的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])
合并数组
// ES5
[1, 2].concat(3)
// ES6
[1, 2, ...[3]]

新增的方法
Array.from()将类数组转为数组
可遍历的对象(iterable)(Set, Map)
类似数组的对
{ ‘0’: ‘a’, ‘1’: ‘b’ }
实例的方法
find()findIndex()找出第一个符合条件的成页/下标(位置)
entries()keys()values() 用于遍历数组。(配合for…of)
includes() 是否存在指定无素(返回布尔值)。

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

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

  1. 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

特点:

为了解决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 时接受一个数组

const obj = { a: ‘aa’}
const m = new Map([
[‘name’: ‘ym’],
[obj, { b: ‘bbbb’ }]
])
这段时间有一个很火的文章讲如何使用map组构来优化长长的if…else的。

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

特点:

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

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主要为对象而设计的)

  1. Generator与async await
    generator是ES6提供的一种异步编程解决方案。使异步写法更像同步。

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

用法:

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

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

console.log('开始')
a()
console.log('a后面')
// 开始 -> a后面 -> 111
  1. Class
    产生的原因: 原ES5语法的没有成型的类的概念。而面向对象编程又离不开类的概念。

ES5定义一个类:

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

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

其中:

constructor方法是类的默认方法,通过new 命令生成对象时会调用该方法,如果声明类时没有定义constructor,会默认定义一个空的。
生成实例时必须用new ,不用会报错
不存在变里提升(选定义类,再new实例)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值