前端校招面试题库

前端校招面试题库

转转

篇一

来自 https://www.nowcoder.com/discuss/783584

http的状态码

状态码 英文名称 中文描述
100 Continue 继续。客户端继续处理请求
200 OK 请求成功。请求所希望的响应头或数据体将随此响应返回
201 Created 请求以实现。并且有一个新的资源已经依据需求而建立
202 Accepted 请求已接受。已经接受请求,但还未处理完成
301 Moved Permanently 永久移动。请求的资源已被永久地移动到新 URI,返回信息会包含新的 URI,浏览器会自动定向到新 URI
302 Found 临时移动。与 301 类似。但资源只是临时被移动,客户端应继续使用原有 URI
304 Not Modified 未修改。如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码
400 Bad Request 客户端请求的语法错误,服务器无法理解;请求的参数有误
403 Forbidden 服务器已经理解请求,但是拒绝执行它
404 Not Found 请求失败,请求所希望得到的资源未被在服务器上发现
409 Conflict 由于和被请求的资源的当前状态之间存在冲突,请求无法完成
500 Internal Server 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到无效的响应
503 Service Unavailable 由于临时的服务器维护或者过载,服务器当前无法处理请求,一段时间后可能恢复正常

http的请求方法

  • GET:get 方法一般用于获取服务器资源
  • POST:post 方法一般用于传输实体主体
  • PUT:put 方法一般用于传输文件
  • DELETE:delete 方法用于删除文件
  • HEAD:head 方法用于获取报文首部,不返回报文主体
  • OPTIONS:向服务器发送该方法,会返回对指定资源所支持的 HTTP 请求方法。

http报文

(楼主写的是http内容报文,预测是问http请求和响应报文内容)

  • 用于 HTTP 协议交互的信息被称为 HTTP 报文。客户端的 HTTP 报文叫请求报文,服务端的 HTTP 报文叫响应报文。
  • 请求报文 是由请求行(请求方法、协议版本)、请求首部(请求 URI、客户端信息等)和内容实体(用户信息和资源信息等,可为空)构成。

alt

  • 响应报文 是由状态行(协议版本、状态码)、响应首部(服务器名称、资源标识等)和内容实体(服务端返回的资源信息)构成。

alt

基本数据类型,判断方法

(根据楼主下一题,预测是问JavaScript基本数据类型,判断方法应该是问数组几种判断方法)

JavaScript共有八种数据类型,分别是 UndefinedNullBooleanNumberStringObjectSymbolBigInt。 其中 Symbol 和 BigInt 是ES6 中新增的数据类型:

  • Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。
  • BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。

这些数据可以分为原始数据类型和引用数据类型:

  • 栈:原始数据类型(Undefined、Null、Boolean、Number、String)
  • 堆:引用数据类型(对象、数组和函数)

两种类型的区别在于存储位置的不同:

  • 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
  • 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

堆和栈的概念存在于数据结构和操作系统内存中,在数据结构中:

  • 在数据结构中,栈中数据的存取方式为先进后出。
  • 堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。

在操作系统中,内存被分为栈区和堆区:

  • 栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  • 堆区内存一般由开发着分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。

JavaScript 判断数组的五种方法

1、instanceof

const arr= []
instanceof arr === Array // true

2、Array.isArray

const arr = []
Array.isArray(arr) // true

const obj = {}
Array.isArray(obj) // false

3、Object.prototype.isPrototypeOf

  • 使用 Object 的原型方法 isPrototypeOf,判断两个对象的原型是否一样, isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上。
const arr = []
Object.prototype.isPrototypeOf(arr, Array.prototype) // true

4、Object.getPrototypeOf

const arr = []
Object.getPrototypeOf(arr) === Array.prototype // true

5、Object.prototype.toString

const arr = []
Object.prototype.toString.call(arr) === '[object Array]' // true

const obj = {}
Object.prototype.toString.call(obj) // "[object Object]"
  • 为什么不直接用 obj.toString()呢? 这是因为 toString 为 Object 的原型方法,而 Array,function 等类型作为 Object 的实例,都重写了 toString 方法。不同的对象类型调用 toString 方法时,根据原型链的知识,调用的是对应的重写之后的 toString 方法,而不会去调用 Object 上原型 toString 方法(返回对象的具体类型),所以采用 obj.toString()不能得到其对象类型,只能将 obj 转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用 Object 上原型 toString 方法。

