×

前端面试题 HTML、CSS、JS、Vue、Es6

前端技术网 前端技术网 发表于2024-01-04 23:08:31 浏览2230 评论0

抢沙发发表评论

一、Web前端企业面试题

答:

一、display和visibility的相同与不同点

前端面试题 HTML、CSS、JS、Vue、Es6

1、相同点:display和visibility都有讲元素隐藏的意思

2、不同点:display是元素隐藏,隐藏的元素不占文档流

而visibility隐藏的元素仍然占文档流

二、display和visibility的属性值

1、display

2、visibility

前端面试题 HTML、CSS、JS、Vue、Es6

答:

在开发过程中经常需要循环遍历数组或者对象,使用最多的方法 forEach、for…in、 for…of,整理一下他们的异同点

for循环

其实除了这三种方法以外还有一种最原始的遍历,自Javascript诞生起就一直用的就是for循环,它用来遍历数组

for循环中可以使用return、break等来中断循环

结果:

forEach

对数组的每一个元素执行一次提供的函数(不能使用return、break等中断循环),不改变原数组,无返回值undefined。

输出结果:

for…in

循环遍历的值都是数据结构的键值

总结一句: for in也可以循环数组但是特别适合遍历对象

结果:

for…of

它是ES6中新增加的语法,用来循环获取一对键值对中的值

循环一个数组

循环一个普通对象(报错)

答:

px:像素(Pixel),相对长度单位。像素px是相对于显示器屏幕分辨率而言的。--即分辨率不同的机型当前对应的距离可能发生变化。(1Inches=xPx)。

所以相对于同一机型来说是一个绝对的长度单位。

em:是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。

以其父级元素为基准来变化长度。所以其算法不是一个固定的值。

rem:是CSS3新增的一个相对单位(root em,根em)。

那么其好用在用可以直接设置HTML的font-size,然后在其子类都是以这个大小为基准变化的值。

在移动设备上,我们常常设置

此方式的目的是为了将当前屏幕(PC)分辨率的px转化成手机端的px,让px在手机上能够兼容此方式。

因此,此时看见的12px与PC端的12px无异。但是,如果不写着个meta的话,那么,浏览器会一直以PC的视图来决定手机端的px的大小,让视图看起来变小了很多。

那么,响应式页面则经常配合媒体查询media来设置不同分辨率下手机的各种不同的配置机构,然后根据父级来变化所有的相对长度。

基础篇

1.shift

//删除原数组的第一项,并返回删除元素的值,如果数组为空则返回undefined

2.unshift

//将参数添加到原数组开头,并返回数组的长度

//注:此方法在ie6.0下

//测试的返回值始终为undefined,在firefox下测试的返回值为7,所以此方法不可靠

//一般需要用返回值时可用splice代替

3.pop

//删除原数组的最后一项,并返回删除元素的值;如果数组为空则返回undefined

4.push

//将参数添加到原数组末尾,并返回数组的长度

5.concat

//返回一个新数组,是将参数添加到原数组中构成的

6.splice

7.reverse

8.sort(orderfunction)

9.slice(start,end)

10.join(separator)

11.indexOf

12.lastIndexOf

13. Array.isArray()

14. Array.toString()

进阶篇

1.forEach

是最为常用的情景,它至于遍历,可以在获取当前数据项的前提下,对数据进行修改。它没有返回值。理解起来也是最容易的。

2.map

map的本意就是映射,也就是将一个值从一种形式映射到另一种形式,比如将key映射到value。它的每一次遍历都会有一个返回值。这些返回值组合成最终的结果数组。事实就是如此

forEach和map对比

相同点

1)都是循环遍历数组中的每一项;

2)forEach()和map()匿名函数的参数相同,参数分别是item(当前每一项)、index(索引值)、arr(原数组);

3)this都是指向调用方法的数组;

4)只能遍历数组;

不相同点

1)map()创建了新数组,不改变原数组;forEach()可以改变原数组。

2)遇到空缺的时候map()虽然会跳过,但保留空缺;forEach()遍历时跳过空缺,不保留空缺。

3)map()按照原始数组元素顺序依次处理元素;forEach()遍历数组的每个元素,将元素传给回调函数。

3.filter

