14万字 | 400多道JavaScript 面试题及详细答案(建议收藏)

Posted 海拥✘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14万字 | 400多道JavaScript 面试题及详细答案(建议收藏)相关的知识,希望对你有一定的参考价值。

14万字 | 400 多道 javascript 面试题 🎓 有答案 🌠

为了方便手机阅览,我在必要位置都放了回顶部或者回对应问题的链接
在这里插入图片描述

编号问题
1在 JavaScript 中创建对象的可行方法有哪些?
2什么是原型链?
3call、apply、bind有什么区别?
4 什么是 JSON 及其常见操作?
5 数组slice()方法的目的是什么?
6 数组splice()方法的目的是什么?
7 slice()和splice()有什么区别?
8 你如何比较 Object 和 Map
9== 和 === 运算符有什么区别?
10什么是 lambda 或 箭头函数?
11 什么是头等函数?
12 什么是一阶函数?
13 什么是高阶函数?
14 什么是一元函数?
15 什么是柯里化函数?
16 什么是纯函数?
17let 关键字的用途是什么?
18let 和 var 有什么区别?
19为什么选择 let 这个名字作为关键字?
20你如何在没有错误的情况下重新声明 switch 块中的变量?
21什么是暂时性死区?
22什么是IIFE(立即执行函数表达式)?
23使用模块有什么好处?
24什么是memoization(记忆)?
25什么是Hoisting(变量提升)?
26ES6 中的类是什么?
27什么是closures(闭包)?
28什么是modules(模块)?
29为什么需要模块?
30javascript中的作用域是什么?
31什么是Service Worker?
32如何使用 Service Worker 操作 DOM?
33你如何在 Service Worker 重新启动时重用信息?
34什么是 IndexedDB?
35什么是 web storage?
36什么是 post message?
37什么是 Cookie ?
38为什么需要 Cookie ?
39cookie 中有哪些选项 ?
40你如何删除cookie ?
41cookie、本地存储和会话存储有什么区别 ?
42localStorage 和 sessionStorage 的主要区别是什么?
43你如何访问web 存储?
44会话存储有哪些可用的方法?
45什么是存储事件及其事件处理程序?
46为什么需要web 存储?
47你如何检查 Web 存储浏览器支持?
48你如何检查web workers浏览器支持?
49举个 web worker 的例子
50web worker 对 DOM 的限制是什么?
51什么是promise?
52为什么需要promise?
53promise的三种状态是什么?
54 什么是回调函数?
55为什么我们需要回调?
56什么是回调地狱?
57什么是服务器发送事件?
58你如何接收服务器发送的事件通知?
59你如何检查浏览器对服务器发送事件的支持?
60服务器发送的事件有哪些可用的事件?
61promise的主要规则是什么?
62回调中的回调是什么?
63什么是promise chaining?
64什么是 promise.all?
65promise中race方法的目的是什么?
66什么是javascript中的严格模式?
67为什么需要严格模式?
68你如何声明严格模式?
69双感叹号的目的是什么?
70删除运算符的目的是什么?
71什么是typeof运算符?
72什么是未定义属性?
73什么是空值?
74null 和 undefined 有什么区别?
75什么是eval?
76Window和Document有什么区别?
77你如何在 javascript 中访问历史记录?
78你如何检测大写锁定键是否打开?
79什么是isNaN?
80未声明变量和未定义变量有什么区别?
81什么是全局变量?
82全局变量有什么问题?
83什么是 NaN 属性?
84isFinite 函数的目的是什么?
85什么是event flow(事件流)?
86什么是event bubbling(事件冒泡)?
87什么是event capturing(事件捕获)?
88你如何使用 JavaScript 提交表单?
89你如何找到操作系统详细信息?
90document load 和 DOMContentLoaded 事件有什么区别?
91Native 、Host 和User objects之间有什么区别?
92用于调试 JavaScript 代码的工具或技术有哪些?
93promises相对于回调的优缺点是什么?
94attribute 和 property有什么区别?
95什么是 same-origin policy(同源策略)?
96void 0的目的是什么?
97JavaScript 是编译型语言还是解释型语言?
98JavaScript 是区分大小写的语言吗?
99Java 和 JavaScript 之间有什么关系吗?
100什么是event?
101谁创造了 JavaScript ?
102preventDefault 方法有什么用?
103stopPropagation方法有什么用?
104return false 涉及哪些步骤?
105什么是BOM(浏览器对象模型)?
106setTimeout有什么用?
107setInterval有什么用?
108为什么 JavaScript 被视为单线程?
109什么是event delegation(事件委托)?
110什么是 ECMAScript?
111什么是 JSON?
112JSON的语法规则是什么?
113JSON 字符串化的目的是什么?
114 你如何解析 JSON 字符串?
115为什么需要 JSON?
116什么是 PWA?
117clearTimeout 方法的目的是什么?
118clearInterval 方法的目的是什么?
119你如何在javascript中重定向新页面?
120你如何检查一个字符串是否包含一个子字符串?
121你如何在 javascript 中验证电子邮件?
122你如何使用 javascript 获取当前 url?
123location对象的各种url属性是什么?
124如何在javascript中获取查询字符串值?
125 如何检查对象中是否存在键?
126你如何循环或枚举 javascript 对象?
127你如何测试一个空对象?
128什么是参数对象?
129你如何使字符串的第一个字母大写?
130for循环的优缺点是什么?
131你如何在javascript中显示当前日期?
132你如何比较两个日期对象?
133你如何检查一个字符串是否以另一个字符串开头?
134你如何在javascript中修剪字符串?
135你如何在javascript中添加一个键值对?
136‘!–’ 符号是否表示一个特殊运算符?
137 你如何为变量分配默认值?
138你如何定义多行字符串?
139什么是app shell model?
140我们可以为函数定义属性吗?
141找到函数期望的参数数量的方法是什么?
142什么是 polyfill?
143什么是 break 和 continue 语句?
144什么是js标签?
145将声明放在首位有什么好处?
146 初始化变量有什么好处?
147创建新对象的建议是什么?
148你如何定义 JSON 数组?
149你如何生成随机整数?
150你能写一个随机整数函数来打印范围内的整数吗?
151什么是tree shaking(摇树)?
152tree shaking(摇树)需要什么?
153是否推荐使用 eval?
154什么是正则表达式?
155正则表达式中可用的字符串方法有哪些?
156正则表达式中的修饰符是什么?
157什么是正则表达式模式?
158什么是 RegExp 对象?
159如何在字符串中搜索模式?
160exec方法的目的是什么?
161如何更改 HTML 元素的样式?
1621+2+‘3’ 的结果是什么?
163什么是调试器语句?
164 调试中断点的目的是什么?
165我可以使用保留字作为标识符吗?
166你如何检测移动浏览器?
167如何在没有正则表达式的情况下检测移动浏览器?
168你如何使用JS获取图像的宽度和高度?
169如何进行同步 HTTP 请求?
170 如何进行异步 HTTP 请求?
171你如何在javascript中将日期转换为另一个时区?
172用于获取窗口大小的属性是什么?
173什么是javascript中的条件运算符?
174你能在条件运算符上应用chaining吗?
175页面加载后执行javascript的方式有哪些?
176proto 和 prototype有什么区别?
177举个例子你真的需要分号
178什么是freeze 方法?
179freeze 方法的目的是什么?
180为什么我需要使用freeze 方法?
181你如何检测浏览器语言首选项?
182如何使用javascript将字符串转换为标题大小写?
183你如何检测页面中禁用的javascript?
184javascript支持的各种运算符有哪些?
185 什么是rest 参数?
186如果不使用 rest 参数作为最后一个参数会发生什么?
187什么是 JavaScript 中可用的按位运算符?
188什么是spread operator(展开运算符)?
189你如何确定对象是否被冻结?
190你如何确定两个值相同或不使用对象?
191使用Object 的 is方法的目的是什么?
192如何将属性从一个对象复制到另一个对象?
193赋值方法有哪些应用?
194什么是Proxy(代理)对象?
195seal 方法的目的是什么?
196seal 方法的应用有哪些?
197freeze 和 seal 方法有什么区别?
198如何判断物体是否 seal?
199如何获得可枚举的键值对?
200Object.values 和 Object.entries 方法的主要区别是什么?
201如何获取任何对象的键列表?
202你如何用 prototype 创建一个对象?
203什么是WeakSet?
204WeakSet 和 Set 有什么区别?
205列出 WeakSet 上可用的方法集合?
206什么是 WeakMap?
207WeakMap 和 Map 有什么区别?
208列出 WeakMap 上可用的方法集合?
209uneval 的目的是什么?
210你如何 encode (编码)一个 URL?
211你如何 decode (解码)一个 URL?
212你如何打印网页的内容?
213uneval 和 eval 有什么区别?
214什么是 anonymous (匿名)函数?
215局部变量和全局变量的优先顺序是什么?
216什么是 javascript 访问器?
217你如何在对象构造函数上定义属性?
218 get 和defineProperty 有什么区别?
219Getter 和 Setter 的优点是什么?
220我可以使用defineProperty方法添加 getter 和 setter 吗?
221switch-case 的目的是什么?
222使用 swtich case 需要遵循什么约定?
223什么是原始数据类型?
224访问对象属性的不同方式有哪些?
225什么是函数参数规则?
226什么是错误对象?
227当你收到语法错误时
228错误对象有哪些不同的错误名称?
229错误处理中的各种语句是什么?
230javascript中的两种类型的循环是什么?
231什么是 nodejs?
232什么是 Intl 对象?
233你如何执行特定于语言的日期和时间格式化?
234什么是迭代器?
235同步迭代是如何工作的?
236什么是事件循环?
237什么是调用栈?
238什么是事件队列?
239什么是装饰器?
240Intl 对象的属性是什么?
241什么是一元运算符?
242如何对数组中的元素进行排序?
243排序数组时 compareFunction 的目的是什么?
244你如何反转数组?
245你如何在数组中找到最小值和最大值?
246如何在没有math函数的情况下找到最小值和最大值?
247什么是空语句及其目的?
248如何获取模块的元数据?
249什么是逗号运算符?
250逗号运算符的优点是什么?
251什么是 typescript ?
252javascript 和 typescript 有什么区别?
253typescript 相对于 javascript 的优势是什么?
254什么是对象初始值设定项?
255什么是构造方法?
256如果在一个类中多次编写构造函数会发生什么?
257如何调用父类的构造函数?
258你如何获得一个对象的原型?
259如果我为 getPrototype 方法传递字符串类型会发生什么?
260如何将一个对象的原型设置为另一个对象?
261你如何检查一个对象是否可以扩展?
262如何防止对象扩展?
263使对象不可扩展的不同方法有哪些?
264如何在一个对象上定义多个属性?
265JavaScript 中的 MEAN 是什么?
266什么是 javascript 中的混淆?
267为什么需要混淆?
268什么是Minification(缩小)?
269缩小有什么好处?
270混淆和加密有什么区别?
271常用的缩小工具有哪些?
272你如何使用 javascript 执行表单验证?
273如何在没有 javascript 的情况下执行表单验证?
274可用于约束验证的 DOM 方法有哪些?
275什么是可用的约束验证 DOM 属性?
276什么是有效性属性列表?
277举例使用 rangeOverflow 属性?
278javascript 中是否提供枚举功能?
279什么是枚举?
280你如何列出一个对象的所有属性?
281如何获取对象的属性描述符?
282属性描述符提供的属性是什么?
283你如何扩展类?
284如何在不重新加载页面的情况下修改 url?
285如何检查数组是否包含特定值?
286你如何比较标量数组?
287 如何从获取参数中获取值?
288你如何用逗号作为千位分隔符打印数字?
289java和javascript有什么区别?
290javascript是否支持命名空间?
291你如何声明命名空间?
292如何从父页面调用 iframe 中的 javascript 代码?
293如何从日期获取时区偏移量?
294如何动态加载 CSS 和 JS 文件?
295在 DOM 中查找 HTML 元素的不同方法有哪些?
296什么是jQuery?
297什么是 V8 JavaScript 引擎?
298为什么我们称javascript为动态语言?
299什么是空运算符?
300如何设置光标等待?
301你如何创建一个无限循环?
302为什么需要避免 with 语句?
303以下 for 循环的输出是什么?
304列出 ES6 的一些特性?
305什么是 ES6?
306我可以重新声明 let 和 const 变量吗?
307是 const 变量使值不可变吗?
308什么是默认参数?
309什么是模板字面量?
310如何在模板文字中编写多行字符串?
311什么是嵌套模板?
312什么是标记模板?
313 什么是原始字符串?
314什么是解构赋值?
315解构赋值中的默认值是什么?
316你如何在解构赋值中交换变量?
317什么是增强的对象字面量?
318什么是动态导入?
319动态导入的用例是什么?
320什么是typed arrays (类型数组)?
321模块加载器的优点是什么?
322什么是 collation?
323什么是…of 语句?
324下面展开运算符数组的输出是什么?
325PostMessage 安全吗?
326postmessage目标源作为通配符有什么问题?
327你如何避免收到来自攻击者的 postMessages?
328我可以完全避免使用 postMessages 吗?
329postMessages 是否同步?
330Javascript 是什么范式?
331内部和外部 javascript有什么区别?
332JavaScript 是否比服务器端脚本更快?
333你如何获得复选框的状态?
334双波浪号运算符的目的是什么?
335你如何将字符转换为 ASCII 码?
336什么是数组缓冲区?
337下面的字符串表达式的输出是什么?
338Error对象的目的是什么?
339EvalError 对象的目的是什么?
340从非严格模式到严格模式抛出的案例错误列表是什么?
341是否所有对象都有prototypes(原型)?
342参数和实参有什么区别?
343数组中 some 方法的目的是什么?
344你如何组合两个或多个数组?
345浅拷贝和深拷贝有什么区别?
346你如何创建一个字符串的特定数量的副本?
347你如何根据正则表达式返回所有匹配的字符串?
348你如何在开头或结尾修剪字符串?
349下面带有一元运算符的控制台语句的输出是什么?
350javascript 是否使用 mixins?
351什么是 thunk 函数?
352什么是异步 thunk?
353以下函数调用的输出是什么?
354如何从字符串中删除所有换行符?
355回流和重绘有什么区别?
356否定数组会发生什么?
357如果我们添加两个数组会发生什么?
358在假值上添加加法运算符的输出是什么?
359如何使用特殊字符创建自字符串?
360如何从数组中删除虚假值?
361你如何获得数组的唯一值?
362什么是解构别名?
363如何在不使用 map 方法的情况下映射数组值?
364你如何清空一个数组?
365你如何将数字四舍五入到某些小数?
366将数组转换为对象的最简单方法是什么?
367你如何用一些数据创建一个数组?
368控制台对象的占位符是什么?
369是否可以将 CSS 添加到控制台消息?
370控制台对象的dir方法的目的是什么?
371是否可以在控制台中调试 HTML 元素?
372如何使用控制台对象以表格格式显示数据?
373你如何验证参数是否为数字?
374你如何创建复制到剪贴板按钮?
375获取时间戳的快捷方式是什么?
376你如何展平多维数组?
377什么是最简单的多条件检查?
378你如何捕获浏览器后退按钮?
379如何禁用网页中的右键单击?
380什么是包装对象?
381什么是 AJAX?
382处理异步代码的不同方式有哪些?
383如何取消提取请求?
384什么是网络语音API?
385什么是最小超时限制?
386你如何在现代浏览器中实现零超时?
387事件循环中的任务是什么?
388什么是微任务?
389什么是不同的事件循环?
390queueMicrotask 的目的是什么?
391你如何在 typescript 文件中使用 javascript 库?
392promises 和 observables 有什么区别?
393什么是堆?
394什么是事件表?
395什么是微任务队列?
396shim 和 polyfill 有什么区别?
397你如何检测原始或非原始值类型?
398什么是Babel ?
399Node.js 是完全单线程的吗?
400可观察对象的常见用例是什么?
401什么是 RxJS?
402函数构造函数和函数声明有什么区别?
403什么是短路状态?
404调整数组大小的最简单方法是什么?
405什么是可观察的?
406函数声明和类声明有什么区别?
407什么是异步函数?
408你如何防止 promises swallowing errors?
409什么是 deno ?
410你如何在javascript中使对象可迭代?
411什么是正确的尾调用?
412你如何检查一个对象是否是一个承诺?
413如何检测函数是否被调用为构造函数?
414arguments 对象和rest 参数之间有什么区别?
415扩展运算符和rest 参数之间有什么区别?
416有哪些不同种类的 generators(生成器)?
417什么是内置可迭代对象?
418for…of 和 for…in 语句之间有什么区别?
419如何定义实例和非实例属性?
420isNaN 和 Number.isNaN 有什么区别?
421如何在没有任何额外括号的情况下调用 IIFE?
422可以在 switch case 中使用表达式吗?
423忽略承诺错误的最简单方法是什么?
424如何使用 CSS 设置控制台输出的样式?

