前端笔试题目整理总结 (比较常见基础)之一

137 阅读3分钟

1. http 状态码

比较常见的:
200: 请求成功
301/302: 请求的URL已移走
404: 页面丢失,未找到资源
501: 服务器遇到错误,无法对请求资源提供服务


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)不能准确判断

  • 更多: 面试官:typeof 与 instanceof 区别


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"。

来源参考:juejin.cn/post/684490…


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的区别?