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区别
| UDP | TCP | |
|---|---|---|
| 是否连接 | 无连接 | 面向连接 |
| 是否可靠 | 不可靠传输,不使用、用流量控制和拥塞控制 | 可靠传输(数据顺序和正确性),使用流量控制和拥塞控制 |
| 连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
| 传输方式 | 面向报文 | 面向字节流 |
| 首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
| 适用场景 | 适用于实时应用,例如视频会议、直播 | 适用于要求可靠传输的应用,例如文件传输 |
9.tcp为什么需要三次握手四次挥手
- 三次握手的作用
第一次:客服端给服务端发送消息,服务端可以确定客户端能发送消息
第二次:服务端给客户端发送消息,客户端知道服务端能接受消息和发送消息
第三次:客户端给服务端发送消息,服务端知道客户端能收到消息
-四次挥手
第一次:客户端认为数据发送完毕,去和服务器说拜拜
第二次:服务器说我知道你要断开连接了,但是要等我的报文都发送完
第三次:服务端说报文发送完毕了
第四次:好的,我收到你发送完毕的消息啦
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
知道怎么做服务端渲染吗?
客户端渲染与服务端渲染