前端面试高频问题解析

++++1.Flex布局用过吗?用过哪些应用场景?++++

++++2.如何实现回到顶部功能?++++

++++3.获取浏览器的宽度?++++

++++4.数组的一些方法?++++

++++5.数组在最前面添加一项,删除一项的方法?数组任意位置删除一项的方法?++++

++++6.数组的去重?++++

++++7.数组转字符串有哪些方法?++++

++++8.字符串的截取?++++

++++9.字符串转数组?++++

++++10.字符串替换?++++

++++11.vue写了哪些项目,项目是怎么搭建的,都是你搭建的吗?++++

++++12.vue-cli你用的版本是几,自己有看过吗?++++

++++13.你是怎么解决跨域的?++++

++++14.项目中的路由传参是怎么传的?怎么拼接?怎么接收传递过去的值?++++

++++15.this.router与this.route的区别?++++

++++16.如何获取当前路由的路径?++++

++++17.组件之间传值?++++

++++18.vuex存储的是什么数据?怎么使用?++++

++++19.vue的双向数据绑定原理?++++

++++20.v-show与v-if的区别?++++

++++21.小程序有写过吗?++++

++++22.vue在首次加载时执行的钩子函数?向后端发送请求时,在哪个钩子发送?++++

++++23.keep-alive组件的作用?++++

1.Flex布局用过吗?用过哪些应用场景?

Flex布局是弹性布局,给一个盒子设置display:flex,这个盒子就是弹性盒子,弹性盒子有自己的布局规则.

常用属性:

flex-direction:设置主轴的方向,

默认的是row(从左至右),可以设置成column(从上至下).如果需要设置成反向,则在后面加上'-reverse'.

justify-content:设置主轴的排列方式,

默认是flex-start从主轴开始的地方排列;flex-end从主轴结束的位置开始排列;center主轴的最中间;space-between均分对齐,第一个在最左边,第二个在最右边;space-around均分对齐.

align-items:设置侧轴的排列方式,只适合单行模式.

默认是stretch拉伸,在flex布局中,子盒子的高度默认和父盒子的高度一样;flex-start从侧轴开始的地方排列;flex-end从侧轴结束的地方排列;center侧轴的最中间;baseline元素内部第一行文字的基线对齐.

flex-wrap:nowrap默认不换行,会压缩子盒子的宽度;wrap当宽度不够的时候,会换行.

align-content:调整侧轴,适合多行的.flex-start,flex-end,center,space-between,space-around.

order:设置子盒子的排序,order越小,越靠前,默认值是0.

align-self:设置子盒子自身侧轴的位置.优先级比align-items高,取值和align-items一样.

flex:设置某个子盒子,如何分配主轴的空间.

可以将flex-grow, flex-shrink, flex-basis进行连写。flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间。

浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为flex: 0 1 auto。简写还包括:

  1. 1; -->> flex: 1 1 0%; flex: none; -->> flex: 0 0 auto
  2. auto; -->> flex: 1 1 auto; flex: 0 auto
  3. initial -->> flex: 0 1 auto; 即flex的初始值

应用的场景:

https://blog.csdn.net/weixin_42554311/article/details/88180738

开发中遇到的问题:

1、子元素被压缩

问题:当设置子容器的长度flex为1时,其他的子容器的长度会被压缩。

解决方法:设置其他子容器的flex-shrink属性为0,这样就不会被压缩。

2、图片使用flex会有间隙

问题:因为有基线的存在,图片会有一些间隙。

解决方法:设置图片的display为block就可以解决。

3、超出隐藏,overflow失效

问题:

text-overflow: ellipsis;不生效,省略号没有出现,而且过长的文字把子容器撑开,没有按预设的超出隐藏。

解决方法:

设子容器width:0;可能出在于子容器没有设置宽度,省略符可能需要对父元素设置宽度,设置为100%无效,当设置为0的时候,子容器恢复到设定的宽度,省略号也出现了。

4、flex导致设置的子元素宽高失效

问题:

父级设置display:flex后,子级设置的heigth:50px失效,只是被子元素撑开了高度。

解决方法:

flex-grow:0;flex-shrink:0;flex-grow属性为是否自动增长空间,flex-shrink属性为是否自动缩小空间,默认值为1,即自动增长/缩小。设置为0时,不会自动增长/缩小,防止固定大小的元素宽度发生变化。

5、flex布局滚动,子元素无法全部显示

问题:

父级使用flex布局,列表页设置flex:1;占满空闲空间,但是所有的列没有完全显示出来,滚动条也没有出现。

解决方法:

列表外部使用div或其他盒子包裹,使用flex布局,每个子元素设置最小宽度或实际宽度,或者设width: 0。

2.如何实现回到顶部功能?

href指向特定的id

给页面顶部元素设置一个id值,将返回顶部a链接的href属性指向改id属性的元素

<body> <div id="header">我在顶部</div> <!-- 很多内容 --> <div><a href="#header">返回顶部</a></div> </body>

使用自定义链接锚点

在页面顶部定义一个锚点,然后将返回顶部a链接的href属性指向该锚点

