前端程序员面试笔试宝典(1),阿里前端社招面试

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

px是相对长度单位,相对于显示器屏幕分辨率而言的。

em是相对长度单位,相对于当前对象内文本的字体尺寸。

px定义的字体,无法用浏览器字体放大功能。

em的值并不是固定的,会继承父级元素的字体大小,1 ÷ 父元素的font-size × 需要转换的像素值 = em值。

3.11、CSS中 link 和@import 的区别是什么?

a. link属于HTML标签,而@import是CSS提供的,且只能加载 CSS

b. 页面被加载时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载

c. import只在IE5以上才能识别,而link是HTML标签,无兼容问题

d. link方式的样式的权重 高于@import的权重

e. 当使用 Javascript 控制 DOM 去改变样式的时候,只能使用 link 方式,因为 @import 眼里只有 CSS ,不是 DOM 可以控制

3.12、position的absolute与fixed共同点与不同点

相同:

a. 改变行内元素的呈现方式,display被置为block

b. 让元素脱离普通流,不占据空间

c. 默认会覆盖到非定位元素上

区别:

absolute的”根元素“是可以设置的,而fixed的”根元素“固定为浏览器窗口。

当你滚动网页,fixed元素与浏览器窗口之间的距离是不变的。

3.13、position的值, relative和absolute分别是相对于谁进行定位的?

absolute:生成绝对定位的元素,相对于 static 定位以外的第一个祖先元素进行定位

fixed:生成绝对定位的元素,相对于浏览器窗口进行定位。 (IE6不支持)

relative:生成相对定位的元素,相对于其在普通流中的位置进行定位

static:默认值。没有定位,元素出现在正常的流中

3.14、CSS3有哪些新特性?