它致力于从已有的数组中筛选出符合一定条件的数据项,最后的返回值是所有符合条件的数据项构成的数组。它不会修改原来的数组。记住,它的立足点就是筛选。也仅仅是筛选。还有一点需要注意:每一次遍历都会有一个返回值,它的类型是布尔类型。返回值只有是true,当前遍历项才会被筛选中。不要试图在filter中去修改原始数组。

理解:就是在一堆数据里面去筛选你需要的数据或者剔除你不需要的数据

4.find()

返回通过测试的数组的第一个元素的值,

理解:假如你去一个一群人的地方去找人你说我找xxb他要是在那里就找到不在那里就是undefined

在第一次调用 callback函数时会确定元素的索引范围,因此在 find方法开始执行之后添加到数组的新元素将不会被 callback函数访问到。如果数组中一个尚未被callback函数访问到的元素的值被callback函数所改变,那么当callback函数访问到它时,它的值是将是根据它在数组中的索引所访问到的当前值。被删除的元素仍旧会被访问到。

语法

array.find(function(value, index, arr),thisValue)

value:必须,代表当前元素,其他四个参数都是可选,index代表当前索引值,arr代表当前的数组,thisValue代表传递给函数的值,一般用this值,如果这个参数为空,undefined会传递给this值

返回值:返回符合测试条件的第一个数组元素的值,如果没有符合条件的则返回undefined。

扩展: findIndex()方法的用法与find()方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。自己try吧

5.every

理解:这个就像上课了老师说昨天布置的作业只要有一个人没有写完今天就不讲课然后挨个检查当检查到有一个没有写完的时候就不检查了返回不讲课了(false)

6.some

理解:相当于在一个数组里面找你想要的那个数找到了就返回true找不到就返回false

7.reduce

它这个方法是接收一个函数作为累加器,将数组中的值(从左向右)开始合并,最总为一个值然后返回出来,callback

他可以传四个参数:

1,previousValue:上一次调用回调返回的值,或者是提供的初始值(initialValue)

2,currentValue:数组中当前被处理的元素

3,index:不啰嗦,自己顾名思义去吧

4,array:返回调用reduce的数组

彩蛋:这里附上前几天某某人比较喜欢的切割字符串的方法

substring()和 substr()

相同点:如果只是写一个参数,两者的作用都一样:都是是截取字符串从当前下标以后直到字符串最后的字符串片段。

不同点:第二个参数

substr(startIndex, lenth)//第二个参数是截取字符串的长度(从起始点截取某个长度的字符串);

substring(startIndex, endIndex)//第二个参数是截取字符串最终的下标(截取2个位置之间的字符串,‘含头不含尾')。

1:在使用vue框架的过程中,我们经常需要给一些数据做一些初始化处理,这时候我们常用的就是在created与mounted选项中作出处理。

首先来看下官方解释,官方解释说created是在实例创建完成后呗立即调用。在这一步,实例已完成以下配置:数据观测(data observer),属性和方法的运算,watch/event事件回调。然而,挂载阶段还没开始,$el属性目前不可见。

这话的意思我觉得重点在于说挂架阶段还没开始,什么叫还没开始挂载,也就是说,模板还没有被渲染成html,也就是这时候通过id什么的去查找页面元素是找不到的。下面看下实例来证明。

所以,一般creadted钩子函数主要是用来初始化数据。

2:mounted钩子函数一般是用来向后端发起请求拿到数据以后做一些业务处理。官方解释如下:

el被新创建的 vm.$el替换,并挂载到实例上去之后调用该钩子。如果 root实例挂载了一个文档内元素,当 mounted被调用时 vm.$el也在文档内。

这意思是该钩子函数是在挂在完成以后也就是模板渲染完成以后才会被调用。下面看实例

下面是结果

nihao

取到了值,这说明这时候vue模板已经渲染完毕。因此,Dom操作一般是在mounted钩子函数中进行的

computed:{}计算属性,什么是计算属性呢,我个人理解就是对数据进行一定的操作,可以包含逻辑处理操作,对计算属性中的数据进行监控。计算属性是基于它的以来进行更新的,只有在相关依赖发生改变时侧能更新变化,以函数的形式返回结果。然后可以像绑定普通属性一样在模板中绑定计算属性。

总结:

通常created使用的次数多,而mounted通常是在一些插件的使用或者组件的使用中进行操作,比如插件chart.js的使用: var ctx= document.getElementById(ID);通常会有这一步,而如果你写入组件中,你会发现在created中无法对chart进行一些初始化配置,一定要等这个html渲染完后才可以进行,那么mounted就是不二之选。

