面试合集2

144 阅读5分钟

1. 判断数据类型的方式有哪些

  • typeof:其中数组、对象、null都会被判断为object,其他判断都正确。

  • instanceof:可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型

    注意* instanceof只能判断引用数据类型,而不能判断基本数据类型。instanceof运算法可以来测试一个对象在其原型链中是否存在一个构造函数的prototype属性

  • Object.prototype.toString.call()使用Object对象的原型方法toString来判断数据类型。

    同样是检测对象obj调用toString方法,obj.toString()的结果和Object.prototype.toString.call(obj)的结果不一样,这是为什么?

    这是因为toString是Object的原型方法,而Array、function等类型作为Object的实例,都重写了toString方法。

2. undefind和null?

undefined 代表的含义是未定义,null 代表的含义是空对象。一般变量声明了但还没有定义的时候会返回 undefined,null主要用于赋值给一些可能会返回对象的变量,作为初始化。

3. 深拷贝有了解过吗?

  • JSON方法实现:JSON.parse(JSON.stringify(obj))
  • 使用递归的方式:
/使用递归的方式实现数组、对象的深拷贝
function deepClone1(obj) {
  //判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
  var objClone = Array.isArray(obj) ? [] : {};
  //进行深拷贝的不能为空,并且是对象或者是
  if (obj && typeof obj === "object") {
    for (key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (obj[key] && typeof obj[key] === "object") {
          objClone[key] = deepClone1(obj[key]);
        } else {
          objClone[key] = obj[key];
        }
      }
    }
  }
  return objClone;
}
  • lodash函数库实现深拷贝,lodash很热门的函数库,提供了lodash.cloneDeep()实现深拷贝

  • jquery实现深拷贝

    jquery 提供一个  $.extend

var array1 = [1,2,3,4];
var array2 = $.extend(true,[],array1); // true为深拷贝,false为浅拷贝
console.log(array1 === array2);  // false

4.JSON.parse(JSON.stringify())能深拷贝函数吗?

function a(){}
let b=JSON.parse(JSON.stringify(a))
console.log(b)

会报错

VM301:1 Uncaught SyntaxError: Unexpected token u in JSON at position 0 at JSON.parse (<anonymous>) at <anonymous>:4:12

5.es6用到过哪些

let const

箭头函数

扩展运算符

解构赋值

promise

proxy

模板语法

6.用promise去实现请求a接口,a接口的返回值是b接口的入参

new Promise((resolve,reject)=>{
    //模仿请求a接口
    function a (){
        return 1
    }
    resolve(a())
}).then(e=>{
    //模仿请求b接口
    function b(a){  
        return ++a
    }
    console.log(b(e))
})

promise为什么可以链式调用下去? 因为promise执行完返回的也是一个Promise对象 那么返回的promise和前面的promise有关联吗?

7.async有了解过吗?

async/await是generator的语法糖

8.tcp和udp区别

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用、用流量控制和拥塞控制可靠传输(数据顺序和正确性),使用流量控制和拥塞控制
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
适用场景适用于实时应用,例如视频会议、直播适用于要求可靠传输的应用,例如文件传输

9.tcp为什么需要三次握手四次挥手

  • 三次握手的作用

image.png

第一次:客服端给服务端发送消息,服务端可以确定客户端能发送消息

第二次:服务端给客户端发送消息,客户端知道服务端能接受消息和发送消息

第三次:客户端给服务端发送消息,服务端知道客户端能收到消息

-四次挥手

image.png

第一次:客户端认为数据发送完毕,去和服务器说拜拜

第二次:服务器说我知道你要断开连接了,但是要等我的报文都发送完

第三次:服务端说报文发送完毕了

第四次:好的,我收到你发送完毕的消息啦

10.通信安全你有过了解吗?

比如别人写script标签去注入到你的程序

转义成纯文本

比如掘金、Markdown、code都有代码块的注入

如何区别别人写的代码还是我写的代码呢

局部变量去更新,包括vue本质上都是innerHtml

innerHtml一般不用

11.vue里面v-for中key的作用

虚拟dom

12.v-if和v-show的区别

服务端返回2345状态码什么意思?

2开头请求成功 3缓存 4客户端错误 5服务端错误

tcp是怎么保证丢包还能正常返回的

TCP使用两套独立的机制来完成重传,一是基于时间,二是基于确认信息

TCP在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号

用什么软件去抓tcp的包

数据结构里面有一个平衡二叉树

hashMap树有听说过吗?

js中常见的设计模式

给你一个class能实现一个单例模式吗?

给你dom结构实现三角形

div {
    width: 0;
    height: 0;
    border-top: 50px solid red;
    border-right: 50px solid transparent;
    border-left: 50px solid transparent;
}

忘记设置border大小了变成了一条线

vue生命周期

发起一个请求放在哪个生命周期会比较好

watch具体是怎么实现的知道吗

子组件怎么改父组件(一般是不能改的,容易循环下去)

兄弟组件的通信方式

vuex

发布订阅模式

发布订阅模式核心原理是什么

能描述一下vue从初始化页面、修改数据到最后刷新UI的一个过程吗?

修改数据UI刷新的

mvvm和mvc

知道怎么做服务端渲染吗?

客户端渲染与服务端渲染

有用到哪些组件库吗?(18:32)