1、说一说cookie sessionStorage localStorage 是什么,有什么区别?
Cookie、sessionStorage 和 localStorage 都是在浏览器端存储数据的方式,它们的主要区别在于存储的数据范围、有效期和访问权限等方面。
-
Cookie
Cookie 是一种在浏览器和 Web 服务器之间传递的小数据片段,它通常用于存储用户的身份验证令牌、用户偏好设置、购物车信息等。Cookie 的最大缺点是它们的大小受限,一般只能存储少量数据(通常不超过 4KB),并且每次请求都会将 Cookie 发送到服务器,因此可能会影响性能。
Cookie 的优点是它们可以设置过期时间,从而控制数据的有效期,并且可以在浏览器和服务器之间共享。Cookie 还可以设置跨域属性,允许在多个域名之间共享数据。
-
sessionStorage
sessionStorage 是 HTML5 提供的一种会话存储机制,它可以在浏览器关闭后仍然保留数据。sessionStorage 中存储的数据只在同一浏览器窗口或标签页中有效,如果用户打开多个窗口或标签页,那么每个窗口或标签页都有自己的 sessionStorage。
sessionStorage 可以存储较大量的数据(通常在 5MB 左右),并且数据只在同一会话期间有效。sessionStorage 的主要用途是存储临时数据,例如表单数据、用户操作记录等。
-
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 的双向绑定是通过数据劫持和发布订阅模式实现的,具体的实现原理如下:
- 在 Vue 初始化时,会对数据对象进行递归遍历,把每一个属性转换成 getter/setter,并且在数据对象上定义一个观察者 Watcher 对象;
- 当数据发生变化时,setter 会被触发,setter 会通知所有观察者 Watcher 对象,观察者 Watcher 对象就会依次执行 update 方法,更新视图;
- 在模板编译时,如果遇到 v-model 指令,会在相应的元素上添加一个事件监听器,当输入框的值发生变化时,会触发这个事件监听器,通过调用 setter 方法更新数据。
Vue2.0 双向绑定的缺陷主要有以下几点:
- 性能问题:每个属性都要添加 getter 和 setter,会导致一定的性能损失,尤其是在处理大量数据时;
- 内存泄漏:由于观察者 Watcher 对象和数据对象之间的强引用,如果不及时销毁观察者 Watcher 对象,就会导致内存泄漏;
- 无法监听数组和对象的变化:由于 Vue2.0 只能通过数据劫持监听属性的变化,无法监听数组和对象的变化,需要通过额外的方法进行处理;
- 深层嵌套数据监听问题:由于 Vue2.0 只能监听到对象属性的变化,无法监听到深层嵌套数据的变化,需要通过递归或者使用第三方库进行处理。
3、v-if和v-show的区别
v-if和v-show是Vue.js中两个常用的指令,它们都可以用来控制DOM元素的显示和隐藏,但是它们的实现方式有所不同,具体如下:
-
v-if指令是对DOM元素进行条件渲染,只有在指定条件为真时才会渲染DOM元素,并在条件为假时销毁DOM元素。这意味着如果条件为假,DOM元素不会被渲染到页面上,也不会占据任何页面资源。因此,v-if适用于不经常改变的条件性显示内容。
-
v-show指令是基于CSS的display属性来控制DOM元素的显示和隐藏。当条件为真时,该元素会被显示出来,当条件为假时,该元素会被隐藏。这意味着如果条件为假,DOM元素仍然存在于页面上,只是被设置为不可见状态。因此,v-show适用于频繁切换的显示内容。
总的来说,如果需要频繁切换元素的显示和隐藏状态,应该使用v-show指令,因为它只是简单地切换CSS的display属性,可以避免频繁的DOM操作。而如果元素的显示和隐藏状态不太经常改变,或者需要在条件为假时完全清除DOM元素,应该使用v-if指令。
4、说一说提高前端性能优化手段
-
减少HTTP请求:减少页面中的HTTP请求可以大大提高页面的加载速度。可以通过合并CSS和JavaScript文件、使用CSS Sprites和图像压缩等技术来减少HTTP请求。
-
压缩文件:压缩CSS、JavaScript和HTML文件可以减少文件大小,提高页面加载速度。可以使用Gzip或Deflate等压缩算法来压缩文件。
-
使用缓存:使用浏览器缓存可以减少页面的加载时间。可以使用HTTP缓存策略来控制缓存,例如设置Expires头、Cache-Control头等。
-
延迟加载:将非关键资源(如图片、广告等)的加载延迟到页面其它内容加载完成后再进行,可以提高页面的加载速度。可以使用LazyLoad等插件来实现延迟加载。
-
最小化DOM操作:DOM操作是非常耗费性能的操作,应该尽量减少DOM操作的次数和复杂度。可以使用文档片段(DocumentFragment)来减少DOM操作次数,使用事件委托(Event Delegation)来减少DOM操作复杂度。
-
使用CDN:使用CDN可以加快资源的加载速度,提高页面的响应速度。可以使用公共CDN,如Google、百度、360等,也可以使用自己的CDN。
-
优化图片:图片是页面中占用带宽最大的资源,应该尽量减小图片的大小。可以使用图像压缩和格式转换等技术来优化图片。
-
使用异步加载:使用异步加载可以将页面的加载和执行分离,提高页面的响应速度。可以使用异步加载的JavaScript库、defer属性和async属性等技术来实现异步加载。
-
代码优化:优化JavaScript和CSS代码可以减少文件大小,提高页面加载速度。可以使用压缩工具、代码检查工具、代码精简工具等来优化代码。
综上所述,前端性能优化是一个综合性的问题,需要从多个方面进行优化。通过上述手段的应用,可以显著提高页面的加载速度和响应速度,从而提升用户的体验。
5、mvvm是什么
MVVM是一种前端架构模式,它是Model-View-ViewModel的缩写。MVVM模式将前端应用程序分为三个部分:模型(Model)、视图(View)和视图模型(ViewModel),并通过数据绑定技术将这三个部分连接在一起。
在MVVM模式中,模型表示应用程序的数据和业务逻辑,视图表示应用程序的用户界面,而视图模型则是连接模型和视图的桥梁,它负责处理视图的事件和数据,将模型数据绑定到视图上,并将用户输入反映到模型中。视图模型通常是由JavaScript编写的,它使用观察者模式来监听模型数据的变化,并通过数据绑定技术将变化传递到视图上,从而实现视图和模型之间的解耦。
MVVM模式的一个重要特点是数据双向绑定,即当模型中的数据发生变化时,会自动更新视图中的数据,而当用户在视图中输入数据时,会自动更新模型中的数据,从而实现了数据的同步更新,减少了手动操作的复杂性。
常见的MVVM框架包括AngularJS、Vue.js、KnockoutJS等。这些框架提供了丰富的工具和API,帮助开发者更轻松地实现MVVM模式,提高前端应用程序的开发效率和质量。
6、axios面试题
-
什么是Axios?
Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js平台。它可以发送异步请求并处理响应数据,支持拦截器、取消请求、自动转换JSON数据等功能。 -
Axios和其他HTTP客户端库的区别是什么?
Axios相比其他HTTP客户端库,具有更简单、易用的API和更好的性能。它还可以在浏览器和Node.js平台上运行,支持拦截器、自动转换JSON数据等功能。 -
如何在Axios中设置请求头和响应头?
可以使用config.headers属性来设置请求头,例如:
axios.get(url, {
headers: {
'Authorization': 'Bearer ' + token
}
})
可以使用response.headers属性来获取响应头,例如:
axios.get(url)
.then(response => {
console.log(response.headers);
});
- 如何实现Axios的请求超时?
可以使用config.timeout属性来设置请求超时,例如:
axios.get(url, {
timeout: 5000 // 5秒超时
})
- 如何在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);
});