methods:{}中的方法都需要主动去触发,比如点击click之类的

而created(){}、mounted(){}、里面的代码都是自动去执行的,即vue生命周期到了哪一步就直接去执行对应钩子函数里面的代码了,无需手动去执行

created中主要放初始化获取数据之类,mounted()中挂载到具体的DOM节点

computed:{}计算属性,什么是计算属性呢,我个人理解就是对数据进行一定的操作,可以包含逻辑处理操作,对计算属性中的数据进行监控。计算属性是基于它的以来进行更新的,只有在相关依赖发生改变时侧能更新变化,以函数的形式返回结果。然后可以像绑定普通属性一样在模板中绑定计算属性。

mounted是生命周期钩子,vue的生命周期中一个实例的mounted只会运行一次。mounted在vue的渲染模板挂载到$el元素上才会调用,很显然你export的时候el都么有自然不会运行mounted钩子函数了。

所有的方法都应该在methods里定义,然后在created或者mounted里使用this调用方法,用这种方式实现初始化

6、Vue中组件之间的传参方式有哪些方式?

Vue组件传参的八种方式总结

Vue组件的使用不管是在平常工作还是在面试面试中,都是频繁出现的。因此系统的梳理一下组件之间的传参还是非常有必要的

一、props传参

子组件定义 props有三种方式:

//第一种数组方式

//第二种对象方式

//第三种对象嵌套对象方式

第三种对象默认支持 4种属性,并且都是非必填的。可以随意使用

父组件传参的俩种方式

第一种静态属性传参

注意:

1、在不定义 props类型的情况下 props接受到的均为 String。

2、当 props属性指定为 Boolean时,并且只有属性 key没有值 value时接受到的是 true

第二种动态属性传参

注意:

1、需要区分非简写形式传入的值是对象,则会对应 props中多个值

2、会保留传入值的类型

3、如果是表达式则获取到的是表达式的计算结果

二、attrs和listeners

$attrs

$attrs会获取到 props中未定义的属性(class和 style属性除外),支持响应式。常用的场景有俩种:

组件嵌套组件时可以使用$attrs来支持过多的属性支持。比如 elementUI的 table组件。支持的属性十几个,而平常封装的时候用的最多的也就一俩个。

属性默认是添加在父组件上的,有时候想把多余的属性添加在子组件上(可以结合 inheritAttrs: false属性,让父属性不接受多余的属性)

$listeners定义的事件都在子组件的根元素上,有时候想加到其他元素上。就可以使用$listerners。它包含了父组件中的事件监听器(除了带有.native修饰符的监听器)

三、$emit通知

这里有一道考题: for循环的时候如何拿到子组件的传值和 for中循环的值

答案有俩种,一是$event,二是闭包。只是需要注意$event只能获取到第一个值

四、v-model

这个其实是一种通过 emit,on的组合方式。优点再于同步值方便,写法优雅。下面三种写法其实是一个意思

五、插槽

六、$refs,$root,$parent,$children

$root获取根组件

$parent获取父组件

$children获取子组件(所有的子组件,不保证顺序)

$refs组件获取组件实例,元素获取元素

七、project/ inject

注意:注入的值是非响应的

八、Vuex

这个相当于单独维护的一组数据,就不过多的说了。

watch,computed和methods的关系

1.watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个数据(称它为依赖数据)发生变化的时候,所有依赖这个数据的“相关”数据“自动”发生变化,也就是自动调用相关的函数去实现数据的变动。

2.对methods:methods里面是用来定义函数的,很显然,它需要手动调用才能执行。而不像watch和computed那样,“自动执行”预先定义的函数

watch和computed各自处理的数据关系场景不同

1. watch擅长处理的场景:一个数据影响多个数据

2. computed擅长处理的场景:一个数据受多个数据影响

watch用法监听下记haiZeiTuan_Name的值,会改变其他所有的值

结果:this.suoLong会变为'橡胶海贼团索隆',以此类推

computed用法监听下记firstName,secName,thirdName的值,会改变luFei_Name的值

methods和computed的区别例子

注意两次点击computed返回的时间是相同的!!

1.两次点击methods返回的时间是不同的

2.注意两次点击computed返回的时间是相同的

【注意】为什么两次点击computed返回的时间是相同的呢?new Date()不是依赖型数据(不是放在data等对象下的实例数据),所以computed只提供了缓存的值,而没有重新计算