CSS3实现圆角(border-radius),阴影(box-shadow),对文字加特效(text-shadow),线性渐变(gradient),变形(transform

增加了更多的CSS选择器  多背景 rgba,在CSS3中唯一引入的伪元素是::selection,媒体查询,多栏布局

参考《CSS3中的动画效果记录》、《CSS3中border-radius、box-shadow与gradient那点事儿

3.15、为什么要初始化CSS样式?

因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。

当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。

3.16、解释下 CSS sprites原理,优缺点

CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,

再利用CSS的“background-image”,“background- repeat”,“background-position”的组合进行背景定位,

background-position可以用数字精确的定位出背景图片的位置。

优点:

a. 减少网页的http请求

b. 减少图片的字节

c. 解决了网页设计师在图片命名上的困扰,只需对一张集合的图片上命名就可以了,不需要对每一个小元素进行命名

d. 更换风格方便,只需要在一张或少张图片上修改图片的颜色或样式,整个网页的风格就可以改变。

缺点:

a. 在宽屏,高分辨率的屏幕下的自适应页面,你的图片如果不够宽,很容易出现背景断裂

b. CSS Sprites在开发的时候,要通过photoshop或其他工具测量计算每一个背景单元的精确位置

c. 在维护的时候比较麻烦,如果页面背景有少许改动,一般就要改这张合并的图片

3.17、解释下浮动和它的工作原理?

a. 浮动元素脱离文档流,不占据空间(引起“高度塌陷”现象)

b. 浮动元素碰到包含它的边框或者浮动元素的边框停留。

3.18、浮动元素引起的问题

a. 父元素的高度无法被撑开,影响与父元素同级的元素

b. 与浮动元素同级的非浮动元素会跟随其后

c. 若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构

3.19、什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?

如果使用import方法对CSS进行导入,会导致某些页面在Windows下的IE出现一些奇怪的现象:

以无样式显示页面内容的瞬间闪烁,这种现象称之为文档样式短暂失效(Flash of Unstyled Content),简称为FOUC。

原理:当样式表晚于结构性html加载,当加载到此样式表时,页面将停止之前的渲染。此样式表被下载和解析后,将重新渲染页面,也就出现了短暂的花屏现象。

解决方法:使用LINK标签将样式表放在文档HEAD中。

3.20、line-height三种赋值方式有何区别?(带单位、纯数字、百分比)

带单位:px不用计算,em则会使元素以其父元素font-size值为参考来计算自己的行高

纯数字:把比例传递给后代,例如父级行高为1.5,子元素字体为18px,则子元素行高为1.5*18=27px

百分比:将计算后的值传递给后代

参考《line-height的理解》、《浅析line-height和vertical》,查看在线源码

3.21、:link、:visited、:hover、:active的执行顺序是怎么样的?

L-V-H-A,l(link)ov(visited)e h(hover)a(active)te,即用喜欢和讨厌两个词来概括

3.22、经常遇到的浏览器兼容性有哪些?如何解决?

a. 浏览器默认的margin和padding不同

b. IE6双边距bug

c. 在ie6,ie7中元素高度超出自己设置高度。原因是IE8以前的浏览器中会给元素设置默认的行高的高度导致的

d. min-height在IE6下不起作用

e. 透明性IE用filter:Alpha(Opacity=60),而其他主流浏览器用 opacity:0.6

f. input边框问题,去掉input边框一般用border:none;就可以,但由于IE6在解析input样式时的BUG(优先级问题),在IE6下无效

3.23、有哪项方式可以对一个DOM设置它的CSS样式?

a. 外部样式表:通过标签引入一个外部css文件

b. 内部样式表:将css代码放在

c. 内联样式:将css样式直接定义在 HTML 元素内部

3.24、什么是外边距重叠?重叠的结果是什么?

外边距重叠就是margin-collapse。

在CSS当中,相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的外边距可以结合成一个单独的外边距。这种合并外边距的方式被称为折叠,并且因而所结合成的外边距称为折叠外边距。

折叠结果遵循下列计算规则:

a. 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值

b. 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值

c. 两个外边距一正一负时,折叠结果是两者的相加的和

3.25、rgba()和opacity的透明效果有什么不同?

a. opacity作用于元素,以及元素内的所有内容的透明度,rgba()只作用于元素的颜色或其背景色。

b. 设置rgba透明的元素的子元素不会继承透明效果!

3.26、css属性content有什么作用?有什么应用?

css的content属性专门应用在 before/after 伪元素上,用于来插入生成内容。

可以配合自定义字体显示特殊符号。

四、JavaScript

============

4.1、请解释一下什么是闭包

当函数可以记住并访问所在的作用域时,就产生了闭包,即使函数是在当前作用域之外执行。闭包有如下特性:

a. JavaScript允许你使用在当前函数以外定义的变量

b. 即使外部函数已经返回,当前函数仍然可以引用在外部函数所定义的变量

c. 闭包可以更新外部变量的值

d. 用闭包模拟私有方法

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题。

在定时器、事件监听器、Ajax请求、跨窗口通信、Web Workers或者任何其他的异步(或者同步)任务中,只要使用了回调函数,实际上就是在使用闭包!

参考《作用域、提升与闭包》《作用域、提升与闭包

4.2、call 和 apply 的区别是什么?

call 和 apply 就是为了改变函数体内部 this 的指向。

区别是从第二个参数起,call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。

当参数明确时用call与apply都行, 当参数不明确时可用apply给合arguments

4.3、如何使用原生 Javascript 代码深度克隆一个对象(注意区分对象类型)

在网上找了个函数,用递归的方式做复制。传入的参数必须得是Array或Object。

并且用到了JSON.stringifyJSON.parse查看在线代码。参考《JavaScript中的对象克隆

4.4、 jQuery中 ( ′ . c l a s s ′ ) 和 (′.class′)和 (′.class)(‘div.class’) 哪个效率更高?

jQuery内部使用Sizzle引擎,处理各种选择器。Sizzle引擎的选择顺序是从右到左,所以这条语句是先选.class,

第二个会直接过滤出div标签,而第一个就不会过滤了,将所有相关标签都列出。参考《jQuery最佳实践

4.5、实现输出document对象中所有成员的名称和类型

用一个for in方式循环document,然后在将内容console出来,

就是看到篇文章还会判断document.hasOwnProperty,然后再做打印,我测试了下这样的话打印不出来。

查看在线代码。参考《JavaScript要点归档:DOM

4.6、获得一个DOM元素的绝对位置

offsetTop:返回当前元素相对于其 offsetParent 元素的顶部的距离

offsetLeft:返回当前元素相对于其 offsetParent 元素的左边的距离

getBoundingClientRect():返回值是一个DOMRect对象,它包含了一组用于描述边框的只读属性——left、top、right和bottom,属性单位为像素

参考《JavaScript中尺寸、坐标》,查看在线代码

4.7、如何利用JS生成一个table?

首先是用createElement创建一个table,再用setAttribute设置table的属性,

然后用for循环设置tr和td的内容,用appendChild拼接内容,设置td的时候还用到innerHTMLstyle.padding。

查看在线代码。参考《JavaScript要点归档:DOM表格》《JavaScript要点归档:DOM

4.8、实现预加载一张图片,加载完成后显示在网页中并设定其高度为50px,宽度为50px

先new Image()获取一个图片对象,然后在图片对象的onload中设置宽度和高度。查看在线代码

4.9、假设有一个4行tr的table,将table里面tr顺序颠倒

先是通过table.tBodies[0].rows获取到当前tbody中的行,接下来是两种方法处理。获取到的行没有reverse这个方法。

第一种是将这些行push到另外一个数组中

第二种是用Array.prototype.slice.call()将那些行变成数组,

接着用reverse倒叙,table再appendChild。查看在线代码

这里我有个疑问,就是在appendChild的时候,并不是在最后把列加上,而是做了替换操作?

4.10、模拟一个HashTable类,一个类上注册四个方法:包含有add、remove、contains、length方法

先是在构造函数中定义一个数组,然后用push模拟add,splice模拟remove。

四个方法都放在了prototype上面。查看在线代码

4.11、Ajax读取一个XML文档并进行解析的实例

a. 初始化一个HTTP请求,IE以ActiveX对象引入。 后来标准浏览器提供了XMLHttpRequest类,它支持ActiveX对象所提供的方法和属性

b. 发送请求,可以调用HTTP请求类的open()和send()方法

c. 处理服务器的响应,通过http_request.onreadystatechange = nameOfTheFunction。来指定函数

参考《AJAX》《开始AJAX》,查看在线代码

4.12、JS如何实现面向对象和继承机制?

创建对象方法:

a. 利用json创建对象

b. 使用JavaScript中的Object类型

c. 通过创建函数来生成对象

继承机制:

a. 构造函数绑定,使用call或apply方法,将父对象的构造函数绑定在子对象上

b. prototype模式,继承new函数的模式

c. 直接继承函数的prototype属性,对b的一种改进

d. 利用空对象作为中介

e. 在ECMAScript5中定义了一个新方法Object.create(),用于创建一个新方法

f. 拷贝继承,把父对象的所有属性和方法,拷贝进子对象,实现继承。参考《JavaScript中的对象克隆

参考《Javascript继承机制的设计思想》《构造函数的继承》,查看在线代码

4.13、JS模块的封装方法,比如怎样实现私有变量,不能直接赋值,只能通过公有方法

a. 通过json生成对象的原始模式,多写几个就会非常麻烦,也不能反映出它们是同一个原型对象的实例

b. 原始模式的改进,可以写一个函数,解决代码重复的问题。同样不能反映出它们是同一个原型对象的实例

c. 构造函数模式,就是一个普通函数,不过内部使用了this变量,但是存在一个浪费内存的问题。

d. Prototype模式,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承,可以把那些不变的属性和方法,直接定义在prototype对象上。Prototype模式的验证方法:isPrototypeOf()hasOwnProperty()in运算符。

参考《封装》,查看在线代码

4.14、对this指针的理解,可以列举几种使用情况?

this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。

this指的是:调用函数的那个对象。

a. 纯粹的函数调用,属于全局性调用,因此this就代表全局对象Global。

b. 作为对象方法的调用,这时this就指这个上级对象。

c. 作为构造函数调用,就是通过这个函数new一个新对象(object)。这时,this就指这个新对象。

d. applycall的调用,它们的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。

参考《Javascript的this用法》《this》,查看在线代码

4.15、在JavaScript中,常用的绑定事件的方法有哪些?

a. 在DOM元素中直接绑定,DOM元素,可以理解为HTML标签,onXXX=“JavaScript Code”,查看事件列表

b. 在JavaScript代码中绑定,elementObject.onXXX=function(){},通称为DOM0事件系统。

c. 绑定事件监听函数,标准浏览器使用 addEventListener() ,IE11以下版本attachEvent() 来绑定事件监听函数,通称为DOM2事件系统。

参考《JavaScript绑定事件的方法》《JavaScript中事件处理

4.16、解释下javascript的冒泡和捕获

事件

a. Netscape主张元素1的事件首先发生,这种事件发生顺序被称为捕获型

b. 微软则保持元素3具有优先权,这种事件顺序被称为冒泡型

c. W3C选择了一个择中的方案。任何发生在w3c事件模型中的事件,首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段

事件监听函数addEventListener()的第三个参数就是控制方法是捕获还是冒泡

参考《事件》、《javascript的冒泡和捕获》,查看在线代码

4.17、jQuery的特点

a. 一款轻量级的js库

b. 丰富快速的DOM选择器

c. 链式表达式

d. 事件、样式、动画等特效支持

e. Ajax操作封装,支持跨域

f. 跨浏览器兼容

g. 插件扩展开发

参考《JQuery特点、优缺点及其常用操作

4.18、Ajax有哪些好处和弊端?

优点:

a. 无刷新更新数据

b. 异步与服务器通信

c. 前端和后端负载平衡

d. 基于标准被广泛支持

e. 界面与应用分离

缺点:

a. AJAX干掉了Back和History功能,即对浏览器机制的破坏

b. AJAX的安全问题

c. 对搜索引擎支持较弱

d. 违背URL和资源定位的初衷

参考《AJAX工作原理及其优缺点

4.19、null和undefined的区别?

null:

a. null是一个表示"无"的对象,转为数值时为0

b. null表示"没有对象",即该处不应该有值。

undefined:

a. undefined是一个表示"无"的原始值,转为数值时为NaN。

b. undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。

参考《undefined与null的区别

4.20、new操作符具体干了什么呢?

a. 一个新对象被创建。它继承自函数原型

b. 构造函数被执行。执行的时候,相应的传参会被传入

c. 上下文(this)会被指定为这个新实例

d. 如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果

参考《new运算符

4.21、js延迟加载的方式有哪些?

a. 将script节点放置在最后之前

b. 使用script标签的defer和async属性,defer属性为延迟加载,是在页面渲染完成之后再进行加载的,而async属性则是和文档并行加载

c. 通过监听onload事件,动态添加script节点

d. 通过ajax下载js脚本,动态添加script节点

参考《javascript延迟加载方式

4.22、如何解决跨域问题?

a. JSONP(JSON with Padding),填充式JSON

b. iframe跨域

c. HTML5的window.postMessage方法跨域

d. 通过设置img的src属性,进行跨域请求

e. 跨域资源共享(CORS),服务器设置Access-Control-Allow-OriginHTTP响应头之后,浏览器将会允许跨域请求

4.23、documen.write和 innerHTML的区别

write:

a. 改变 HTML 输出流

b. 当在文档加载之后使用 document.write(),这会覆盖该文档。例如onload事件中

c. 输入css的style标签能改变样式,例如document.write(“”);

innerHTML:

a. 改变 HTML 内容

b. 输入css的style标签不能改变样式。也是能改变样式的

参考《JavaScript HTML DOM - 改变 HTML

4.24、哪些操作会造成内存泄漏?

a. 当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

b. 在IE中,如果循环引用中的任何对象是 DOM 节点或者 ActiveX 对象,垃圾收集系统则不会处理。

c. 闭包可以维持函数内局部变量,使其得不到释放。

d. 在销毁对象的时候,要遍历属性中属性,依次删除,否则会泄漏。

参考《js内存泄漏的几种情况》、《JavaScript内存分析

4.25、JavaScript中的变量声明提升?

函数声明和变量声明总是被JavaScript解释器隐式地提升到包含他们的作用域的最顶端。

function优先声明于var。

函数表达式中只会提升名称,函数体只有在执行到赋值语句时才会被赋值。

function foo() {

bar();

var x = 1;

}

function foo() {//等同于

var x;

bar();

x = 1;

}

function test() {

foo(); // TypeError “foo is not a function”

bar(); // “this will run!”

var foo = function () { }// 函数表达式被赋值给变量’foo’

function bar() { }// 名为’bar’的函数声明

}

4.26、如何判断当前脚本运行在浏览器还是node环境中?

通过判断Global对象是否为window,如果是window,当前脚本运行在浏览器中

4.27、什么是 “use strict”

ECMAscript 5添加了第二种运行模式:“严格模式”(strict mode)

设立"严格模式"的目的,主要有以下几个:

a. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

b. 消除代码运行的一些不安全之处,保证代码运行的安全;

c. 提高编译器效率,增加运行速度;

d. 为未来新版本的Javascript做好铺垫。

注:经过测试IE6,7,8,9均不支持严格模式

参考《Javascript 严格模式详解

4.28、eval是做什么的?

eval()函数可计算某个字符串,并执行其中的的 JavaScript 代码。

eval()是一个顶级函数并且跟任何对象无关。

如果字符串表示了一个表达式,eval()会对表达式求值。如果参数表示了一个或多个JavaScript声明, 那么eval()会执行声明。

4.29、JavaScript原型,原型链 ?

原型:

a. 原型是一个对象,其他对象可以通过它实现属性继承。

b. 一个对象的真正原型是被对象内部的[[Prototype]]属性(property)所持有。浏览器支持非标准的访问器__proto__。

c. 在javascript中,一个对象就是任何无序键值对的集合,如果它不是一个主数据类型(undefined,null,boolean,number,string),那它就是一个对象。

原型链:

a. 因为每个对象和原型都有一个原型(注:原型也是一个对象),对象的原型指向对象的父,而父的原型又指向父的父,我们把这种通过原型层层连接起来的关系称为原型链。

b. 这条链的末端一般总是默认的对象原型。

a.__proto__ = b;

b.__proto__ = c;

c.__proto__ = {}; //default object

{}.__proto__.__proto__; //null

参考《理解JavaScript原型》《原型

4.30、画出此对象的内存图

查看在线代码

4.31、JQuery与jQuery UI 有啥区别?

jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。

jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等

4.32、jQuery的源码看过吗?能不能简单说一下它的实现原理?

jQuery给我们带来了一个简洁方便的编码模型(1>创建jQuery对象;2>直接使用jQuery对象的属性/方法/事件),

一个强悍的dom元素查找器($),插件式编程接口(jQuery.fn),以及插件初始化的”配置”对象思想

参考《jQuery工作原理解析以及源代码示例》《jQuery系列分析

4.33、jQuery 中如何将数组转化为json字符串

在jQuery1.8.3中有个方法“parseJSON”,在这个方法中会做从string转换为json。

如果当前浏览器支持window.JSON,那就直接调用这个对象中的方法。

如果没有就使用( new Function( "return " + data ) )();执行代码返回。

eval和new Function是有区别的

4.34、请写出console.log中的内容

1 var msg = ‘hello’;//顶级作用域window下有个变量msg

2 function great(name, attr) {

3 var name = ‘david’;

4 var greating = msg + name + ‘!’;

5 var msg = ‘你好’;

6 for (var i = 0; i < 10; i++) {

7 var next = msg + ‘你的id是’ + i * 2 + i;

8 }

9 console.log(arguments[0]);

10 console.log(arguments[1]);

11 console.log(greating);

12 console.log(next);

13 }

14 great(‘Tom’)

查看在线代码

a. arguments[0]被覆盖了

b. msg出现了声明提升,可以查看4.25的例子

c. next中出现了隐式的类型转换

4.35、请说明下下面代码的执行过程

1 var t=true;

2 window.setTimeout(function(){

3 t=false;

4 },1000);

5 while(t){

6 console.log(1);

7 }

8 alert(‘end’);

查看在线代码

a. JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序

b. setTimeout是异步线程,需要等待js引擎处理完同步代码(while语句)之后才会执行,while语句直接是个死循环,js引擎没有空闲,不会执行下面的alert,也不会插入setTimeout。我在chrome中执行在线代码,最后浏览器是终止死循环执行alert。

c. JavaScript的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的,所以setTimeout也永远不会执行。

4.36、输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26

参考《JavaScript Date 对象》《日月如梭,玩转JavaScript日期

4.37、Javascript中callee和caller的作用?

arguments.callee属性包含当前正在执行的函数。

Function.caller返回一个对函数的引用,该函数调用了当前函数。

4.38、函数柯里化(Currying)如何理解?

柯里化:把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

柯里化其实本身是固定一个可以预期的参数,并返回一个特定的函数,处理批特定的需求。这增加了函数的适用性,但同时也降低了函数的适用范围。

参考《前端开发者进阶之函数柯里化Currying

4.39、JS异步编程方式有几种?

a. 回调函数

b. 事件监听

c. 发布订阅

d. promise

参考《异步编程的4种方法

4.40、请说说在JavaScript引用类型和值类型的理解

值类型:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。即Undefined、Null、Boolean、Number 和 String。

引用类型:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。即对象、数组

参考《ECMAScript 原始值和引用值》,查看在线代码。下面有道题目可以研究下,具体流程参考《理解js引用类型指针的工作方式

var a = {n:1};

var b = a;

a.x = a = {n:2};

console.log(a.x);// --> undefined

console.log(b.x);// --> [object Object]

4.41、请解释一下JavaScript中的作用域和作用域链

变量的作用域(scope):程序源代码中定义这个变量的区域。

作用域链:是一个对象列表或链表,这组对象定义了这段代码“作用域中”的变量。查找变量会从第一个对象开始查找,有则用,无则查找链上的下一个对象。

参考《JavaScript权威指南

五、网络与优化

=======

5.1、讲讲输入完网址按下回车,到看到网页这个过程中发生了什么

a. 域名解析

b. 发起TCP的3次握手

c. 建立TCP连接后发起http请求

d. 服务器端响应http请求,浏览器得到html代码

e. 浏览器解析html代码,并请求html代码中的资源

f. 浏览器对页面进行渲染呈现给用户

参考《输入URL到展现页面的全过程

5.2、谈谈你对前端性能优化的理解

a. 请求优化:

合并JS和CSS,减少DNS查找次数,避免重定向,使用GET完成AJAX请求,减小请求中的Cookie,缓存资源,使用CDN,开启GZip,压缩HTML页面,开启长连接,避免行内脚本阻塞并行下载,少用iframe(阻塞onload事件,影响并行下载)。

b. CSS优化:

样式表置于页面顶部,避免使用CSS表达式,使用外部JS和CSS,压缩JS和CSS,避免滤镜。

c. JavaScript优化:

脚本置于页面底部,减少DOM访问,减少重绘和重排,尽量使用局部变量,使用定时器分割大型任务,用合适的正则操作字符串,惰性模式减少分支,事件委托,第三方代码异步加载,节流与去抖动,使用localStorage替代cookie。

d. 图片优化:

内联图使用Data:URL,压缩图片或使用WebP格式,固定图片尺寸,图片预加载,图片延迟加载,使用字体矢量图标,Sprites图片。

参考《前端网络、JavaScript优化以及开发小技巧》《实践一下前端性能分析》《JavaScript性能优化 DOM编程

5.3、请说出三种减少页面加载时间的方法

a. 尽量减少页面中重复的HTTP请求数量

b. 服务器开启gzip压缩

c. css样式的定义放置在文件头部

d. Javascript脚本放在文件末尾

e. 压缩合并Javascript、CSS代码

f. 使用多域名负载网页内的多个文件、图片

参考《减低页面加载时间的方法

5.4、请介绍下cache-control

每个资源都可以通过 Cache-Control HTTP 头来定义自己的缓存策略

Cache-Control 指令控制谁在什么条件下可以缓存响应以及可以缓存多久

Cache-Control 头在 HTTP/1.1 规范中定义,取代了之前用来定义响应缓存策略的头(例如 Expires)。

5.5、一次js请求一般情况下有哪些地方会有缓存处理?

a. 浏览器端存储

b. 浏览器端文件缓存

c. HTTP缓存304

d. 服务器端文件类型缓存

e. 表现层&DOM缓存

参考《一次HTTP请求中有哪些地方可以缓存

5.6、一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。

a. 图片懒加载,滚动到相应位置才加载图片。

b. 图片预加载,如果为幻灯片、相册等,将当前展示图片的前一张和后一张优先下载。

c. 使用CSSsprite,SVGsprite,Iconfont、Base64等技术,如果图片为css图片的话。

d. 如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验。

5.7、谈谈以前端角度出发做好SEO需要考虑什么?

a. 了解搜索引擎如何抓取网页和如何索引网页

b. meta标签优化

c. 关键词分析

d. 付费给搜索引擎

e. 链接交换和链接广泛度(Link Popularity)

f. 合理的标签使用

5.8、HTTP2.0有哪些提升?

a. HTTP 2.0中的二进制分帧层突破了限制:客户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。

b. 把HTTP消息分解为很多独立的帧之后,就可以通过优化这些帧的交错和传输顺序,进一步提升性能。

c. HTTP 2.0通过让所有数据流共用同一个连接,可以更有效地使用TCP连接。

d. 服务器除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。

e. HTTP 2.0会压缩首部元数据,针对之前的数据只编码发送差异数据。

5.9、TCP与UDP的区别

a. UDP 协议的头长度不到TCP头的一半,所以同样大小的包里UDP携带的净数据比TCP包多。

b. TCP会发响应,UDP不会。并且UDP没有Seq和Ack等概念,省去了建立连接的开销,DNS解析就使用UDP协议。TCP有3次握手4次挥手。

c. UDP不能分割报文段(MSS),超过MTU的时候,发送方的网络层负责分片,接收方收到分片后再组装起来,这个过程会消耗资源,降低性能。

d. UDP没有重传机制,丢包的时候就不能按需发送。TCP有超时重传、快速重传和SACK。

5.10、URI和URL

URI(Uniform Resource Identifier):统一资源标识符。

URL(Uniform Resoure Locator):统一资源定位符,通俗的说法是网址。

URI表示某一互联网资源,而URL表示资源地点,所以URL是URI的子集。

小程序看试题更方便
总结:

  • 函数式编程其实是一种编程思想,它追求更细的粒度,将应用拆分成一组组极小的单元函数,组合调用操作数据流;

  • 它提倡着 纯函数 / 函数复合 / 数据不可变, 谨慎对待函数内的 状态共享 / 依赖外部 / 副作用;

Tips:

其实我们很难也不需要在面试过程中去完美地阐述出整套思想,这里也只是浅尝辄止,一些个人理解而已。博主也是初级小菜鸟,停留在表面而已,只求对大家能有所帮助,轻喷🤣;

我个人觉得: 这些编程范式之间,其实并不矛盾,各有各的 优劣势

理解和学习它们的理念与优势,合理地 设计融合,将优秀的软件编程思想用于提升我们应用;

所有设计思想,最终的目标一定是使我们的应用更加 解耦颗粒化、易拓展、易测试、高复用,开发更为高效和安全

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ss图片的话。

d. 如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验。

5.7、谈谈以前端角度出发做好SEO需要考虑什么?

a. 了解搜索引擎如何抓取网页和如何索引网页

b. meta标签优化

c. 关键词分析

d. 付费给搜索引擎

e. 链接交换和链接广泛度(Link Popularity)

f. 合理的标签使用

5.8、HTTP2.0有哪些提升?

a. HTTP 2.0中的二进制分帧层突破了限制:客户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。

b. 把HTTP消息分解为很多独立的帧之后,就可以通过优化这些帧的交错和传输顺序,进一步提升性能。

c. HTTP 2.0通过让所有数据流共用同一个连接,可以更有效地使用TCP连接。

d. 服务器除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。

e. HTTP 2.0会压缩首部元数据,针对之前的数据只编码发送差异数据。

5.9、TCP与UDP的区别

a. UDP 协议的头长度不到TCP头的一半,所以同样大小的包里UDP携带的净数据比TCP包多。

b. TCP会发响应,UDP不会。并且UDP没有Seq和Ack等概念,省去了建立连接的开销,DNS解析就使用UDP协议。TCP有3次握手4次挥手。

c. UDP不能分割报文段(MSS),超过MTU的时候,发送方的网络层负责分片,接收方收到分片后再组装起来,这个过程会消耗资源,降低性能。

d. UDP没有重传机制,丢包的时候就不能按需发送。TCP有超时重传、快速重传和SACK。

5.10、URI和URL

URI(Uniform Resource Identifier):统一资源标识符。

URL(Uniform Resoure Locator):统一资源定位符,通俗的说法是网址。

URI表示某一互联网资源,而URL表示资源地点,所以URL是URI的子集。

小程序看试题更方便
总结:

  • 函数式编程其实是一种编程思想,它追求更细的粒度,将应用拆分成一组组极小的单元函数,组合调用操作数据流;

  • 它提倡着 纯函数 / 函数复合 / 数据不可变, 谨慎对待函数内的 状态共享 / 依赖外部 / 副作用;

Tips:

其实我们很难也不需要在面试过程中去完美地阐述出整套思想,这里也只是浅尝辄止,一些个人理解而已。博主也是初级小菜鸟,停留在表面而已,只求对大家能有所帮助,轻喷🤣;

我个人觉得: 这些编程范式之间,其实并不矛盾,各有各的 优劣势

理解和学习它们的理念与优势,合理地 设计融合,将优秀的软件编程思想用于提升我们应用;

所有设计思想,最终的目标一定是使我们的应用更加 解耦颗粒化、易拓展、易测试、高复用,开发更为高效和安全

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-eGXUNi80-1713067157943)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值