JS面试题
function sayHi() {
console.log(name)
console.log(age)
var name = 'Lydia'
let age = 21
}
sayHi()
const shape = {
radius: 10,
diameter() {
return this.radius * 2
},
perimeter: () => 2 * Math.PI * this.radius
}
shape.diameter()
shape.perimeter()
function Foo(){
var i = 0;
return function(){
console.log(i++);
}
}
var f1 = Foo(),
f2 = Foo();
f1();
f1();
f2();
var res = /-([a-z])/g
var ss = "ss-qsd-i"
ss = ss.replace(res,(p,v)=>{
console.log(p)
console.log(v)
return v.toUpperCase()
})
const promise = new Promise((resolve, reject) => {
console.log(1)
resolve()
console.log(2)
})
promise.then(() => {
console.log(3)
})
console.log(4)
1. get请求的参数是明文的(http://localhost:8080?id=1)post请求的参数放在request body里边 所以相对来说,post比get要更安全
2. get请求的url的长度由于浏览器和web服务器的限制,所以长度会有限制,但是post的参数没有限制
3. get请求会被浏览器记录(比如我常删除历史记录)但是post请求不会。
4. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
5. GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
6.GET有缓存,POST没有
Vue面试题
模块:由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。
当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。
每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。
命名空间:默认情况下,模块内部的 action、mutation 和 getter 是注册
在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应
。如果希望你的模块具有更高的封装度和复用性,你可以通过添加
namespaced: true
的方式使其成为带命名空间的模块。当模块被注册后,
它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。
对象层级不要过深,否则性能就会差
不需要响应式的数据不要放到 data 中(可以用 Object.freeze() 冻结数据)
v-if 和 v-show 区分使用场景
computed 和 watch 区分使用场景
v-for 遍历必须加 key,key 最好是 id 值,且避免同时使用 v-if
大数据列表和表格性能优化-虚拟列表/虚拟表格
防止内部泄漏,组件销毁后把全局变量和事件销毁
图片懒加载
路由懒加载
第三方插件的按需引入
适当采用 keep-alive 缓存组件
防抖、节流运用
服务端渲染 SSR or 预渲染