只有符合:1.存在依赖型数据 2.依赖型数据发生改变这两个条件,computed才会重新计算。

参考:http://www.cnblogs.com/penghuwan/p/7194133.html

答:https://codecat.blog.csdn.net/article/details/100031285

1、Promise

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大,简单地说,Promise好比容器,里面存放着一些未来才会执行完毕(异步)的事件的结果,而这些结果一旦生成是无法改变的

2、async await

async await也是异步编程的一种解决方案,他遵循的是Generator函数的语法糖,他拥有内置执行器,不需要额外的调用直接会自动执行并输出结果,它返回的是一个Promise对象。

两者的主要用法、语法就不赘述了,感兴趣的同学可以自行查阅 es6中文文档

两者的区别

1、Promise的出现解决了传统callback函数导致的“地域回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。

2、async await与Promise一样,是非阻塞的。

3、async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。

简单来看,这两者除了语法糖不一样外,他们解决的问题、达到的效果是大同小异的,我们可以在不同的应用场景,根据自己的喜好来选择使用。

二、WEB前端面试题

第二章面试题基础篇

2.1 HTML面试题

面试题:行内元素有哪些?块级元素有哪些?空(void)元素有那些?

面试题:页面导入样式时,使用link和@import有什么区别?

面试题:title与h1的区别、b与strong的区别、i与em的区别?

面试题:img标签的title和alt有什么区别?

面试题:png、jpg、gif这些图片格式解释一下,分别什么时候用?

2.2 CSS面试题

面试题:css背景纹路

面试题:介绍一下CSS的盒子模型

面试题:CSS选择符有哪些?哪些属性可以继承?

面试题:CSS优先级算法如何计算?

面试题:用CSS画一个三角形

面试题:一个盒子不给宽度和高度如何水平垂直居中?

面试题:display有哪些值?说明他们的作用。

面试题:对BFC规范(块级格式化上下文:block formatting context)的理解?

面试题:清除浮动有哪些方式?

面试题:在网页中的应该使用奇数还是偶数的字体?为什么呢?

面试题:写一个左中右布局占满屏幕,其中左、右俩块固定宽200,中间自适应宽,要求先加载中间块,请写出结构及样式。

面试题:什么是CSS reset?

面试题:css sprite是什么,有什么优缺点

面试题:display: none;与visibility: hidden;的区别

面试题:position有哪些值?有什么作用?【特别多公司问】

面试题:line-height和height有什么区别?

面试题:opacity和 rgba区别

2.3 JavaScript基础面试题

面试题:延迟加载JS有哪些方式?

面试题:JS数据类型有哪些?

面试题:null和undefined的区别

面试题:JS数据类型考题

面试题:==和===有什么不同

面试题:JS微任务和宏任务

面试题:JS作用域考题

面试题:JS对象考题

面试题:JS作用域+this指向+原型考题

面试题:JS判断变量是不是数组,你能写出哪些方法?

面试题:slice是干嘛的、splice是否会改变原数组

面试题:JS数组去重

面试题:找出多维数组最大值

面试题:给字符串新增方法实现功能

面试题:找出字符串出现最多次数的字符以及次数

2.4真正移动端—— H5/C3面试题

面试题:什么是语义化标签

面试题:::before和:after中双冒号和单冒号有什么区别?解释一下这2个伪元素的作用。

面试题:如何关闭iOS键盘首字母自动大写

面试题:怎么让Chrome支持小于12px的文字?

面试题:rem和em有什么样区别

面试题:ios系统中元素被触摸时产生的半透明灰色遮罩怎么去掉

面试题:webkit表单输入框placeholder的颜色值能改变吗?

面试题:禁止ios长按时不触发系统的菜单,禁止ios&android长按时下载图片

面试题:禁止ios和android用户选中文字

面试题:自适应 [淘宝无线适配]

面试题:响应式

第三章面试题进阶篇

3.1 JavaScript进阶面试题

面试题:new操作符具体做了什么

面试题:闭包【必须会】

面试题:原型链【必须会】

面试题: JS继承有哪些方式

面试题:说一下call、apply、bind区别

面试题:sort背后原理是什么?

面试题:深拷贝和浅拷贝

面试题:localstorage、sessionstorage、cookie的区别

3.2 ES6面试题

面试题:var、let、const区别

面试题:作用域考题

面试题:将下列对象进行合并

