ES6经典面试题
1.箭头函数有哪些特性
1、箭头函数是匿名函数,不绑定自己的this,arguments,super,new.target
2、箭头函数会捕获其所在上下文的this值,作为自己的this值,在使用call/apply绑定时,相当于只是传入了参数,对this没有影响
3、箭头函数不绑定arguments,取而代之用rest参数…解决
4、箭头函数当方法使用的时候,没有定义this绑定
5、箭头函数不能作为构造函数,和 new 一起用就会抛出错误
6、箭头函数没有原型属性
7、不能简单返回对象字面量
2.实现数组过滤重复
Let s = [...new Set(arr)]
3.使用json方式实现深拷贝
let arr2 = JSON.parse(JSON.stringify(arr1));
4.ES6模板字符串有哪些好处
a. 在ES5拼接的时候,如果结构需要换行,必须使用转义符;在ES6中,使用模板字符串,直接使用html结构即可
b. 在ES5中,单引号和双引号必须注意嵌套问题,在ES6中,就不需要考虑;
c. 模板字符串中,可以写js语句
d. 方便简洁,不容易出错;
5.关于对象扩展的属性简写和属性名表达方式写法,请各举一个例子
1. 属性的简写:必须属性名和变量名相同
3. 属性表达式:[]里面可以是变量,字符串,数字,表达式
注意:如果对象的属性是数字,不可以使用点进行访问
属性名简写:
var title = 'offc';
var size = 10;
var obj = {
title,
size,
};
属性名表达式:
var title = 'offc';
obj[title] = '简书';
6.手写promise
var p = new Promise((resolve,reject)={
if(1){
resolve(‘成功’)
}
else{
reject(‘失败’);
}
})
p.then((res)=>{}).catch((err)=>{})
7.用class定义一个类
class Aniaml{
static Type = ‘动物’
constructor(newName){
this.name = newName
}
eat(){conosle.log(‘吃东西’)}
static sayHi(){
console.log(‘大家好’)
}
}
8.class实现继承
class Tigger extends Animal{
constructor(props){
super(props)
}
}
9.谈一下对async。。。。await的理解
async...await是基于promise的generator语法糖,它用来等待promise的执行结果,常规函数使用await没有效果;async修饰的函数内部return不会得到预期的结果,会得到一个promise对象;await等待的promise结果是resolve状态的内容,reject状态的内容需要使用try...catch获取,await关键字必须要出现在async修饰的函数中,否则报错。
10.ES6中的symbol类型有什么作用
ES6新增了Symbol数据类型,它用来生成一个独一无二的值,它Symbol数据常用来给对象属性赋值,让对象属性具备唯一性,不容易被覆盖。
11.class类中的super有哪些用法
Super在类中有两种用法,一个是super方法,一个是super对象;super方法只能出现在constructor方法中,super对象一般出现在子类覆盖父类的方法中。
12.静态和成员的区别
静态的变量或方法归类所有,全局独一份,成员的变量或方法归对象所有,每次实例化对象成员方法和成员变量就会得到一份拷贝;对于一些通用性的属性或方法,可以考虑设置为静态。
13.谈一体你多promise的理解
Promise用来解决异步回调问题,由于js是单线程的,很多异步操作都是依靠回调方法实现的,这种做法在逻辑比较复杂的回调嵌套中会相当复杂;也叫做回调地狱;promise用来将这种繁杂的做法简化,让程序更具备可读性,可维护性;promise内部有三种状态,pedding,fulfilled,rejected;pedding表示程序正在执行但未得到结果,即异步操作没有执行完毕,fulfilled表示程序执行完毕,且执行成功,rejected表示执行完毕但失败;这里的成功和失败都是逻辑意义上的;并非是要报错。其实,promise和回调函数一样,都是要解决数据的传递和消息发送问题,promise中的then一般对应成功后的数据处理,catch一般对应失败后的数据处理。Promise状态一旦确定,就不会再次发生改变
14.深拷贝的原理
Js的深拷贝发生在对象的赋值上,对象赋值的时候仅仅是一个引用赋值,也就是说两个不同变量名指向的是同一份内存空间;基本数据类型则不存在这样的行为;要完成对象的深拷贝需要使用递归遍历所有对象的属性进行赋值,也可以使用JSON.stringfy和JSON.parse操作。
15.set和map的区别
Set是一种类似数组的集合类型,它与数组不同的是,不允许存在重复数据;常用操作方法有:add,delete,has,clear等;遍历使用forEach;
Map是一种类似对象的集合类型,它与对象不同的是,key可以接受对象类型,常用的操作方法有:set,get,has,delete等;遍历使用forEach
16.node的特点是什么
1)它是一个Javascript运行环境
2)依赖于Chrome V8引擎进行代码解释
3)事件驱动
4)非阻塞I/O
5)轻量、可伸缩,适于实时数据交互应用
6)单进程,单线程
17.module.exports和exports的区别,请用代码示范
Exports和module.exports的区别:
1)exports相当于在js文件的首行写了let exports = module.exports;(但是实际情况不需要写,否则报错)
2)exports不可以直接赋值,如果直接赋值相当于与module.exports切断了联系,没有了导出功能;
3)如果exports和module.exports同时导出,exports就失去了导出的功能;
4)注意点:module.exports只使用一次即可,多个变量输出的时候,可以使用对象的形式
18.MIME类型有什么作用
MIME的全称是Multipurpose Internet Mail Extensions,即多用途互联网邮件扩展类型。这是HTTP协议中用来定义文档性质及格式的标准。服务器通过MIME告知响应内容类型,而浏览器则通过MIME类型来确定如何处理文档。
常见MIME类型:
application/octet-stream?未知的应用程序文件
application/json?json数据
text/plain未知的文本文件(纯文本文件),浏览器会认为这是可以直接显示的
注:?浏览器分辨文件是基于MIME的,而不会把文件打开查看是否是其他类型,例如用link链接了一个标记为text/plain的文件,就算此文件是css文件,就算其后缀是.css,浏览器依旧不认
text/css?css文件
text/html?HTML文件
image/gif?gif文件
常见的还有image/jpeg、image/png、image/svg
很多浏览器支持icon image/x-icon
let和var的区别
1)let是块作用域,var是函数作用域
2)let没有变量声明提升,var有声明提升
3)存在暂时性死区(TDZ),暂时性死区所指的问题基本都是 先声明后使用的问题
4)在let声明变量所在的作用域,不能重复声明同名变量
20.iterator的作用是什么,怎么布置iterator接口。
1、统一数据结构(数组,对象,map,set,数组包对象,对象包数组)的遍历方式
2、在数据结构上部署iterator接口:所谓的部署接口表现形式为,给对象或数组等集合增加iterator属性,属性的内容是一个根据iterator接口规范自行实现的方法
21cookie和session的区别
session是区别于数据库存在的一种服务器临时存储技术, 它主要存储一些无需持久化的数据, 比如临时的登录状态信息等
cookie是存在于浏览器上的一种浏览器本地存储的方式, 同域名下的cookie不同标签页可以共享, 默认过期时间是浏览器关闭时, 而且在进行http请求时, 会自动带上浏览器全部的cookie发给后台, 后台也可以获取cookie, 设置可以在响应时, 想浏览器中设置cookie。