JS部分

1.说一下CORS?

CORS是一种新标准,支持同源通信,也支持跨域通信。fetch是实现CORS通信的

2.如何中断ajax请求?

一种是设置超时时间让ajax自动断开,另一种是手动停止ajax请求,其核心是调用XML对象的abort方法,ajax.abort()

3.说一下事件代理?

事件委托是指将事件绑定到目标元素的父元素上,利用冒泡机制触发该事件

ulEl.addEventListener('click', function(e){
    var target = event.target || event.srcElement;
    if(!!target && target.nodeName.toUpperCase() === "LI"){
        console.log(target.innerHTML);
    }
}, false);

4.说一下宏任务和微任务?

JS是单进程模式,他会先执行同步,再执行微队列,后在执行宏队列。
微队列:promise回调、mutation回调
宏队列:DOM事件回调、ajax回调、定时器回调

5.说一下继承的几种方式及优缺点?

  • 原型链继承
function Parent(){
this.name=["KE","gg"]
}
Parent.prototype.getName=(){
console.log(this.name)}
function.Child(){
 
}
Child.prototype=new Parent()
var child1=new Child()
child1.name.push("tt")//["KE","gg","tt"]
var child2=new Child()
child2.name.push("hh")//["KE","gg","tt","hh"]
优点:简单、父类和子类共享属性
缺点:1.引用类型属性共享,2.创建Child实例时,不能像Parent传入参数
  • 构造函数继承
function Parent(){
this.name=["KE","gg"]
}
Parent.prototype.getName=(){
console.log(this.name)}
function.Child(){
Parent.call(this)
}
 
var child1=new Child()
child1.name.push("tt")//["KE","gg",'tt']
var child2=new Child()
child2.name.push("hh")//["KE","gg",'hh']
比较原型链继承
优点:1.不会实例共享引用型属性,2.可以向父传参
缺点:每创建一次实例就会重新生成方法属性
原型链的优缺点和构造函数优缺点相反
  • 组合继承
function Parent(color){
this.name=["KE","gg"],
this.color=color
}
Parent.prototype.getName=(){
console.log(this.name)}
function.Child(color,age){
Parent.call(this,color)
this.age=age
}
Child.prototype=new Parent()
var child1=new Child("red")
child1.name.push("tt")//["KE","gg",'tt']
child1.color//red
var child1=new Child("green")
child1.name.push("hh")//["KE","gg",'hh']
child1.color//green
优点:融合了原型链和构造函数继承的优点
  • 原型式继承
function createObj(o){
function f(){}
f.prototype=os
return new f()
}
缺点:实例共享引用型的属性
  • 寄生式继承
function createObj(o){
var clone=Object.create(o)
clone.sayName=function(){
console.log(0)
}
return clone
}
缺点:创建一次实例创建一次方法
  • 寄生式组合继承
function object(o){
function f(){}
f.prototype=o
return new f()
}
function protot(child,parent){
var prototype=object(parent.prototype)
prototype.constructor=child
child.prototype=prototype
}
调用两次构造函数

6.说一下自己常用的es6的功能?

1.let、const
2.解构
3.模板字符串
4.es6模块导出
5.类写法
6.promise对象
7.箭头函数
参考文献:
https://www.cnblogs.com/XYQ-208910/p/11942974.html

7.什么是会话cookie,什么是持久cookie?

cookie是服务器返回的,指定了expire time(有效期)的是持久cookie,没有指定的是会话cookie

8.数组去重?

js

