前端面试题-

发布时间 2023-04-13 08:52:56作者: is橙子

1、说一说cookie sessionStorage localStorage 是什么,有什么区别?

Cookie、sessionStorage 和 localStorage 都是在浏览器端存储数据的方式,它们的主要区别在于存储的数据范围、有效期和访问权限等方面。

  1. Cookie

Cookie 是一种在浏览器和 Web 服务器之间传递的小数据片段,它通常用于存储用户的身份验证令牌、用户偏好设置、购物车信息等。Cookie 的最大缺点是它们的大小受限,一般只能存储少量数据(通常不超过 4KB),并且每次请求都会将 Cookie 发送到服务器,因此可能会影响性能。

Cookie 的优点是它们可以设置过期时间,从而控制数据的有效期,并且可以在浏览器和服务器之间共享。Cookie 还可以设置跨域属性,允许在多个域名之间共享数据。

  1. sessionStorage

sessionStorage 是 HTML5 提供的一种会话存储机制,它可以在浏览器关闭后仍然保留数据。sessionStorage 中存储的数据只在同一浏览器窗口或标签页中有效,如果用户打开多个窗口或标签页,那么每个窗口或标签页都有自己的 sessionStorage。

sessionStorage 可以存储较大量的数据(通常在 5MB 左右),并且数据只在同一会话期间有效。sessionStorage 的主要用途是存储临时数据,例如表单数据、用户操作记录等。

  1. localStorage

localStorage 也是 HTML5 提供的一种本地存储机制,它与 sessionStorage 的区别在于数据的有效期,localStorage 中存储的数据可以跨越多个浏览器窗口或标签页,并且在浏览器关闭后仍然保留。

localStorage 与 sessionStorage 一样,可以存储较大量的数据,通常在 5MB 左右。localStorage 的主要用途是存储用户偏好设置、主题样式等持久性数据。

总的来说,Cookie、sessionStorage 和 localStorage 都是在浏览器端存储数据的方式,它们的主要区别在于存储的数据范围、有效期和访问权限等方面。需要根据实际需求选择合适的存储方式。

2、说一说Vue2.0双向绑定的原理与缺陷?

1、Vue 2.0 的双向绑定原理是通过使用数据劫持和发布-订阅模式来实现的。

具体来说,当 Vue 将数据对象传递给组件实例化时,Vue 会遍历对象的每个属性,并使用 Object.defineProperty() 方法将其转换为 getter 和 setter。这样,当属性被读取或修改时,Vue 可以拦截并触发相应的更新。

在模板中,Vue 通过使用 v-model 指令来实现双向绑定。当用户在表单控件中输入数据时,Vue 会自动更新组件数据对象中对应的属性值。反之亦然,当组件数据对象中的属性值被修改时,Vue 会自动更新对应的表单控件。

尽管 Vue 2.0 的双向绑定机制在使用上非常方便,但它也存在一些缺陷。其中最大的问题是性能问题。由于 Vue 2.0 使用了数据劫持机制,对于大型数据集合或频繁的数据更新操作,这种机制可能会带来显著的性能损失。此外,Vue 2.0 的双向绑定机制也增加了代码的复杂性,使得调试和维护变得更加困难。

2、Vue2.0 的双向绑定是通过数据劫持和发布订阅模式实现的,具体的实现原理如下:

  1. 在 Vue 初始化时,会对数据对象进行递归遍历,把每一个属性转换成 getter/setter,并且在数据对象上定义一个观察者 Watcher 对象;
  2. 当数据发生变化时,setter 会被触发,setter 会通知所有观察者 Watcher 对象,观察者 Watcher 对象就会依次执行 update 方法,更新视图;
  3. 在模板编译时,如果遇到 v-model 指令,会在相应的元素上添加一个事件监听器,当输入框的值发生变化时,会触发这个事件监听器,通过调用 setter 方法更新数据。

Vue2.0 双向绑定的缺陷主要有以下几点:

  1. 性能问题:每个属性都要添加 getter 和 setter,会导致一定的性能损失,尤其是在处理大量数据时;
  2. 内存泄漏:由于观察者 Watcher 对象和数据对象之间的强引用,如果不及时销毁观察者 Watcher 对象,就会导致内存泄漏;
  3. 无法监听数组和对象的变化:由于 Vue2.0 只能通过数据劫持监听属性的变化,无法监听数组和对象的变化,需要通过额外的方法进行处理;
  4. 深层嵌套数据监听问题:由于 Vue2.0 只能监听到对象属性的变化,无法监听到深层嵌套数据的变化,需要通过递归或者使用第三方库进行处理。

3、v-if和v-show的区别

v-if和v-show是Vue.js中两个常用的指令,它们都可以用来控制DOM元素的显示和隐藏,但是它们的实现方式有所不同,具体如下:

  1. v-if指令是对DOM元素进行条件渲染,只有在指定条件为真时才会渲染DOM元素,并在条件为假时销毁DOM元素。这意味着如果条件为假,DOM元素不会被渲染到页面上,也不会占据任何页面资源。因此,v-if适用于不经常改变的条件性显示内容。

  2. v-show指令是基于CSS的display属性来控制DOM元素的显示和隐藏。当条件为真时,该元素会被显示出来,当条件为假时,该元素会被隐藏。这意味着如果条件为假,DOM元素仍然存在于页面上,只是被设置为不可见状态。因此,v-show适用于频繁切换的显示内容。