1.在 JavaScript 中创建对象的可行方法有哪些?

有很多方法可以在 javascript 中创建对象,如下所示

1.对象构造函数:

创建空对象的最简单方法是使用 Object 构造函数。目前不推荐这种方法。

  var object = new Object();

2.对象的创建方法:

Object 的 create 方法通过将原型对象作为参数传递来创建一个新对象

  var object = Object.create(null);

3.对象字面量语法:

当传递 null 作为参数时,对象字面量语法等效于 create 方法

  var object = {};

4.函数构造器:

创建任何函数并应用 new 运算符来创建对象实例,

  function Person(name){
     var object = {};
     object.name=name;
     object.age=21;
     return object;
  }
  var object = new Person("Sudheer");

5.带有原型的函数构造函数:

这类似于函数构造函数,但它使用原型作为其属性和方法,

  function Person(){}
  Person.prototype.name = "Sudheer";
  var object = new Person();

这等效于使用具有函数原型的对象创建方法创建的实例,然后使用实例和参数作为参数调用该函数。

  function func {};

  new func(x, y, z);

(或者)

  // 使用函数原型创建一个新实例。
  var newInstance = Object.create(func.prototype)

  // 调用函数
  var result = func.call(newInstance, x, y, z),

  // 如果结果是非空对象,则使用它,否则只使用新实例。
  console.log(result && typeof result === 'object' ? result : newInstance);