<body> <a name="goTop"></a> <div>我在顶部</div> <!-- 很多内容 --> <div><a href="#goTop">返回顶部</a></div> </body>

使用简单的JavaScript脚本

设置scrollTo(x,y)中的x和y的坐标值来滚动到页面的具体位置

<body> <div>我在顶部</div> <!-- 很多内容 --> <div><a href="javascript:window.scrollTo(0,0)">返回顶部</a></div> </body>

火箭上升式返回顶部(jQuery实现)

此方法能使页面动态滚动,同时将按钮换成一个箭头标志,判断页面滚动的距离,当页面滚动到一定的距离后再显示返回顶部箭头标志。这样的效果更佳生动。

<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="http://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js"></script> <style> .header { color: rgb(243, 152, 6); width: 100%; height: 200px; margin: 0 auto; text-align: center; font-size: 20px; } .footer { position: fixed; right: 50px; bottom: 50px; width: 54px; height: 54px; } </style> </head> <body> <div class="header">我在顶部</div> <!-- 很多内容 --> <img class="footer" id="gotoTop" src="https://i02piccdn.sogoucdn.com/4f3b2858eec9e2cf" alt=""> <script> function gotoTop(minHeight){ // 定义点击返回顶部图标后向上滚动的动画 ("#gotoTop").click( function(){('html,body').animate({scrollTop:'0px'},'slow'); }) // 获取页面的最小高度,无传入值则默认为600像素 minHeight? minHeight = minHeight:minHeight = 600; // 为窗口的scroll事件绑定处理函数 (window).scroll(function(){ // 获取窗口的滚动条的垂直滚动距离 var s = (window).scrollTop(); // 当窗口的滚动条的垂直距离大于页面的最小高度时,让返回顶部图标渐现,否则渐隐 if( s > minHeight){ ("#gotoTop").fadeIn(500); }else{ ("#gotoTop").fadeOut(500); }; }); }; gotoTop(); </script> </body>

3.获取浏览器的宽度?

$(window).width()

4.数组的一些方法?

https://www.jianshu.com/p/7e160067a06c

5.数组在最前面添加一项,删除一项的方法?数组任意位置删除一项的方法?

unshift() shift() splice()

6.数组的去重?

1.双层for循环

function removeSameEle(arr){ let res=[]; for(var i=0,len=arr.length;i<len;i++){ for(var j=0,resLen=res.length;j<resLen;j++){ if(arr[i]===arr[j]){//判断结果中是否已存在该数据了 break; } } //判断是否执行到了res的末尾 if(j===resLen){ res.push(arr[i]); } } return res; }

2.indexof或者includes

function removeSameEle(arr){ let res=[]; for(var i=0,len=arr.length;i<len;i++){ //if(!res.includes(arr[i])){ if(res.indexof(arr[i])<0){//判断结果中是否存在该数据了 res.push(arr[i]) } } return res; }

3.filter

function removeSameEle(arr){ let res=arr.filter((item,index,arr)=>{ return arr.indexOf(item)===index; }); return res; }

4.reduce唯一值去重

function removeSameEle(arr){ return arr.reduce((accu,cur)=>{ return accu.includes(cur)?[...accu]:[...accu,cur] },[]) }) }

5.set唯一值去重.此方法只能用于对简单数组进行去重.

function removeSameEle(arr){ return [...new Set(arr)]; }

6.Map去重

function removeSameEle(arr){ let map=new Map(); let res=[]; for(let i=0;len=arr.length;i<len;i++){ if(!map.has(arr[i])){ map.set(arr[i],arr[i]); res.push(arr[i]); } } return res; }

7.sort排序后去重

function removeSameEle(arr){ let res=[]; let sortedArr=arr.sort(); for(let i=0,len<sortedArr.length;i<len-1;i++){ if(i==0||sortedArr[i]!==sortedArr[i+1]){ res.push(sortedArr[i]); if(i===(len-2)){ res.push(sortedArr[i+1]); } } } return res; }

8.使用object.keys()去重

function removeSameEle(arr){ let res=[]; let obj={}; arr.forEach((item,index)=>{ if(!obj[item]){ obj[item]=item } }); for(let value of Object.values(obj)){ res.push(value); } return res; }

7.数组转字符串有哪些方法?

join()将数组元素连接起来以构建一个字符串

toString()将数组转换成一个字符串

toLocalString()把数组转换成本地约定的字符串

8.字符串的截取?

https://www.jianshu.com/p/90de039208d1

9.字符串转数组?

split() 把字符串转换为数组

10.字符串替换?

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

11.vue写了哪些项目,项目是怎么搭建的,都是你搭建的吗?

12.vue-cli你用的版本是几,自己有看过吗?

版本4.1.1 vue -V 查看版本

13.你是怎么解决跨域的?

浏览器的同源策略,出于安全的考虑,只要是协议、域名、端口有一个不同就算是跨域,ajax请求就会失败。浏览器有同源策略主要是为了防止CSRF(跨站点请求伪造)攻击,防止利用户的登录状态发起恶意请求。

JSONP: jsonp 和 XMLHttpRequest对象无关;本质是利用script的src属性跨域请求服务器.

jsonp最终目标: 跨域取数据.

jsonp 具体的实现步骤:

1- 前端需要准好一个方法, 将方法名字通过script标签传递给后台;

2- 后台 需要先获取方法名字, 在方法后先拼(),在括号中添加json数据;

3- 后台把填充好数据的方法调用,返回给前端;

4- 前端接收到后台返回的方法调用后,会立即执行 , 即可获取去当前参数中数据.

jsonp注意点:jsonp 只能发送get请求; jsonp 需求前后端配合完成.

CORS:使用自定义的HTTP头部让浏览器和服务器进行沟通,实现CORS的关键是后端,服务端设置Access-Control-Allow-Origin就可以开启,表示哪些域名可以访问资源。

document.domain:当二级域名相同时,例如a.test.html和b.test.html,只需要给两个页面都设置document.domain = 'test.html',就可以实现跨域。

postMessage:如a.html页面通过iframe嵌入了b.html页面,其中一个可以通过postMessage方法发送信息,另一页面通过监听message事件判断来源并接受消息。

https://juejin.im/post/5e948bbbf265da47f2561705

14.项目中的路由传参是怎么传的?怎么拼接?怎么接收传递过去的值?

https://www.jianshu.com/p/6f6cdf37b7f9

15.this.router与this.route的区别?

route中存储的是和路由相关的属性(如route.params,$route.query)

router中存储的是和路由相关的方法(如router.push(),$router.go())

16.如何获取当前路由的路径?

this.$route.path

17.组件之间传值?

1.父传子 1).在父组件中可以给子组件通过添加html属性的方式传值 2).在子组件中可以通过props进行接收参数列表 2.子传父 1).在子组件中,触发一个自定义事件,可以在出发事件的同时传参 this.Semit(事件名,参数1,参数2,...) 2).在父组件中,给子组件去注册对应的事件,绑定父组件的方法 3.非父子 1).创建一个都能访问到的事件总线event bus(就是一个空的vue实例) 2).在A组件中,触发bus的自定义事件,触发事件的同时传参 bus.Semit(事件名,参数1,参数2,...) 3).在B组件中(created),给bus注册对应的自定义事件 bus.Son(事件名,事件处理函数) 注:事件注册的越早越好,触发的时候才能保证触发到了这个事件

