本文整理了 JavaScript 前端开发中高频出现的经典面试题,涵盖基础数据类型、类型转换、事件流模型、BOM 对象、AJAX 原理及 HTTP 状态码等核心知识点。重点解析了 null 与 undefined 的区别、原型链的工作机制、new 操作符的执行流程,以及 GET 与 POST 请求的实际应用场景,旨在帮助开发者系统复习前端基础知识,提升面试应对能力。
前言
若将面试题按性质分类,主要可划分为“技术类”与“非技术类”两大板块。在技术类面试题中,通常进一步细分为多个子类别:
- 移动端与 PC 端布局相关
- JavaScript 核心基础相关
- 衍生框架相关
- 项目实际应用相关
根据面试中出现频率的统计,以下两类题目几乎是 100% 会被问到的:“移动端与 PC 端布局类”以及“JavaScript 核心基础类”。本次内容重点选取了这两大类中难度较高的“JavaScript 核心基础类”题目进行深度分析与解答,供求职者面试前复习参考。
特别说明:
如果在面试中遇到上述题型无法作答,必须正视自身知识体系的短板,并需心服口服地刻苦钻研,直至完全掌握。毕竟,要成为一名合格的“WEB 前端工程师”,必须扎实掌握以下 JavaScript 核心基础知识,否则只能被视为“冒牌”工程师。
JavaScript 基础类型与运算符
一、JavaScript 的 typeof 返回哪些数据类型?
分析:
此题旨在考察 JavaScript 的基本功。只要对 typeof 运算符有基本了解,解答难度不大。在回答时,建议结合理论知识与实际编码经验进行阐述。此外,为了体现面试的严谨性,回答中应包含 ES2015 新增的数据类型。
建议回复:
首先,JavaScript 中的数据主要分为两大类型:
- 基础类型(原始类型)
- 引用类型
· 基础类型包括:Number、String、Boolean、Null、Undefined、Symbol(Symbol 是 ES2015 中新增的类型)。
· 引用类型涵盖:Object。typeof 运算符以字符串形式返回类型信息,需注意其返回结果与 JavaScript 定义的类型存在细微差异。typeof 可能返回七种值:“number”、“string”、“boolean”、“object”、"symbol"、“function”及“undefined”。
typeof 运算符以字符串形式返回类型信息。需要注意的是,typeof 返回的类型与 JavaScript 定义的类型之间存在细微差异。typeof 可能返回七种值:“number”、“string”、“boolean”、“object”、“symbol”、“function”和“undefined”。
alert(typeof null);
alert(typeof undefined);
alert(typeof NaN);
alert(NaN == undefined);
alert(NaN == NaN);
var str = "123abc";
alert(typeof str++);
alert(str);
二、请写出以下代码运算结果:
分析:
建议回复:
本题主要考察 typeof 对值的类型判断,输出结果依次为:
alert(typeof null); // object
alert(typeof undefined); // undefined
alert(typeof NaN); // number
alert(NaN == undefined); // false
alert(NaN == NaN); // false
var str = "123abc";
alert(typeof str++); // number
alert(str); // NaN
三、例举至少 3 种强制类型转换和 2 种隐式类型转换?
分析:
类型转换的概念看似宽泛,但此题明确限定了回答范围。
建议回复:
1. 强制类型转换:明确调用内置函数,将一种类型的值强制转换为另一种类型。主要的强制类型转换方法包括:Boolean()、Number()、String()、parseInt()、parseFloat()。
2. 隐式类型转换:在使用算术运算符时,运算符两边的数据类型可以是任意的,例如字符串可以与数字相加。不同数据类型之所以能进行运算,是因为 JavaScript 引擎在运算前会自动执行隐式类型转换。主要的隐式类型转换场景包括:+、–、==、!。
事件流与 BOM 对象
四、JavaScript 的事件流模型都有什么?
建议回复:
事件流描述了从页面接收事件的顺序。DOM 结构呈树形,当页面中某个元素触发事件时,事件会从最顶层的 window 对象开始,向下传播至目标元素。在此过程中,途经的所有祖先节点若绑定了相应事件处理函数,则会依次执行。当事件到达目标元素并执行其绑定函数(若有)后,事件会向上传播回 window 元素,同样会触发途经祖先节点的事件处理函数(若已绑定)。
事件流包含三个阶段:
- 事件捕获阶段
- 处于目标阶段
- 事件冒泡阶段
事件捕获阶段:事件由顶层对象触发,逐级向下传播,直至目标元素;
处于目标阶段:事件发生在绑定事件的元素上;
事件冒泡阶段:事件由具体元素先接收,然后逐级向上传播,直至不具体的元素(window)。
五、BOM 对象有哪些,列举 window 对象?
建议回复:
- window 对象是 JavaScript 的最顶层对象,其他 BOM 对象均为 window 对象的属性;
- document 对象,即文档对象;
- location 对象,包含浏览器当前 URL 信息;
- navigator 对象,包含浏览器本身的信息;
- screen 对象,包含客户端屏幕信息;
- history 对象,包含浏览器访问的历史信息;
AJAX 原理与 HTTP 状态码
六、请简述 AJAX 及基本步骤?
分析:
对于此类纯概念题,建议在面试前重新手写一遍原生 AJAX 函数的封装过程。务必在理解的基础上进行记忆,以便在面试中能有良好的发挥。
建议回复:
简述 AJAX:AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是一种创建交互式网页应用的开发技术。通过在后台与服务器进行少量数据交换,AJAX 可以实现网页的异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
AJAX 基本步骤:
- 初始化 ajax 对象
- 连接地址,准备数据
- 发送请求
- 接收数据(正在接收,尚未完成)
- 接收数据完成
//初始化ajax对象
var xhr = xhr = new XMLHttpRequest();
//连接地址,准备数据
xhr.open(“方式”,”地址”,是否为异步);
//接收数据完成触发的事件
xhr.onload =function(){}
//发送数据
xhr.send();
七、HTTP 状态消息 200 302 304 403 404 500 分别表示什么?
分析:
“带着理解去记忆”是应对概念题的最佳策略,此外多查看延展知识点也大有裨益。
建议回复:
- 200:请求已成功,请求所希望的响应头或数据体将随此响应返回。
- 302:请求的资源临时从不同的 URI 响应请求。由于这种重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在 Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的。
- 304:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
- 403:服务器已经理解请求,但是拒绝执行它。
- 404:请求失败,请求所希望得到的资源未被在服务器上发现。
- 500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
同步异步与 GET/POST 请求
八、同步和异步的区别?
分析:
这又是一道概念题。
建议回复:
- 首先,同步与异步和阻塞、非阻塞并没有直接关系。同步与异步主要关注事情完成后如何处理,或者说关注的是一种消息通信机制。
- 在同步情况下,是由处理消息者自己去等待消息是否被触发;
- 而在异步情况下,是由触发机制来通知处理消息者;
举例:比如在上课时,你问老师一个问题,这个问题可能需要花费一点时间去思考,这个时候老师可能:
- 思考,思考……,好了,有答案了;
- 这个问题需要一点时间,你先做点别的,等我想好了,去找你。
第一种情况就是同步,第二种情况就是异步。因此,同步与异步是从被请求方的角度来看的,即被请求者使用什么方式来告知处理结果。
- 阻塞与非阻塞,主要是对于请求者而言的。
- 阻塞:发出请求后等待结果返回,然后再处理后续的事情;
- 非阻塞:发出请求后不等待结果返回,可以接着做后续的事情;
举例,还是上一个例子:
- 老师在使用同步思考的时候,你可以静静等待老师给出答案,也可以边做自己的事情边等待老师的回答,当然这时候你需要时刻去关注老师是否已经想好了,在程序中需要进行轮询了。
- 老师使用异步的方式,这个时候老师告诉你可以先去做别的,好了就通知你,那么你可以去做点别的,然后监听事件就行,当然你也可以很轴,我就不做别的!我要一直等着老师“想好了”的事件发生。
- 因此,同步可以是阻塞的也可以是非阻塞的,异步也是如此。
九、GET和POST的区别,何时使用POST?
分析:
数据交互类的概念题在面试中被问到的概率极高,这也反映了其在实际工作中的实用价值。因此,没有其他捷径,只有好好学习,好好背诵!
建议回复:
GET和POST的区别:
GET:一般用于查询数据,使用 URL 传递参数。由于浏览器对地址栏长度有限制,因此对使用 get 方式所发送信息的数量有限制。同时,浏览器会记录(历史记录、缓存)中会保留请求地址的信息,包括地址后面的数据。get 只能发送普通格式(URL 编码格式)的数据。
POST:一般用于向服务器发送数据,对所发送的数据的大小理论上是没有限制。浏览器会缓存记录地址,但是不会记录 post 提交的数据。post 可以发送纯文本、URL 编码格式、二进制格式的字符串,形式多样。
在以下情况中,请使用 POST 请求:
- 以提交为目的的请求(类似语义化,get 表示请求,post 表示提交);
- 发送私密类数据(用户名、密码)(因为浏览器缓存记录特性);
- 向服务器发送大量数据(数据大小限制区别);
- 上传文件图片时(数据类型区别);
十、 AJAX 的局限性?
建议回复:
- AJAX 不支持浏览器 back 按钮。
- 安全问题:AJAX 暴露了与服务器交互的细节。
- 对搜索引擎的支持比较弱。搜索引擎不会执行你的 JS 脚本,只会操作你的网页源代码;
- 跨域请求有一定限制。解决方式:jsonp;
对象创建与数据类型处理
十一、new 操作符具体干了什么呢?
分析:
原理概念题。
建议回复:
当使用 new 操作符调用构造函数时,函数实际会经历如下步骤:
- 创建一个新对象;
- 把函数中上下文(作用域)对象 this 指向该对象;
- 执行代码,通过 this 给新对象添加属性或方法;
- 返回对象;
十二、null 和 undefined 的区别?
分析:
经典的概念题。
建议回复:
null:null 表示空值,转为数值时为 0;
undefined:undefined 表示“缺少值”,即此处应该有一个值,但是还没有定义。
- 变量被声明了,但没有赋值时,就等于 undefined。
- 对象没有赋值的属性,该属性的值为 undefined。
- 函数没有返回值时,默认返回 undefined。
十三、JavaScript 原型,原型链 ? 有什么特点?
建议回复:
JavaScript 原型:每创建一个函数,函数上都有一个属性为 prototype,它的值是一个对象。这个对象的作用在于当使用函数创建实例的时候,这些实例都会共享原型上的属性和方法。
原型链:在 JavaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接([[Prototype]])。这个原型对象又有自己的原型,直到某个对象的原型为 null 为止(也就是不再有原型指向)。这种一级一级的链结构就称为原型链(prototype chain)。当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止;如果查找到达原型链的顶部(Object.prototype),仍然没有找到指定的属性,就会返回 undefined。
十四、实现对数组进行乱序
分析:
这道题检验了数组的 sort() 方法。因为是乱序,所以还需要用到 Math.random() 产生随机数,以打乱排序规律。
建议回复:
在写代码前,先把实现原理介绍一下,然后再开始写代码:
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var sign = 1;
a.sort(function(a, b) {
return Math.random() - 0.5
});
十五、实现一个函数 clone(),可以对 JavaScript 中的5种主要的数据类型(包括 Number、String、Object、Array、Boolean)进行值复制。
分析:
这道题考察了以下知识点:
- 使用 typeof 判断值得类型;
- 使用 toString 区分数组和对象;
- 递归函数的使用;
建议回复:
function clone(obj) {
//判断是对象,就进行循环复制
if (typeof obj === 'object' && typeof obj !== 'null') {
// 区分是数组还是对象,创建空的数组或对象
var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {};
for (var k in obj) {
// 如果属性对应的值为对象,则递归复制
if(typeof obj === 'object' && typeof obj !== 'null'){
o[k] = clone(obj[k])
}else{
o[k] = obj[k];
}
}
}else{ //不为对象,直接把值返回
return obj;
}
return o;
}
总结
以上就是给大家总结关于 Javascript 前端面试题的全部内容了,后续看到再继续补充,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,请大家继续关注本站。