面试题:箭头函数和普通函数有什么区别?

面试题:Promise有几种状态

面试题:find和filter的区别【大厂】

面试题:some和every的区别【大厂】

3.3 webpack面试题

面试题:webpack插件

3.4 Git面试题

面试题:git常用命令

面试题:解决冲突

面试题:GitFlow

第四章面试题框架篇

4.1区分初中高级的—— Vue面试题

面试题:Vue2.x生命周期有哪些?

1.系统自带八个

2.当一旦进入到某个组件会执行哪些生命周期

3.$el和$data在哪个阶段有

4.如果使用keep-alive会多俩个生命周期

5.如果加入keep-alive第一次进入组件会执行哪些生命周期

6.如果加入keep-alive第二次或者第N进入该组件会执行哪些生命周期

面试题:谈谈你对keep-alive的了解

面试题:v-if和v-show区别

面试题:v-if和v-for优先级 2.x

面试题:ref是什么?

面试题:nextTick是什么?

面试题:Vue中如何做样式穿透

面试题:scoped原理

面试题:Vuex是单向数据流还是双向数据流?

面试题:讲一下MVVM

面试题:双向绑定原理

面试题:什么是虚拟DOM

面试题:key是干什么?

面试题:diff算法

面试题:Vue组件传值

面试题:props和data优先级谁高?

面试题:computed、methods、watch有什么区别?

面试题:Vuex

面试题:Vue路由

面试题:Vue项目打包后出现空白页

4.2微信小程序面试题

面试题:如何自定义头部?

面试题:如何自定义底部?

4.3 uni-app面试题

面试题:生命周期

面试题:条件编译

第五章面试题性能优化篇

三、前端经典面试题(包含JS、CSS、React、浏览器等)

防抖

节流

误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。

实际上HTTP协议从未规定 GET/POST的请求长度限制是多少。对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度。为了明确这个概念,我们必须再次强调下面几点:

补充补充一个get和post在缓存方面的区别:

可从IIFE、AMD、CMD、CommonJS、UMD、webpack(require.ensure)、ES Module、

vue和react都是采用diff算法来对比新旧虚拟节点,从而更新节点。在vue的diff函数中(建议先了解一下diff算法过程)。在交叉对比中,当新节点跟旧节点头尾交叉对比没有结果时,会根据新节点的key去对比旧节点数组中的key,从而找到相应旧节点(这里对应的是一个key=> index的map映射)。如果没找到就认为是一个新增节点。而如果没有key,那么就会采用遍历查找的方式去找到对应的旧节点。一种一个map映射,另一种是遍历查找。相比而言。map映射的速度更快。vue部分源码如下:

创建map函数

遍历寻找

在React中,如果是由React引发的事件处理(比如通过onClick引发的事件处理),调用setState不会同步更新this.state,除此之外的setState调用会同步执行this.state。所谓“除此之外”,指的是绕过React通过addEventListener直接添加的事件处理函数,还有通过setTimeout/setInterval产生的异步调用。

**原因:**在React的setState函数实现中,会根据一个变量isBatchingUpdates判断是直接更新this.state还是放到队列中回头再说,而isBatchingUpdates默认是false,也就表示setState会同步更新this.state,但是,有一个函数batchedUpdates,这个函数会把isBatchingUpdates修改为true,而当React在调用事件处理函数之前就会调用这个batchedUpdates,造成的后果,就是由React控制的事件处理过程setState不会同步更新this.state。

虚拟dom相当于在js和真实dom中间加了一个缓存,利用dom diff算法避免了没有必要的dom操作,从而提高性能。

具体实现步骤如下:

用 JavaScript对象结构表示 DOM树的结构;然后用这个树构建一个真正的 DOM树,插到文档当中

当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异

把2所记录的差异应用到步骤1所构建的真正的DOM树上,视图就更新了。

结构:display:none:会让元素完全从渲染树中消失,渲染的时候不占据任何空间,不能点击, visibility: hidden:不会让元素从渲染树消失,渲染元素继续占据空间,只是内容不可见,不能点击 opacity: 0:不会让元素从渲染树消失,渲染元素继续占据空间,只是内容不可见,可以点击

继承:display: none:是非继承属性,子孙节点消失由于元素从渲染树消失造成,通过修改子孙节点属性无法显示。visibility: hidden:是继承属性,子孙节点消失由于继承了hidden,通过设置visibility: visible;可以让子孙节点显式。