18.vuex存储的是什么数据?怎么使用?

vuex存储的是组件之间共享的数据.

vuex是一个全局集中响应式状态的管理工具,状态会保存在state内,可以被所有组件所引用,一经修改后引用state内状态的组件都会响应式的更新.state不能被直接修改,必须commit内提交mutation才行,且mutation必须是同步函数.提交action可以在内部进行异步操作,可同时提交多个mutation.

store内的state可以通过this.$store.state.xxx访问.

store内的getter可以通过this.$store.getters.xxx访问. (可以理解为store的计算属性)

store内的mutation可以通过this.$store.commit('xxx')提交. (mutation只用于修改state中定义的状态变量)

store内的action可以通过this.$store.dispatch('yyy')提交. (可以理解为store的methods)

vuex使用场景:

数据需要在多个组件里面来回调用.

全局都要使用的方法,并且方法需要保存不被浏览器清理掉.

组件需要保存的数据.

19.vue的双向数据绑定原理?

20.v-show与v-if的区别?

v-show是通过css的方式隐藏元素,而v-if是根据条件是否成立决定是否要创建元素.如果某个元素需要频繁切换显示状态的话,建议是使用v-show,因为频繁创建销毁DOm需要性能开销.

21.小程序有写过吗?

没有

22.vue在首次加载时执行的钩子函数?向后端发送请求时,在哪个钩子发送?

首次加载触发beforeCreate, created, beforeMount, mounted.

一般都是在created里发送请求,其实无论created、mounted,都可以发送请求。发送请求是异步操作,只有当同步任务结束的时候,才会执行异步操作,所以无论created mounted都是一样的。如果需要dom的话就要在mounted里发起请求.

23.keep-alive组件的作用?

主要用于保留组件状态或避免重新渲染。比如A页面现在滚动的位置是1/2,然后切换到B页面,再切换回来的时候页面的滚动位置还会保留。

相关推荐
damo王2 小时前
how to install npm in ubuntu24.04?
前端·npm·node.js
光影少年2 小时前
Vue 2 / Vue 3 diff算法
前端·javascript·vue.js
zhixingheyi_tian2 小时前
Yarn 之 run job
java·开发语言·前端
指尖跳动的光2 小时前
如何减少项目里面if-else
前端·javascript
yanghuashuiyue2 小时前
Vue3难以统一的命名规范
前端·vue.js·typescript
mini_0553 小时前
elementPlus版本升级,el-select默认值显示问题
前端·javascript·vue.js
C_心欲无痕3 小时前
vue3 - watchPostEffect在DOM 更新后的副作用处理
前端·vue.js
教练、我想打篮球3 小时前
123 safari 浏览器中下载 URLEncoder.encode 的中文名称的文件, safari 未进行解码, 其他浏览器正常
前端·http·safari
foo1st3 小时前
HTML中常用HASH算法使用笔记
javascript·html·哈希算法