1. http 状态码
比较常见的:
200: 请求成功
301/302: 请求的URL已移走
404: 页面丢失,未找到资源
501: 服务器遇到错误,无法对请求资源提供服务
- 更多关于http状态码:juejin.cn/post/684490…
2. 数组去重
(1) Set 方法
Set 方法是ES6 新增的
Set 方法可以对数据进行去重操作
(特性:唯一性=>不重复=>能够对数据进行去重操作。
注:集合去重,是全等匹配,===。)
//'1'和1会两个都保存,NaN和NaN只会保存一个
let arr = [1, 2, 6, 3, 6, 9, 2, 4, 3]
let set = new Set(arr)
// set = [1, 2, 6, 3, 9, 4]
let arr2 = [1, 2, '6', 3, 6, 9, '2', 4, 3]
let set2 = new Set(arr)
// set2 = [1, 2, '6', 3, 6, 9, '2', 4]
(2) indexOf() 判断值是否存在
indexOf() 返回某个指定的字符串值在字符串中首次出现的位置。
stringObject.indexOf(searchValue,fromIndex)
// searchValue 必须。需检索的字符串值
// fromIndex 可选,字符串开始检索的位置
注意:indexOf 大小写敏感。如果检索的字符串值没有出现,返回-1
let arr = [1, 2, 6, 3, 6, 9, 2, 4, 3]
let newArr = []
for (let i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) < 0) {
newArr.push(arr[i])
}
}
//newArr = [1, 2, 6, 3, 9, 4]
(3) splice 方法
let arr = [1, 2, 6, 3, 6, 9, 2, 4, 3]
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1)
}
}
}
// arr = [1, 2, 6, 3, 9, 4]
3. typeof 和 instanceof 的区别
graph TD
数据类型 --> 基础类型
数据类型 --> 引用类型
基础类型 --> id1(null)
基础类型 --> id2(undefined)
基础类型 --> id3(string)
基础类型 --> id4(number)
基础类型 --> id5(boolean)
基础类型 --> id6(symbol)
基础类型 --> id7(bigint)
引用类型 --> id9(Object)
引用类型 --> id10(Function)
引用类型 --> id11(Array)
引用类型 --> id12(...)
typeof 和 instanceof 都是判断数据类型
主要区别:
-
typeof 返回一个变量的基本类型,instanceof 返回一个布尔值
-
instanceof 可以准确判断复杂引用数据类型,但不能正确判断基础数据类型
-
typeof 可以判断基础数据类型(null除外),但引用数据类型(除function)不能准确判断
4. 如何判断一个变量是对象还是数组?
prototype.toString.call()兼容性好
function isObjArr(value) {
if (Object.prototype.toString.call(value) === "[object Array]") {
console.log('value是数组');
} else if (Object.prototype.toString.call(value) === '[object Object]') {
console.log('value是对象');
} else {
console.log('value不是数组也不是对象');
}
}
注意:不能使用typeof来判断对象和数组,因为这两种类型都会返回"object"。
5. 线程和进程
对于操作系统来说,一个任务就是一个进程,例如打开一个浏览器就是一个浏览器进程。有些进程不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。我们把进程内的这些 “子任务”称为线程 。
每个进程至少要干一件事,所以,一个进程至少有一个线程。
- 进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)
- 线程是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)
浏览器的线程和进程:
(1) 浏览器进程(Browser进程) :主进程,负责协调、主控,只有一个
(2) GPU进程
(3) 第三方插件进程
(4) 浏览器渲染进程(Renderer进程): 一个标签页是一个Renderer进程
浏览器渲染进程的5种线程
(1) GUI渲染线程:
- 渲染浏览器界面,解析HTML、CSS,构建DOM树和RenderObject树等等。
- GUI渲染线程和JS引擎线程是互斥的。如果JS执行的时间过长,会造成页面的渲染不连贯,导致页面渲染加载阻塞。
(2) JS引擎线程:
- 负责处理JS脚本程序,解析JS脚本,运行代码。
- 一个Tab页(renderer进程)中无论什么时候都只有一个JS线程在运行JS程序 --> 单线程。
(3) 事件触发线程:
- 控制事件循环
- 当JS引擎执行代码块如setTimeOut时(也可是来自浏览器内核的其他线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件触发线程中;
- 当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理;
(4) 定时器触发线程:
- setInterval 和 setTimeout 所在线程
- 计时完毕后,添加到事件队列中,等待JS引擎空闲后执行
(5) 异步http请求线程:
- XMLHttpRequest连接后通过浏览器新开一个线程请求
- 检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将回调函数放入事件队列中,等待JS引擎空闲后执行
参考:
进程和线程
从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理
6. http请求的post 和 get 方式 区别
- get 方法是HTTP请求的默认方法,把参数通过key/value形式存放在URL。URL长度有限制,所以get方法的参数长度不能过长
- post 方法可以保证数据的保密性。
get 和 post 的区别
- get 提交的数据有大小限制(主要是URL的长度限制),post则没有大小限制
- get 可以被保存为书签, post 不可以
- get 能被缓存, post 不会
- post 更安全,参数不会被保存在浏览器历史或web服务器中
- post 用于修改和写入数据, get 一般用于搜索排序和筛选之类的操作
- get 回退无害, post 回退数据会被重新提交
- post 对数据类型没有限制, get 只允许二进制数据
参考:
http请求中get和post方法的区别
POST和GET的区别?