ES6基础知识?

245 阅读5分钟

1.var、let、const之间的区别?

1.var声明变量可以重复声明,而let不可以重复声明var是不受限于块级的,而let是受限于块级的
2.var会与window相映射,而let不与window相映射
3.var可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错
4.const声明之后必须赋值,否则会报错
5.const定义不可变的量,改变了就会报错
6.constlet一样不会与window相映射,支持块级作用域,在声明的上面访问变量会报错

2.使用箭头函数应注意什么?

1.用了箭头函数,this就不是指向window,而是父级(指向是可变的)
2.不能够使用arguments对象
3.不能用作构造函数,这就是说不能够使用new命令,否则会抛出一个错误
4.不可以使用yield命令,因此箭头函数不能用作Generator函数

3.ES6的模板字符串有哪些新特性?

1.基本的字符串格式化
2.将表达式嵌入字符串中进行拼接
3.能解决类模板字符串的功能
let povid = 'java';
let name = '张三'let str = `${name}在学习${povid}`;
str = str.replace(/\$\{([^}]*)\}/g,function(){
return eval(arguments[1]);
})
console.log(str);//张三在学习java

4.介绍下Set、Map的区别?

Set(数据重组):
1.成员不能重复
2.只有键值没有键名,类似数组
3.可以遍历,方法有add,delete,has
Map(数据存储)
1.本质上是键值对的集合,类似集合
2.可以遍历,可以跟各种数据格式转换

5.ES6里的class?

//定义类
class Person{
constructor(x,y){
//构造方法
//this代表实例对象
this.x=x;
this.y=y;
}
toString(){
return "("+this.x+','+this.y+")";
}
}

6.Promise构造函数是同步执行还是异步执行,then()?

Promise构造函数是同步执行的,then方法是异步执行的.

7.setTimeout、Promise、Async/Await的区别?

事件循环中分为宏任务队列和微任务队列.其中setTimeout的回调函数放到宏任务队列里,
等到执行栈清空以后执行promise.then里的回调函数会放到相应宏任务的微任务队列里,
等宏任务里面的同步代码执行完在执行async函数表示函数里面可能会有异步方法,
await后面跟一个表达式.async方法执行时,遇到await会立即执行表达式,
然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行

8.promise有几种状态,什么时候会进入catch?

//三个状态:
pending、fulfilled、reject
//两个过程:
pedding -> fulfilled、padding -> rejected当pending为rejected时,会进入catch
#### 9.下面的输出结果是多少?
const promise = new Promise((resolve,reject)=>{
console.log(1);
resolve();
console.log(2);
})

promise.then(()=>{
console.log(3);
})
console.log(4);
Promise新建后立即执行,所以会先输出1,2Promise.then()内部的代码在当次事件循环的结尾立即执行,所以会继续输出4,最后输出3

10.使用解构赋值,实现两个变量的值得交换?

let a = 1;
let b = 2;
[a,b] = [b,a]

11.创建一个对象,键名的类型至少包含一个symbol类型,并且实现遍历所有Key?

let name = Symbol('name');
let son = {
[name]:'李四',
'age':18
}
Reflect.ownKeys(son);

12.Set结构,输出多少?

let A = newSet();
A.add([1]);
A.add([1]);
console.log(A.size);//2
两个数组[1]并不是同一个值,他们分别定义的数组,在内存中分别对应着不同的储存地址,因此并不是相同的值都能储存到Set结构中,所以为2

13.Promise中reject和catch处理上有什么区别?

1.reject是用来抛出异常的,catch是用来处理异常的
2.reject是Promise的方法,而catchPromise实例的方法
3.reject后的东西,一定会进入then中的第二个回调,如果then中没有写第二个回调,则进入catch
4.网络异常(比如断网),会直接进入catch而不会进入then的第二个回调

14.使用class手写一个promise?

//创建一个Promise的类
class Promise{
//构造函数constructor里面是个执行器
constructor(executer){
//默认的状态pending
this.status = 'pending';
//成功的值默认undefined
this.value = undefined;
//失败的值默认undefined
this.reason = undefined;
//状态只有在pending时候才能改变
let resolveFn = value =>{
//判断只有等待时才能resolve成功
if(this.status == pending){
this.status = 'resolve';
this.value = value;
}
}
let rejectFn = reason =>{
//判断只有等待时才能进入reject失败
if(this.status == pending){
this.status = 'reject';
this.reason = reason
}
}
try{
//把resolve和reject两个函数传给执行器executer
executer(resolve,reject);
}catch(e){
//失败的话进catch
reject(e);
}
}
then(onFulfilled,onReject){
//如果状态成功调用onFulfilled
if(this.status = 'resolve'){
onFulfillled(this.value);
}
//如果状态失败调用onReject
if(this.status = 'reject'){
onReject(this.reason)
}
}
}
#### 15.如何使用Set去重?
let arr = [1,2,2,3,4,1];
let item = [...new Set(arr)];
console.log(item);//[1,2,3,4]
#### 16.for循环改为for of 形式?
let arr = [11,22,33,44,55];
let sum = 0;
for(let i = 0;i<arr.length;i++){
sum += arr[i];
}
//for of
let arr = [11,22,33,44,55];
let sum = 0;
for(value of arr){
sum += value;
}

17.理解async/await以及对Generator的优势?

1.async await是用来解决异步的,async函数是Generator函数的语法糖
2.使用关键字async来表示。在函数内部使用await来表示异步
3.async函数返回一个Promise对象,可以使用then方法添加回调函数
4.当函数执行的时候,一旦遇到awwit就会先返回,等到异步操作完成,再接着执行函数体内后面的语句
async=>Generator的优势:
1.内置执行器.Generator函数的执行必须依靠执行器,而Async函数自带执行器,调用方式跟普通函数调用一样
2.更好的语义.asyncawait相较于*和yield更加语义化
3.更广的适用性.yield命令后面只能是Thunk函数或Promise对象,async函数的await后面可以是Promise也可以是原始类型的值
4.返回值是Promise.async函数返回的是Promise对象,逼Generator函数返回的iterator对象方便,可以直接使用then()方法进行调用
#### 18.forEach、for infor of三者的区别?
1.forEach更多的用来遍历数组
2.for in 一般常用来遍历对象或json.(循环出的是key)
3.for of 数组对象都可以遍历,遍历对象需要通过和Object.keys().(循环出的是value)

19.ES6的import导入导出模块?

//导入(import)
//只导入一个
import {num} from './num.js'
//导入多个
import {num,time} from './numTime.js'
//导入一整个模块
import * as nTime from './numTime.js'
//导出(export)
//可以将export放在任何变量,函数或类声明的前面 
export var firstName = 'Michael';
 //也可以使用大括号指定所要输出的一组变量
 var firstName = 'Michael'; 
 var lastName = 'Jackson';
 export {firstName, lastName}; 
 //使用export default默认导出
 let bosh = function crs(){} 
 export default bosh;