typeof null输出object的原因是什么

简单来说,typeof null的结果为Object的原因是一个bug。在 javascript 的最初版本中,使用的 32位系统,js为了性能优化,使用低位来存储变量的类型信息。

数据类型 机器码标识
对象(Object) 000
整数 1
浮点数 010
字符串 100
布尔 110
undefined -2^31(即全为1)
null 全为0

在判断数据类型时,是根据机器码低位标识来判断的,而null的机器码标识为全0,而对象的机器码低位标识为000。所以typeof null的结果被误判为Object

[{}] 输出什么

(根据楼主回答,题目应该是问Boolean([{}]))

答案是:true

dom事件流,阻止冒泡

什么是事件流:事件流描述的是从页面中接收事件的顺序,DOM2 级事件流包括下面几个阶段。

  • 事件捕获阶段
  • 处于目标阶段
  • 事件冒泡阶段

首先发生的事件捕获,为截获事件提供机会。然后是实际的目标接受事件。最后一个阶段是时间冒泡阶段,可以在这个阶段对事件做出响应。 虽然捕获阶段在规范中规定不允许响应事件,但是实际上还是会执行,所以有两次机会获取到目标对象。


阻止事件冒泡的方法

  • event.stopPropagation()
  • return false(return false 不仅阻止了事件往上冒泡,而且阻止了事件本身)

vue组件通信的方式

vue生命周期

vue watch 和cmputed区别

具体见 《前端面试题手册:Vue》

html渲染过程

  • 首先解析收到的文档,根据文档定义构建一棵 DOM 树,DOM 树是由 DOM 元素及属性节点组成的。
  • 然后对 CSS 进行解析,生成 CSSOM 规则树。
  • 根据 DOM 树和 CSSOM 规则树构建渲染树。渲染树的节点被称为渲染对象,渲染对象是一个包含有颜色和大小等属性的矩形,渲染对象和 DOM 元素相对应,但这种对应关系不是一对一的,不可见的 DOM 元素不会被插入渲染树。还有一些 DOM 元素对应几个可见对象,它们一般是一些具有复杂结构的元素,无法用一个矩形来描述。
  • 当渲染对象被创建并添加到树中,它们并没有位置和大小,所以当浏览器生成渲染树以后,就会根据渲染树来进行布局(也可以叫做回流)。这一阶段浏览器要做的事情是要弄清楚各个节点在页面中的确切位置和大小。通常这一行为也被称为“自动重排”。
  • 布局阶段结束后是绘制阶段,遍历渲染树并调用渲染对象的 paint 方法将它们的内容显示在屏幕上,绘制使用 UI 基础组件。

alt

改变指向的方法this

  • call()、apply()、bind()

具体见 《前端面试题手册:JavaScript》

垃圾回收机制

具体见 《前端面试题手册:JavaScript》

自己设计公共组件的时候有没有遇到过什么问题

如果让你设置一个弹出对话框确认要注意什么

(开放题,以下是笔者的想法,仅供参考)

  • 我个人认为,设计时要考虑弹出对话框时在未确认用户操作指令时,除对话框以外其他操作不应该还能被用户点击,因此需要设计所谓“蒙版”避免对话框弹出时用户还能操作其他功能,否则这样设计的对话框是没有意义的,同时还需要一些提示信息告知用户操作,以及“取消”和“确认”等操作后的事件处理。

url解析对象

(牛客在线编程有类似题目,预测也是问获取url参数)

//来自牛客JS42
function getUrlParam(sUrl, sKey) {
var paramArr = sUrl.split('?')[1].split('#')[0].split('&'); // 取出每个参数的键值对放入数组
const obj = {};
paramArr.forEach(element => {
const [key, value] = element.split('=');  // 取出数组中每一项的键与值
if(obj[key] === void 0){   // 表示第一次遍历这个元素,直接添加到对象上面
obj[key]=value
} else{
obj[key]=[].concat(obj[key],value); // 表示不是第一次遍历说明这个键已有,通过数组存起来。
}});
return sKey===void 0? obj:obj[sKey]||''   // 如果该方法为一个参数,则返回对象。
//如果为两个参数,sKey存在,则返回值或数组,否则返回空字符。
}