var arr=['12','32','89','12','12','78','12','32'];
    // 最简单数组去重法
    function unique1(array){
        var n = []; //一个新的临时数组
        for(var i = 0; i < array.length; i++){ //遍历当前数组
            if (n.indexOf(array[i]) == -1)
                n.push(array[i]);
        }
        return n;
    }
    arr=unique1(arr);
    // 速度最快, 占空间最多(空间换时间)
    function unique2(array){
        var n = {}, r = [], type;
        for (var i = 0; i < array.length; i++) {
            type = typeof array[i];
            if (!n[array[i]]) {
                n[array[i]] = [type];
                r.push(array[i]);
            } else if (n[array[i]].indexOf(type) < 0) {
                n[array[i]].push(type);
                r.push(array[i]);
            }
        }
        return r;
    }
    //数组下标判断法
    function unique3(array){
        var n = [array[0]]; //结果数组
        for(var i = 1; i < array.length; i++) { //从第二项开始遍历
            if (array.indexOf(array[i]) == i) 
                n.push(array[i]);
        }
        return n;
    }

es6

es6方法数组去重
arr=[...new Set(arr)];
es6方法数组去重,第二种方法
function dedupe(array) {
  return Array.from(new Set(array));       //Array.from()能把set结构转换为数组
}

9.get、post的区别

1.get传参方式是通过地址栏URL传递,是可以直接看到get传递的参数,post传参方式参数URL不可见,get把请求的数据在URL后通过?连接,通过&进行参数分割。psot将参数存放在HTTP的包体内

2.get传递数据是通过URL进行传递,对传递的数据长度是受到URL大小的限制,URL最大长度是2048个字符。post没有长度限制

3.get后退不会有影响,post后退会重新进行提交

4.get请求可以被缓存,post不可以被缓存

5.get请求只URL编码,post支持多种编码方式

6.get请求的记录会留在历史记录中,post请求不会留在历史记录

7.get只支持ASCII字符,post没有字符类型限制

10.你所知道的http的响应码及含义?

1xx(临时响应)

100: 请求者应当继续提出请求。

101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备进行切换。

2xx(成功)

200:正确的请求返回正确的结果

201:表示资源被正确的创建。比如说,我们 POST 用户名、密码正确创建了一个用户就可以返回 201。

202:请求是正确的,但是结果正在处理中,这时候客户端可以通过轮询等机制继续请求。

3xx(已重定向)

300:请求成功,但结果有多种选择。

301:请求成功,但是资源被永久转移。

303:使用 GET 来访问新的地址来获取资源。

304:请求的资源并没有被修改过

4xx(请求错误)

400:请求出现错误,比如请求头不对等。

401:没有提供认证信息。请求的时候没有带上 Token 等。

402:为以后需要所保留的状态码。

403:请求的资源不允许访问。就是说没有权限。

404:请求的内容不存在。

5xx(服务器错误)

500:服务器错误。

501:请求还没有被实现。

11.谈谈作用域、作用域链、

作用域:变量或者函数的有效作用范围

作用域链:我们需要查找某个变量值,会先在当前作用域查找,如果找不到会往上一级查,如果找到的话,就返回停止查找,返回查找的值,这种向上查找的链条关系,叫作用域

闭包:能够访问另一个函数作用域的变量的函数。闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量

12.箭头函数

箭头函数的 this 始终指向函数定义时的 this,而非执行时。箭头函数需要记着这句话:“箭头函数中没有 this 绑定,必须通过查找作用域链来决定其值(箭头函数本身没有this,但是在它声明时可以捕获别人的this供自己使用。),如果箭头函数被非箭头函数包含,则 this 绑定的是最近一层非箭头函数的 this,否则,this 为 undefined”。

特点:

  1. 没有this
  2. 没有arguments
  3. 不能通过new关键字调用
  4. 没有new.target
  5. 没有原型
  6. 没有super
参考链接:https://juejin.cn/post/6844904160719011848#heading-17

13.对promise的理解

      1.promise是解决回调地狱
      2.存在3个状态pedding、fullfill、reject
      3.构造函数时同步,then是异步
      4.状态改变后不能反转
      5..then和.catch都是生成新的promise

 14.判断类型的方式

1.typeof 对于object、arrary返回都是object

2.instanseof 会对该类型的父级的类型判断也为true

3. constructor 

4.Object.prototypeof.toString.call(xxx)

 
posted @ 2021-01-27 17:53  我不是小妖精  阅读(107)  评论(0)    收藏  举报