6.ES6 类语法:

ES6 引入类特性来创建对象

  class Person {
     constructor(name) {
        this.name = name;
     }
  }

  var object = new Person("Sudheer");

7.单例模式:

Singleton 是一个只能实例化一次的对象。对其构造函数的重复调用返回相同的实例,这样可以确保它们不会意外创建多个实例。

  var object = new function(){
     this.name = "Sudheer";
  }

⬆ 返回顶部


2.什么是原型链?

原型链用于基于现有对象构建新类型的对象。它类似于基于类的语言中的继承。

对象实例上的原型可通过Object.getPrototypeOf(object)proto属性获得,而构造函数上的原型可通过Object.prototype 获得。

⬆ 返回顶部


3.call、apply、bind有什么区别?

Call、Apply 和 Bind 之间的区别可以用下面的例子来解释,

call: call() 方法调用一个函数,给定的this值和参数一一提供

var employee1 = {firstName: 'Haiyong', lastName: 'Rodson'};
var employee2 = {firstName: 'Jimmy', lastName: 'Baily'};

function invite(greeting1, greeting2) {
    console.log(greeting1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ greeting2);
}

invite.call(employee1, 'Hello', 'How are you?'); // Hello Haiyong Rodson, How are you?
invite.call(employee2, 'Hello', 'How are you?'); // Hello Jimmy Baily, How are you?