快速排序

具体见 《前端面试题手册:JavaScript》

创建一个Vue实例,创建过程有哪些步骤

来自 【源码解析】创建Vue实例时干了什么?

Commonjs 和 Es Module的区别

Commonjs 的特性如下:

  • CommonJS 模块由 JS 运行时实现。
  • CommonJs 是单个值导出,本质上导出的就是 exports 属性。
  • CommonJS 是可以动态加载的,对每一个加载都存在缓存,可以有效的解决循环引用问题。
  • CommonJS 模块同步加载并执行模块文件。

Es module 的特性如下:

  • ES6 Module 静态的,不能放在块级作用域内,代码发生在编译时。
  • ES6 Module 的值是动态绑定的,可以通过导出方法修改,可以直接访问修改结果。
  • ES6 Module 可以导出多个属性和方法,可以单个导入导出,混合导入导出。
  • ES6 模块提前加载并执行模块文件,
  • ES6 Module 导入模块在严格模式下。
  • ES6 Module 的特性可以很容易实现 Tree Shaking 和 Code Splitting。

如果你要实现一个splice,怎么做

来自《如何手动实现数组的splice方法 ? (V8源码级别)》

如果我在购物车菜单页点击按钮这整个过程发生了什么事情,后端呢

(开放题)

  • 可以回答前端是如何知道该商品信息(根据id),点击加入购物车是增加商品还是增加数量(如果项目是比如Vue技术栈的,可回答通过Vuex的Action和Mutation对类型进行判断后返回),后端接收到的数据如何与数据库进行交互,以及前后端之间数据联调等方面

接上题,当用户不断点击的时候如何防止他多次点击

  • 常见的使用防抖和节流来处理
全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-29 22:21
Offer1:小马智行,深圳,测试开发工程师,17.0k*16.0,Offer2:追觅科技,深圳,嵌入式工程师,18.0k*15.0,
嵌软狗都不学:各位base深圳的同事,作为也是并肩作战的一员,今天想站在管理视角,和大家开诚布公地聊一聊:从近几个月的上下班数据对比看来,我们发现一个明显的差异:深圳同事的在岗时间普遍比苏州同事短。很多深圳同事早上9点之后才到公司,晚上不到 20 点就下班了;而总部那边,20点半甚至 22 点后还有不少同事在办公室忙碌,特别是研发团队,加班更是常态。相信去过苏州的同事,对这种场景都不陌生。我很好奇,这是因为苏州工作任务太重还是咱们深圳同事效率真的高到能在更短时间内完成工作?MOVA在深圳成立分公司是为了吸引更优秀的人才贡献更多更高质的价值,公司管理层给我反馈的是深圳招到的多是行业的专家大拿,大部分都是薪资比苏州高的,而且我们办公的租金等也远高于苏州的..MOVA虽脱胎于强壮的集团母体不久,各业务板块尚未实现全面盈利,虽说公司管理层目光长远,不纠结当下的人才投入,但行业内的普遍标准是,员工创造的价值要达到公司雇佣成本的 15 倍以上。大家不妨自我审视一下,自己是否达到了这个标准?如果是抱着划水、按时打卡走人拿毛爷爷的心态那不适合来MOVA,那样过下去不但自己过得尴尬也会影响MOVA这个大船的攻城略地的速度.我并非鼓励大家盲目加班,而是倡导高效工作,拒绝无效忙碌,不要让项目进度因低效受影响,也别把精力浪费在和苏州同事拼打卡时长上,提倡更高的人效比;考虑到两地地域和交通差异,相信大家会找最适合自己发挥的工作方式(比如按时下班后1小时到家晚饭后继续未竟工作等..)大家在遵守公司规章的情况下尽情地体现自己的能力价值,为MOV!和深圳公司争光我们在这边才能更安心更有信心的工作下去;请客BU长、名部门长、项目管理和各业务单元负责人,全面梳理团队情况,及时评估成员工作负荷与成果质量,坚决清退划水害虫痕疫,践行公司价值观,相互监督,防止管理漏洞及渎职。感谢人家的理解,也请人家多担待我的直言不讳……
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务