总的来说,如果需要频繁切换元素的显示和隐藏状态,应该使用v-show指令,因为它只是简单地切换CSS的display属性,可以避免频繁的DOM操作。而如果元素的显示和隐藏状态不太经常改变,或者需要在条件为假时完全清除DOM元素,应该使用v-if指令。

4、说一说提高前端性能优化手段

 

  1. 减少HTTP请求:减少页面中的HTTP请求可以大大提高页面的加载速度。可以通过合并CSS和JavaScript文件、使用CSS Sprites和图像压缩等技术来减少HTTP请求。

  2. 压缩文件:压缩CSS、JavaScript和HTML文件可以减少文件大小,提高页面加载速度。可以使用Gzip或Deflate等压缩算法来压缩文件。

  3. 使用缓存:使用浏览器缓存可以减少页面的加载时间。可以使用HTTP缓存策略来控制缓存,例如设置Expires头、Cache-Control头等。

  4. 延迟加载:将非关键资源(如图片、广告等)的加载延迟到页面其它内容加载完成后再进行,可以提高页面的加载速度。可以使用LazyLoad等插件来实现延迟加载。

  5. 最小化DOM操作:DOM操作是非常耗费性能的操作,应该尽量减少DOM操作的次数和复杂度。可以使用文档片段(DocumentFragment)来减少DOM操作次数,使用事件委托(Event Delegation)来减少DOM操作复杂度。

  6. 使用CDN:使用CDN可以加快资源的加载速度,提高页面的响应速度。可以使用公共CDN,如Google、百度、360等,也可以使用自己的CDN。

  7. 优化图片:图片是页面中占用带宽最大的资源,应该尽量减小图片的大小。可以使用图像压缩和格式转换等技术来优化图片。

  8. 使用异步加载:使用异步加载可以将页面的加载和执行分离,提高页面的响应速度。可以使用异步加载的JavaScript库、defer属性和async属性等技术来实现异步加载。

  9. 代码优化:优化JavaScript和CSS代码可以减少文件大小,提高页面加载速度。可以使用压缩工具、代码检查工具、代码精简工具等来优化代码。

综上所述,前端性能优化是一个综合性的问题需要从多个方面进行优化。通过上述手段的应用,可以显著提高页面的加载速度和响应速度,从而提升用户的体验。

5、mvvm是什么

MVVM是一种前端架构模式,它是Model-View-ViewModel的缩写。MVVM模式将前端应用程序分为三个部分:模型(Model)、视图(View)和视图模型(ViewModel),并通过数据绑定技术将这三个部分连接在一起。

在MVVM模式中,模型表示应用程序的数据和业务逻辑,视图表示应用程序的用户界面,而视图模型则是连接模型和视图的桥梁,它负责处理视图的事件和数据,将模型数据绑定到视图上,并将用户输入反映到模型中。视图模型通常是由JavaScript编写的,它使用观察者模式来监听模型数据的变化,并通过数据绑定技术将变化传递到视图上,从而实现视图和模型之间的解耦。

MVVM模式的一个重要特点是数据双向绑定,即当模型中的数据发生变化时,会自动更新视图中的数据,而当用户在视图中输入数据时,会自动更新模型中的数据,从而实现了数据的同步更新,减少了手动操作的复杂性。

常见的MVVM框架包括AngularJS、Vue.js、KnockoutJS等。这些框架提供了丰富的工具和API,帮助开发者更轻松地实现MVVM模式,提高前端应用程序的开发效率和质量。

6、axios面试题

  1. 什么是Axios?
    Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js平台。它可以发送异步请求并处理响应数据,支持拦截器、取消请求、自动转换JSON数据等功能。

  2. Axios和其他HTTP客户端库的区别是什么?
    Axios相比其他HTTP客户端库,具有更简单、易用的API和更好的性能。它还可以在浏览器和Node.js平台上运行,支持拦截器、自动转换JSON数据等功能。

  3. 如何在Axios中设置请求头和响应头?
    可以使用config.headers属性来设置请求头,例如:

axios.get(url, {
  headers: {
    'Authorization': 'Bearer ' + token
  }
})

可以使用response.headers属性来获取响应头,例如:

axios.get(url)
  .then(response => {
    console.log(response.headers);
  });
  1. 如何实现Axios的请求超时?
    可以使用config.timeout属性来设置请求超时,例如:
axios.get(url, {
  timeout: 5000 // 5秒超时
})
  1. 如何在Axios中实现请求拦截器和响应拦截器?
    可以使用axios.interceptors.request.use()方法来实现请求拦截器,例如:
axios.interceptors.request.use(config => {
  // 在请求发送之前做些什么
  return config;
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error);
});

可以使用axios.interceptors.response.use()方法来实现响应拦截器,例如:

axios.interceptors.response.use(response => {
  // 对响应数据做些什么
  return response;
}, error => {
  // 对响应错误做些什么
  return Promise.reject(error);
});

7、

8、

9、

10、