apply:调用具有给定this值的函数,并允许你将参数作为数组传入

var employee1 = {firstName: 'Haiyong', lastName: 'Rodson'};
var employee2 = {firstName: 'Jimmy', lastName: 'Baily'};

function invite(greeting1, greeting2) {
    console.log(greeting1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ greeting2);
}

invite.apply(employee1, ['Hello', 'How are you?']); // Hello Haiyong Rodson, How are you?
invite.apply(employee2, ['Hello', 'How are you?']); // Hello Jimmy Baily, How are you?

bind:返回一个新函数,允许你传递任意数量的参数

var employee1 = {firstName: 'Haiyong', lastName: 'Rodson'};
var employee2 = {firstName: 'Jimmy', lastName: 'Baily'};

function invite(greeting1, greeting2) {
    console.log(greeting1 + ' ' + this.firstName + ' ' + this.lastName+ ', '+ greeting2);
}

var inviteEmployee1 = invite.bind(employee1);
var inviteEmployee2 = invite.bind(employee2);
inviteEmployee1('Hello', 'How are you?'); // Hello Haiyong Rodson, How are you?
inviteEmployee2('Hello', 'How are you?'); // Hello Jimmy Baily, How are you?

Call 和 apply 可以互换。两者都立即执行当前函数。你需要决定是发送数组还是逗号分隔的参数列表更容易。你可以通过处理 Call 用于逗号(分隔列表)和 Apply 用于Array来记住。

