1.var、let、const之间的区别?
1.var声明变量可以重复声明,而let不可以重复声明var是不受限于块级的,而let是受限于块级的
2.var会与window相映射,而let不与window相映射
3.var可以在声明的上面访问变量,而let有暂存死区,在声明的上面访问变量会报错
4.const声明之后必须赋值,否则会报错
5.const定义不可变的量,改变了就会报错
6.const和let一样不会与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);
4.介绍下Set、Map的区别?
Set(数据重组):
1.成员不能重复
2.只有键值没有键名,类似数组
3.可以遍历,方法有add,delete,has
Map(数据存储)
1.本质上是键值对的集合,类似集合
2.可以遍历,可以跟各种数据格式转换
5.ES6里的class?
class Person{
constructor(x,y){
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,2 而Promise.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);
两个数组[1]并不是同一个值,他们分别定义的数组,在内存中分别对应着不同的储存地址,因此并不是相同的值都能储存到Set结构中,所以为2
13.Promise中reject和catch处理上有什么区别?
1.reject是用来抛出异常的,catch是用来处理异常的
2.reject是Promise的方法,而catch是Promise实例的方法
3.reject后的东西,一定会进入then中的第二个回调,如果then中没有写第二个回调,则进入catch
4.网络异常(比如断网),会直接进入catch而不会进入then的第二个回调
14.使用class手写一个promise?
class Promise{
constructor(executer){
this.status = 'pending';
this.value = undefined;
this.reason = undefined;
let resolveFn = value =>{
if(this.status == pending){
this.status = 'resolve';
this.value = value;
}
}
let rejectFn = reason =>{
if(this.status == pending){
this.status = 'reject';
this.reason = reason
}
}
try{
executer(resolve,reject);
}catch(e){
reject(e);
}
}
then(onFulfilled,onReject){
if(this.status = 'resolve'){
onFulfillled(this.value);
}
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);
#### 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];
}
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.更好的语义.async和await相较于*和yield更加语义化
3.更广的适用性.yield命令后面只能是Thunk函数或Promise对象,async函数的await后面可以是Promise也可以是原始类型的值
4.返回值是Promise.async函数返回的是Promise对象,逼Generator函数返回的iterator对象方便,可以直接使用then()方法进行调用
#### 18.forEach、for in、for of三者的区别?
1.forEach更多的用来遍历数组
2.for in 一般常用来遍历对象或json.(循环出的是key)
3.for of 数组对象都可以遍历,遍历对象需要通过和Object.keys().(循环出的是value)
19.ES6的import导入导出模块?
import {num} from './num.js'
import {num,time} from './numTime.js'
import * as nTime from './numTime.js'
export var firstName = 'Michael';
var firstName = 'Michael';
var lastName = 'Jackson';
export {firstName, lastName};
let bosh = function crs(){}
export default bosh;