草庐IT

前端人必看的JS面试题汇总

职来offer 2023-11-21 原文

面试是每一个前端人在求职过程中都需要面对的事情。在面试过程中,面试官没有办法通过实践操作去了解应聘者的技能水平,所以他们更多地会通过“八股文”的考察来判断你是否符合公司的招聘要求。所以作为一个前端人,在掌握好前端技能的同时,也需要掌握好一些基础理论知识,这样才能在面试中脱颖而出,拿到自己心仪的offer。

 

那么,下面小职就整理了一些在前端面试过程中比较常见的JS面试题,有需要的朋友可以看一下哦~

一、JS数据类型

JS数据类型通常分为基本数据类型和引用数据类型两种。

基本数据类型:Number、String、Boolean、Null、Undefined、Symbol、bigInt七种,

引用数据类型:object、Array、Date、Function、RegExp。

二、JS变量和函数声明的提升

1、在JS中变量和函数的声明会提升到最顶部执行。

2、函数的提升高于变量的提升,

3、函数内部如果用 var 声明了相同名称的外部变量,函数将不再向上寻找。

4、匿名函数不会提升。

三、== 和 ===的区别

== 和 ===都是判断等式两边是否相等,但是==是非严格意义上的相等,值相等就相等,而===是严格意义上的相等,会比较两边的数据类型和值大小,值和引用地址都相等才相等

四、闭包

闭包就是能够读取其他函数内部变量的函数,闭包基本上就是一个函数内部返回一个函数。

优点:

1、可以读取函数内部的变量;

2、将变量始终保持在内存中;

3、可以封装对象的私有属性和私有方法;

缺点:比较耗费内存、使用不当会造成内存溢出的问题。

五、this

this是 JavaScript 语言的一个关键字。在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定)。this总是指向函数的直接调用者。如果有new关键字,this指向new出来的对象。在事件中,this指向触发这个事件的对象。

六、map与forEach的区别

forEach 方法是最基本的方法,就是遍历与循环,默认有 3 个传参。这三个传参分别是遍历的数组内容 item、数组索引 index、和当前遍历数组 Array

map 方法基本用法与 forEach 一致,但是它会返回一个新的数组,所以 callback需要有 return 值,如果没有,会返回 undefined。

七、箭头函数与普通函数

函数体内的 this 对象就是定义时所在的对象,而不是使用时所在的对象。不可以当作构造函数,也不可以使用 arguments 对象,该对象在函数体内不存在。如果一定要用,可以用 Rest 参数代替。不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。

八、同源策略

同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。 可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 它是一个安全策略。所谓同源是指,域名、协议、端口相同。

 

九、严格模式的限制

严格模式主要有以下限制:

1、变量必须声明后再使用

2、函数的参数不能有同名属性,否则报错

3、不能使用with语句

4、不能对只读属性赋值,否则报错

5、不能使用前缀0表示八进制数,否则报错

6、不能删除不可删除的属性,否则报错

7、不能删除变量delete prop,会报错,只能删除属性delete global[prop]

8、eval不会在它的外层作用域引入变量

9、eval和arguments不能被重新赋值

10、arguments不会自动反映函数参数的变化

11、不能使用arguments.callee

12、不能使用arguments.caller

13、禁止this指向全局对象

14、不能使用fn.caller和fn.arguments获取函数调用的堆栈

15、增加了保留字(比如protected、static和interface)

十、es6新增

1、新增模板字符串

2、箭头函数

3、for-of(用来遍历数据—例如数组中的值。)

4、ES6 将 Promise 对象纳入规范,提供了原生的 Promise 对象。

5、增加了 let 和 const 命令,用来声明变量。

6、引入 module 模块的概念

十一、attribute 和 property 的区别

attribute 是 dom 元素在文档中作为 html 标签拥有的属性,而property 就是 dom 元素在 JS 中作为对象拥有的属性。对于 html 的标准属性来说,attribute 和 property 是同步的,是会自动更新的,但是对于自定义的属性来说,他们是不同步的。

十二、let和const 的区别

let和const很相似,但是let 命令不存在变量提升,如果在 let 前使用,会导致报错。如果块区中存在 let 和 const 命令,就会形成封闭作用域。不允许重复声明。const定义的是常量,不能修改,但是如果定义的是对象,可以修改对象内部的数据。

十三、内存泄漏

内存泄漏指的是程序中己动态分配的堆内存由于某种原因程序未释放或无法释放引发的各种问题。

内存泄漏结果:变慢,崩溃,延迟大等

内存泄漏原因:全局变量,dom 清空时,还存在引用,定时器未清除,子元素存在引起的内存泄露。

十四、数组(array)方法

map : 遍历数组,返回回调返回值组成的新数组

forEach : 无法 break ,可以用 try/catch 中 throw new Error 来停止

filter : 过滤

some : 有一项返回 true ,则整体为 true

every : 有一项返回 false ,则整体为 false

join : 通过指定连接符生成字符串

push / pop : 末尾推入和弹出,改变原数组, 返回推入/弹出项

unshift / shift : 头部推入和弹出,改变原数组,返回操作项

sort(fn) / reverse : 排序与反转,改变原数组

concat : 连接数组,不影响原数组, 浅拷贝

slice(start, end) : 返回截断后的新数组,不改变原数组

splice(start,number,value…): 返回删除元素组成的数组,value 为插入项,改变原数组

indexOf / lastIndexOf(value, fromIndex) : 查找数组项,返回对应的下标

reduce / reduceRight(fn(prev, cur) ,defaultPrev) : 两两执行,prev 为上次化简函数的return 值,cur 为当前值(从第二项开始)

十五、JavaScript 深浅拷贝

浅拷贝:Object.assign

深拷贝:可以通过 JSON.parse(JSON.stringify(object)) 来解决