而 Bind 创建一个新函数,该函数将this设置为传递给 bind() 的第一个参数。

⬆ 返回顶部


4.什么是 JSON 及其常见操作?

JSON是一种基于文本的数据格式,遵循 JavaScript 对象语法,由道格拉斯·克罗克福德 (Douglas Crockford) 推行。 当你想通过网络传输数据时它很有用,它基本上只是一个扩展名为 .json 的文本文件,以及一个 MIME 类型的 application/json

解析:将字符串转换为原生对象

JSON.parse(text)

字符串化:将本机对象转换为字符串,以便可以通过网络传输

JSON.stringify(object)

⬆ 返回顶部


5. 数组slice()方法的目的是什么?

所述slice()方法返回在数组作为新的数组对象中选定的元件。它选择从给定开始参数开始的元素,并在给定的可选结束参数处结束,不包括最后一个元素。如果省略第二个参数,则它会一直选择到最后。

这种方法的一些例子是,

let arrayIntegers = [1, 2, 3, 4, 5];
let arrayIntegers1 = arrayIntegers.slice(0,2); // returns [1,2]
let arrayIntegers2 = arrayIntegers.slice(2,3); // returns [3]
let arrayIntegers3 = arrayIntegers.slice(4); //returns [5]

注意: Slice 方法不会改变原始数组,而是将子集作为新数组返回。

⬆ 返回顶部


6.数组splice()方法的目的是什么?

splice() 方法用于向/从数组添加/删除项目,然后返回被删除的项目。第一个参数指定插入或删除的数组位置,而选项第二个参数指示要删除的元素数。每个附加参数都添加到数组中。

这种方法的一些例子是,

let arrayIntegersOriginal1 = [1, 2, 3, 4, 5];
let arrayIntegersOriginal2 = [1, 2, 3, 4, 5];
let arrayIntegersOriginal3 = [1, 2, 3, 4, 5];

let arrayIntegers1 = arrayIntegersOriginal1.splice(0,2); JS万字整理JavaScript相关基础技术面试题总结 - 前端面试必备 - 基础知识总结 - 秋招冲鸭

JavaScript保姆级教程 ——— 重难点详细解析(万字长文,建议收藏)

JavaScript保姆级教程 ——— 重难点详细解析(万字长文,建议收藏)

JavaScript保姆级教程 ——— 重难点详细解析(万字长文,建议收藏)

❤JavaScript系列6部曲:语法篇(万字长文)❤

万字长文!二叉树入门和刷题看这篇就够了!