强缓存:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />(适合http2)
<meta http-equiv="Expires" content="0" />(适合http1)
协商缓存:每次请求都会与服务器交互,第一次是拿数据和标识的过程,第二次浏览器就会询问服务器资源是否有更新的过程,如果返回的是304就是取的缓存
2.http1和http2的区别
http2:采用二进制格式而非文本格式,比http1更加的安全。http2压缩了报头,减少来回的延迟,
3.new的原理
1.创建一个新的对象,
2.通过原型链继承构造函数的原型
方法一:通过闭包完成
function add(x) {
var sum = x;
var tmp = function (y) {
if(y==undefined){
return tmp;
}else{
sum = sum + y;
return tmp;
}
};
tmp.toString = function () {
return sum;
};
return tmp;
}
console.log(add(1)(2)(3)); //6
console.log(add(1)(2)(3)(4)); //10
方法二:在函数中添加判断,当没有输入参数时,直接返回调用的结果而不是返回函数
arguments:是一个对应于传递给函数的参数的类数组对象,
function add(num){
var sum=0;
sum= sum+num;
return function tempFun(numB){
if(arguments.length===0){
return sum;
}else{
sum= sum+ numB;
return tempFun;
}
}
}
console.log(add(1)(2)(3)); //6
4订阅模式和发布模式
发布模式(observer)要求希望接收到主题统治者的观察者必须订阅内容改变的事件
订阅模式使用了一个时间通道,这个通道节约订阅者和发布者之间,避免订阅者和发布者禅城依赖
数据劫持:object.definepropty();vue的双向绑定就是通过数据劫持+订阅发布模式实现的
addEventListener:添加监听事件
监听同一个按钮:他的顺序是按照排版实现的
深拷贝和浅拷贝的区别和用法
基本的数据类型:number,string,boolean,null,undefined
引用数据类型:object
深拷贝:拷贝对象各个层级的属性(json转换,es6的进程extends,递归复制,);
.extend( [deep ], target, object1 [, objectN ] ):deep=true 为深拷贝,false为浅拷贝
浅拷贝:只拷贝对象的第一层属性(object.assion(),es6的扩展语法(param,...))
jsonp的原理:动态生成js脚本,只支持get请求,支持跨域
(5).add(2).subtract(6)===1; 等于5+2-6=1; subtract,minus:相减 ,add相加;必须是number类型
pc端关闭页面后还是保存用户信息,他用了IndexedDB来进行保存,相当于是一个数据库,缓存后页面关闭也不会清除数据
css:面试
rem和em的区别,rem怎么计算的:
rem是基于html元素的字体大小来决定, 根元素大小*你的rem 根元素为16px, 10rem等同于10*16=160px
而em则根据使用它的元素的大小决定 父级元素字体大小*你的em 父级元素16px,10rem 等同于10*16=160px
何时使用rem和em
根据浏览器的字体大小设置缩放使用rem
媒体查询使用rem
已经确定字体大小可以使用em
不要在多列布局中使用 em 或 rem -改用 %。
es6:面试
promise优缺点:
优点:promise对象,可以将 异步操作 以 同步操作的流程 表达出来,避免层层嵌套
缺点:promise对象是一个构造函数
1.无法中途取消promise,
2.如果不设置回调函数,promise内部抛出的错误,不会反应到外部
3.处于进行中状态时。无法得知目前进展到那个阶段
vue:面试
vue的双向绑定原理:通过数据截取和订阅发布模式完成的,通过object.definepropty()里面的set和get来进行数据劫持,通过dep进行订阅,通过observer进行发布
vue3:用的是最新的Proxy来进行数据劫持,是es6语法,不支持ie
vue的按需加载:
1:动态加载路由:
{
path: '/promisedemo',
name: 'PromiseDemo',
component: resolve => require(['../components/PromiseDemo'], resolve)
}
2:es6的import :const ImportFuncDemo1 = () => import('../components/ImportFuncDemo1')
3:使用webpack的require.ensure,也可以实现按需加载:
{
path: '/promisedemo',
name: 'PromiseDemo',
component: resolve => require.ensure([], () => resolve(require('../components/PromiseDemo')), 'demo')
},vue组件的按需加载
通过require来进行加载
Vue.component('async-webpack-example', function (resolve) {
// 这个特殊的 `require` 语法将会告诉 webpack
// 自动将你的构建代码切割成多个包,这些包
// 会通过 Ajax 请求加载
require(['./my-async-component'], resolve)
})
es6的import
Vue.component(
'async-webpack-example',
// 这个 `import` 函数会返回一个 `Promise` 对象。
() => import('./my-async-component')
)
vue的深度监听:deep;浅监听就只监听值类型,深度监听需要加deep;深度监听监听的是引用类型,监听地址
混合开发的 JSBridge返回的是string和object格式,他是前端和原生之间连接的桥