十六、异步编程的实现方式

1、回调函数

优点:简单、容易理解

缺点:不利于维护、代码耦合高

2、事件监听

优点:容易理解,可以绑定多个事件,每个事件可以指定多个回调函数

缺点:事件驱动型,流程不够清晰

3、发布/订阅(观察者模式)

类似于事件监听,但是可以通过‘消息中心’,了解现在有多少发布者,多少订阅者

4、Promise 对象

优点:可以利用 then 方法,进行链式写法;可以书写错误时的回调函数

缺点:编写和理解,相对比较难

5、Generator 函数

优点:函数体内外的数据交换、错误处理机制

缺点:流程管理不方便

6、async 函数

优点:内置执行器、更好的语义、更广的适用性、返回的是 Promise、结构清晰

缺点:错误处理机制

 

十七、面向对象编程思想

基本思想是使用对象,类,继承,封装等基本概念来进行程序设计

优点

1、易维护

2、易扩展

3、开发工作的重用性、继承性高,降低重复工作量。

4、缩短了开发周期

十八、作用域链 

作用域链可以理解为一组对象列表,包含 父级和自身的变量对象,因此我们便能通过作用域链访问到父级里声明的变量或者函数

十九、原型、原型链、继承

原型:每一个构造函数都有一个 prototype 属性,这个属性会在生成实例的时候,成为实例对象的原型对象。javascript 的每个对象都继承另一个对象,后者称为“原型”(prototype)对象。

原型链:每一个对象都有一个 proto 属性,对象的属性和方法,有可能定义在自

身,也有可能定义在它的原型对象。由于原型本身也是对象,又有自己的原型,所

以形成了一条原型链(prototype chain)。

继承:继承就是在子类构造函数中继承父类构造函数的私有属性和原型属性。我们

在子类构造函数中使用 call 或 apply 方法调用父类构造函数并改变其 this 指向为

子类构造函数的 this,此时子类的构造函数就继承了父类的私有属性和私有方法。

将父类的实例化对象赋值给子类的原型对象,此时子类就继承了父类的原型属性和

原型方法。

二十、逐进增强和优雅降级

逐进增强:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高版本浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

优雅降级:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容

 

前端开发虽然是一项实践性较强的工作,但是理论知识也是非常重要的,想要在众多求职者中脱颖而出,就要理论基础与实操技能两手抓。如果你连最基本的理论基础都没有掌握好,那面试官又怎么会相信你的技能水平能又多高呢?所以,建议每个前端人在找工作之前都能熟记上面的知识点,能够帮助你更轻松地拿到offer哦~

有关前端人必看的JS面试题汇总的更多相关文章

  1. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  2. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  3. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  4. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  5. 常见网络安全产品汇总(私信发送思维导图) - 2

    安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un

  6. node.js - 从未编写过任何自动化测试,我应该如何开始行为驱动开发? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易

  7. ruby-on-rails - 在 Rails 应用程序的前端获取实时日志 - 2

    在Rails3.x应用程序中,我正在使用net::ssh并向远程pc运行一些命令。我想向用户的浏览器显示实时日志。比如,如果两个命令在net中运行::ssh执行即echo"Hello",echo"Bye"被传递然后"Hello"应该在执行后立即显示在浏览器中。这是代码我在ruby​​onrails应用程序中使用ssh连接和运行命令Net::SSH.start(@servers['local'],@machine_name,:password=>@machine_pwd,:timeout=>30)do|ssh|ssh.open_channeldo|channel|channel.requ

  8. ruby - 如何在转换器插件中访问页面属性(YAML 前端) - 2

    我正在为Jekyll编写一个转换器插件,需要访问一些页眉(YAML前端)属性。只有内容被传递给主要的转换器方法,似乎无法访问上下文。例子:moduleJekyllclassUpcaseConverter关于如何在转换器插件中访问页眉数据有什么想法吗? 最佳答案 基于Jekyll源代码,无法在转换器中检索YAML前端内容。根据您的情况,我看到了两种可行的解决方案。您的文件扩展名可以具有足够的描述性,以提供您本应包含在前言中的信息。看起来Converter插件的设计就是这么基本的。如果修改Jekyll是一个选项,您可以更改Convert

  9. ruby-on-rails - 将 Angular JS 与 Rails 集成 - 2

    我需要一些指导来了解如何将Angular整合到rails中。选择Rails的原因:我喜欢他们偏执的做事方式。还有迁移,gem真的很酷。使用angular的原因:我正在研究和寻找最适合SPA的框架。Backbone似乎太抽象了。我不得不在Angular和Ember之间做出选择。我首先开始阅读Angular,它对我来说很有意义。所以我从来没有去读过关于ember的文章。使用Angular和Rails的原因:我研究并尝试使用小型框架,例如grape、slim(是的,我也使用php)。但我觉得需要坚持项目的长期范围。我个人喜欢用Rails的方式做事。这就是我需要帮助的地方,我在Rails4中有

  10. node.js - 如何比较图像并确定哪个内容更多? - 2

    目标:我想从动画GIF中抓取最佳帧并将其用作静态预览图像。我相信最好的帧是显示最多内容的帧-不一定是第一帧或最后一帧。以这张动图为例:--这是第一帧:--这是第28帧:很明显,第28帧很好地代表了整个GIF。我如何以编程方式确定一帧是否比另一帧具有更多像素/内容?如果您能向我指出任何想法、想法、包/模块或文章,我们将不胜感激。 最佳答案 实现此目的的一种直接方法是估计entropy每个图像的帧,并选择具有最大熵的帧。在信息论中,熵可以被认为是图像的“随机性”。单一颜色的图像是非常可预测的,分布越平坦,越随机。这与Arthur-R描述

随机推荐