性能:displaynone:修改元素会造成文档回流,读屏器不会读取display: none元素内容,性能消耗较大 visibility:hidden:修改元素只会造成本元素的重绘,性能消耗较少读屏器读取visibility: hidden元素内容 opacity: 0:修改元素会造成重绘,性能消耗较少

联系:它们都能让元素不可见

常用的一般为三种.clearfix, clear:both, overflow:hidden;

比较好是.clearfix,伪元素万金油版本,后两者有局限性.

clear:both:若是用在同一个容器内相邻元素上,那是贼好的,有时候在容器外就有些问题了,比如相邻容器的包裹层元素塌陷

overflow:hidden:这种若是用在同个容器内,可以形成 BFC避免浮动造成的元素塌陷

概念:将多个小图片拼接到一个图片中。通过 background-position和元素尺寸调节需要显示的背景图案。

优点:

缺点:

block元素特点:

1.处于常规流中时,如果 width没有设置,会自动填充满父容器 2.可以应用 margin/padding 3.在没有设置高度的情况下会扩展高度以包含常规流中的子元素 4.处于常规流中时布局时在前后元素位置之间(独占一个水平空间) 5.忽略 vertical-align

inline元素特点

1.水平方向上根据 direction依次布局

2.不会在元素前后进行换行

3.受 white-space控制

4. margin/padding在竖直方向上无效,水平方向上有效

5. width/height属性对非替换行内元素无效,宽度由元素内容决定

6.非替换行内元素的行框高由 line-height确定,替换行内元素的行框高由 height, margin, padding, border决定 7.浮动或绝对定位时会转换为 block 8. vertical-align属性生效

GIF:

JPEG:

PNG:

七种数据类型

(ES6之前)其中5种为基本类型: string, number, boolean, null, undefined,

ES6出来的 Symbol也是原始数据类型,表示独一无二的值

Object为引用类型(范围挺大),也包括数组、函数,

输出结果是:

工厂模式

简单的工厂模式可以理解为解决多个相似的问题;

单例模式

只能被实例化(构造函数给实例添加属性与方法)一次

沙箱模式

将一些函数放到自执行函数里面,但要用闭包暴露接口,用变量接收暴露的接口,再调用里面的值,否则无法使用里面的值

发布者订阅模式

就例如如我们关注了某一个公众号,然后他对应的有新的消息就会给你推送,

代码实现逻辑是用数组存贮订阅者,发布者回调函数里面通知的方式是遍历订阅者数组,并将发布者内容传入订阅者数组

1.字面量

2.Object构造函数创建

3.使用工厂模式创建对象

4.使用构造函数创建对象

HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件onclick、页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件。想要知道这些事件是在什么时候进行调用的,就需要了解一下“事件流”的概念。

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

addEventListener: addEventListener是DOM2级事件新增的指定事件处理程序的操作,这个方法接收3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。最后这个布尔值参数如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。

IE只支持事件冒泡。

获取一个对象的原型,在chrome中可以通过__proto__的形式,或者在ES6中可以通过Object.getPrototypeOf的形式。

那么Function.proto是什么么?也就是说Function由什么对象继承而来,我们来做如下判别。

我们发现Function的原型也是Function。

我们用图可以来明确这个关系:

这里来举个栗子,以 Object为例,我们常用的 Object便是一个构造函数,因此我们可以通过它构建实例。

则此时,实例为instance,构造函数为Object,我们知道,构造函数拥有一个 prototype的属性指向原型,因此原型为:

这里我们可以来看出三者的关系:

在 JS中,继承通常指的便是原型链继承,也就是通过指定原型,并可以通过原型链继承原型上的属性或者方法。

在函数式编程中,函数是一等公民。那么函数柯里化是怎样的呢?

函数柯里化指的是将能够接收多个参数的函数转化为接收单一参数的函数,并且返回接收余下参数且返回结果的新函数的技术。

函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行。

在一个函数中,首先填充几个参数,然后再返回一个新的函数的技术,称为函数的柯里化。通常可用于在不侵入函数的前提下,为函数预置通用参数,供多次重复调用。

call和 apply都是为了解决改变 this的指向。作用都是相同的,只是传参的方式不同。

除了第一个参数外, call可以接收一个参数列表, apply只接受一个参数数组。

bind和其他两个方法作用也是一致的,只是该方**返回一个函数。并且我们可以通过 bind实现柯里化。

如何实现一个 bind函数

对于实现以下几个函数,可以从几个方面思考

如何实现一个call函数

如何实现一个apply函数

箭头函数其实是没有 this的,这个函数中的 this只取决于他外面的第一个不是箭头函数的函数的 this。在这个例子中,因为调用 a符合前面代码中的第一个情况,所以 this是 window。并且 this一旦绑定了上下文,就不会被任何代码改变。

在函数中,我们首先使用 var关键字声明了 name变量。这意味着变量在创建阶段会被提升( JavaScript会在创建变量创建阶段为其分配内存空间),默认值为 undefined,直到我们实际执行到使用该变量的行。我们还没有为 name变量赋值,所以它仍然保持 undefined的值。

使用 let关键字(和 const)声明的变量也会存在变量提升,但与 var不同,初始化没有被提升。在我们声明(初始化)它们之前,它们是不可访问的。这被称为“暂时死区”。当我们在声明变量之前尝试访问变量时, JavaScript会抛出一个 ReferenceError。

关于 let的是否存在变量提升,我们何以用下面的例子来验证:

let变量如果不存在变量提升, console.log(name)就会输出 ConardLi,结果却抛出了 ReferenceError,那么这很好的说明了, let也存在变量提升,但是它存在一个“暂时死区”,在变量未初始化或赋值前不允许访问。

变量的赋值可以分为三个阶段:

关于 let、 var和 function:

依次输出:undefined-> 10-> 20

答案: D

colorChange方法是静态的。静态方法仅在创建它们的构造函数中存在,并且不能传递给任何子级。由于 freddie是一个子级对象,函数不会传递,所以在 freddie实例上不存在 freddie方法:抛出 TypeError。

1.使用第一次push,obj对象的push方法设置 obj[2]=1;obj.length+=1 2.使用第二次push,obj对象的push方法设置 obj[3]=2;obj.length+=1 3.使用console.log输出的时候,因为obj具有 length属性和 splice方法,故将其作为数组进行打印 4.打印时因为数组未设置下标为 0 1处的值,故打印为empty,主动 obj[0]获取为 undefined

undefined{n:2}

首先,a和b同时引用了{n:2}对象,接着执行到a.x= a={n:2}语句,尽管赋值是从右到左的没错,但是.的优先级比=要高,所以这里首先执行a.x,相当于为a(或者b)所指向的{n:1}对象新增了一个属性x,即此时对象将变为{n:1;x:undefined}。之后按正常情况,从右到左进行赋值,此时执行a={n:2}的时候,a的引用改变,指向了新对象{n:2},而b依然指向的是旧对象。之后执行a.x={n:2}的时候,并不会重新解析一遍a,而是沿用最初解析a.x时候的a,也即旧对象,故此时旧对象的x的值为{n:2},旧对象为{n:1;x:{n:2}},它被b引用着。后面输出a.x的时候,又要解析a了,此时的a是指向新对象的a,而这个新对象是没有x属性的,故访问时输出undefined;而访问b.x的时候,将输出旧对象的x的值,即{n:2}。

在比较相等性,原始类型通过它们的值进行比较,而对象通过它们的引用进行比较。 JavaScript检查对象是否具有对内存中相同位置的引用。

我们作为参数传递的对象和我们用于检查相等性的对象在内存中位于不同位置,所以它们的引用是不同的。

这就是为什么{ age: 18}==={ age: 18}和{ age: 18}=={ age: 18}返回 false的原因。

所有对象键(不包括 Symbols)都会被存储为字符串,即使你没有给定字符串类型的键。这就是为什么 obj.hasOwnProperty('1')也返回 true。

上面的说法不适用于 Set。在我们的 Set中没有“1”: set.has('1')返回 false。它有数字类型 1, set.has(1)返回 true。

这题考察的是对象的键名的转换。

catch块接收参数 x。当我们传递参数时,这与变量的 x不同。这个变量 x是属于 catch作用域的。

之后,我们将这个块级作用域的变量设置为 1,并设置变量 y的值。现在,我们打印块级作用域的变量 x,它等于 1。

在 catch块之外, x仍然是 undefined,而 y是 2。当我们想在 catch块之外的 console.log(x)时,它返回 undefined,而 y返回 2。

关于前端面试题 HTML、CSS、JS、Vue、Es6,WEB前端面试题的介绍到此结束,希望对大家有所帮助。