面了挺多公司,可是没几个大厂,不敢投,下面按照本身的经历分为国企和非国企和共性问题的面经javascript
譬如招银网络、顺丰科技、4399等中小厂css
具体答案自行查找,我感受每次回答都答不到面试官想要我答的点html
回流: 当渲染的一部分元素更改本身的宽高等,致使从新构建布局,就产生了回流。
重绘: 当一个元素自身的高度没改变,只改变了背景颜色的,发生重绘。
回流一定重绘,当重绘不必定回流。前端
概念:vue
红宝书:有权访问另外一个函数做用域中的变量的函数html5
优势:java
缺点:因为它是驻留在内存中,会增大内存使用量,使用不当很容易形成内存泄露。node
其实你能够从用户输入url经历的过程进行分析。mysql
浏览器缓存:
首先会检查浏览器缓存,那就可使用它。添加http缓存头Expires,使组件被缓存,下次访问的时候,就能够减小没必要要的HTPP请求,从而提升加载速度。es6
DNS解析:
DNS解析,能够设置meta标签的http-equiv要求DNS预解析,好比遇到超连接就提早解析。
HTTP链接上:
常见的减小http请求如静态资源合并,js和css合并,雪碧图就不讲了。
服务器在完成 HTTP 请求以后不断开 TCP 链接而是挂起,后续有 HTTP 请求能够直接在这个 TCP 链接上发送;缺点是保持长链接会消耗服务端的资源。
HTTP/2 多路复用的特性容许多个 HTTP 请求在同一个 TCP 链接上发送,能够节省屡次创建 TCP 链接的时间。
可能会给中间人攻击,解决方法能够用第三方安全证书来认证。
hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具备指定名称的属性。若是有,返回true,不然返回false。
(属性名称 in 对象) 无论属性是原型的仍是实例的,只要存在就返回ture不然返回false
那么咱们能够利用这两个方法作一个对比,若是实例中没有且存在了这个属性,那么就是原型的
详细能够看https://juejin.im/post/58f94c9bb123db411953691b
下面简略说明:
当访问一个对象的某个属性时,会先在这个对象自己属性上查找,若是没有找到,则会去它的__proto__隐式原型上查找,若是尚未找到就会再的__proto__中查找,这样一层一层向上查找最后到object就会造成一个链式结构,咱们称为原型链。
这样链式的链接集合就构成了原型链。
在object()函数内部, 先建立一个临时性的构造函数, 而后将传入的对象做为这个构造函数的原型,最后返回了这个临时类型的一个新实例.
function object(o){
function F(){}
F.prototype = o;
return new F();
}
复制代码
缺点:不是类式继承,而是原型式基础,缺乏了类的概念
将父类实例做为子类的原型对象
function Parent () {
this.names = ['kevin', 'daisy'];
}
function Child () {
}
Child.prototype = new Parent();
var child1 = new Child();
child1.names.push('yayu');
console.log(child1.names); // ["kevin", "daisy", "yayu"]
var child2 = new Child();
console.log(child2.names); // ["kevin", "daisy", "yayu"]
复制代码
缺点:全部子类的实例的原型都共享同一个父类实例的属性和方法。
在函数中运行父级构造函数
// 子类
function Sub(){
Super.call(this)
this.property = 'Sub Property'
}
复制代码
缺点:
父类函数没有共享,浪费内存。
没法继承原型链上的属性和方法。
原型继承和构造函数继承的组合
// 子类
function Sub(){
Super.call(this)
this.property = 'Sub Property'
}
Sub.prototype = new Super()
// 注意这里new Super()生成的超类对象并无constructor属性,故需添加上
Sub.prototype.constructor = Sub
复制代码
缺点:父级构造函数被调用两次,子类实例也有两份,浪费内存。
实际上子类上会拥有超类的两份属性,只是子类的属性覆盖了原型对象上的属性。
原型式继承套个壳子,增长你要传入的参数。
function objectCreate(obj){
function F(){}
F.prototype = obj
return new F()
}
function createSubObj(superInstance){
var clone = objectCreate(superInstance)
clone.property = 'Sub Property'
return clone
}
复制代码
缺点:依旧没有类的概念
在子构造函数中执行父级函数,并建立Object.create(父级的原型对象)复值给obj,再修改obj的constructor的指针指向子构造函数,最后obj做为子构造函数的原型对象。
function Sub(){
Super.call(this);
}
var proto = Object.create(Super.prototype);
proto.constructor = Sub;
Sub.prototype = proto ;
复制代码
同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议。
1xx:指示信息–表示请求已接收.
2xx:成功-请求已接受并返回响应头
200:请求已成功,返回响应头。
3xx:重定向–要完成请求必须进行更进一步的操做。
301:请求的资源已被永久移到新位置。
302:临时重定向
304:缓存的内容并未改变。
4xx:客户端错误–请求有语法错误或请求没法实现。
400:请求无效,前端提交数据的字段名称或者是字段类型和后台的实体类不一致。
401:请求要身份验证。
403:资源不可用。
404:找不到页面。
5xx:服务器端错误–服务器未能实现合法的请求。
500:服务器遇到未知情况,没法处理。
503:服务器过载或维护。
元素的内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个部分
块格式化上下文(block formatting context) 是Web页面的可视化CSS渲染出的一部分。
BFC是页面CSS 视觉渲染的一部分,用于决定块盒子的布局及浮动相互影响范围的一个区域。
BFC的一个最重要的效果是,让处于BFC内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。
利用BFC能够闭合浮动,防止与浮动元素重叠。
若是子div中有margin-top会外层div塌陷。 解决设置:父设置,overflow:hidden便可。
1:
var copy = JSON.parse(JSON.stringify(person))
复制代码
缺点:1.没法拷贝对象中的function、undefined、null、RegExp属性
2:
function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key]!==null) {
result[key] = deepCopy(obj[key]); //递归复制
} else {
result[key] = obj[key];
}
}
}
return result;
}
复制代码
缺点就是复杂点
柯里化是把一个多参数函数转换为一个嵌套的一元函数的过程
const addCurried = function(x){
return function(y){
return x + y;
}
}
// 使用方法
addCurried(4)(4)
// 8
复制代码
可以进行延迟计算,就像add(1)(2)同样,1比2先传入,2就会被延迟计算,在特定的场景里,有必定的应用意义。
用在连续点击div时,
是为了限制函数一段时间内只能执行一次,在延时的时间内,方法若被触发,则直接退出方法。
let throttle = (func, wait) => {
let timer;
return function() {
if(timer) {
return ;
}
var self = this;
var args = arguments;
timer = setTimeout(function() {
func.apply(self, args);
timer = null;
}, wait)
}
}
复制代码
用在搜索输入时,
函数防抖在执行目标方法时,会等待一段时间。当又执行相同方法时,若前一个定时任务未执行完,则 clear 掉定时任务,从新定时。
let debounce = function(func,wait) {
let timer;
return function(){
let args = arguments;
var self = this;
clearTimeout(timer);
timer = setTimeout(function(){
func.apply(self,args);
}, wait);
}
}
复制代码
考察控制字段,这个不熟,每次答感受都答不到面试官的点上,自行查找合适的解释。
做用域链就是一个有序的栈,保证对执行环境有权访问的全部变量和函数的有序访问。
其余具体自行查找,我也不能说具体。
不一样于做用域链。
其余具体自行查找,我也不能说具体。
DOM2事件模型
dom.addEventListener(‘click’,function(){},true) 第一个参数侦听的事件,第二个参数为触发事件执行的方法,第三个true捕获阶段执行,false冒泡阶段执行
IE事件流:叫作事件冒泡。从点击的元素向上传播。用ele.attachEvent(‘onclick’, function(){ }); 只支持冒泡阶段
var obj = new Base();
// 等价于
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
//随后经过Base.prototype.xxx = () => {}为Base添加方法时,obj也同时拥有此方法
复制代码
let:
const:
不写了,太多
.triangle_border_up{
width:0;
height:0;
border-width: 30px; /*上右下左 上为0为上三角形*/
border-style:solid;
border-color:transparent transparent transparent #333;/*透明 透明 透明 灰*/
}
复制代码
实现三栏水平布局,其中left、right分别位于左右两侧,left宽度为200px,right宽度为300px,main处在中间,宽度自适应。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>实现三栏水平布局之圣杯布局</title>
<style type="text/css"> .container { padding: 0 300px 0 200px; } .left, .main, .right { position: relative; min-height: 130px; float: left; } .left { left: -200px; margin-left: -100%; background: green; width: 200px; } .right { right: -300px; margin-left: -300px; background-color: red; width: 300px; } .main { background-color: blue; width: 100%; } </style>
</head>
<body>
<div class="container">
  <div class="main">main</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>
复制代码
圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏所有float浮动,但左右两栏加上负margin让其跟中间栏div并排,以造成三栏布局。
双飞翼布局比圣杯布局多使用了1个div,少用大体4个css属性(圣杯布局container的 padding-left和padding-right这2个属性,加上左右两个div用相对布局position: relative及对应的right和left共4个属性,;而双飞翼布局子div里用margin-left和margin-right共2个属性,比圣杯布局思路更直接和简洁一点。简单提及来就是:双飞翼布局比圣杯布局多建立了一个div,但不用相对布局了。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>实现三栏水平布局之双飞翼布局</title>
<style type="text/css"> .left, .main, .right { float: left; min-height: 130px; text-align: center; } .left { margin-left: -100%; background: green; width: 200px; } .right { margin-left: -300px; background-color: red; width: 300px; } .main { background-color: blue; width: 100%; } .content{ margin: 0 300px 0 200px; } </style>
</head>
<body>
<div class="container">
  <div class="main">
  <div class="content">main</div>
</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>
复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>实现三栏水平布局之Flex布局</title>
<style type="text/css"> .container{ display: flex; min-height: 130px; } .main{ flex-grow: 1; background-color: blue; } .left{ order: -1; flex-basis: 200px; background-color: green; } .right{ flex-basis: 300px; background-color: red; } </style>
</head>
<body>
<div class="container">
  <div class="main">main</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>
复制代码
绝对定位使元素的位置与文档流无关,所以不占据空间。这一点与相对定位不一样,相对定位实际上被看做普通流定位模型的一部分,由于元素的位置相对于它在普通流中的位置。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>实现三栏水平布局之绝对定位布局</title>
<style type="text/css"> .container{ position: relative; } .main,.right,.left{ top: 0; height: 130px; } .main{ margin: 0 300px 0 200px; background-color: blue; } .right{ position: absolute; width: 300px; right: 0; background-color: red; } .left{ position: absolute; width: 200px; background-color: green; left: 0; } </style>
</head>
<body>
<div class="container">
  <div class="main">main</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>
复制代码
水平居中:
text-align: center;
复制代码
margin: 0 auto;
复制代码
垂直居中:
line-height: height; //height父级高度
复制代码
position: absolute;
top: 50%;
transform: translate(0, -50%);
复制代码
display: flex;
flex-direction: column;
justify-content: center;
复制代码
方法不少:绝对定位、margin: auto、弹性布局、相对定位、table布局。
具体自行查找
雪碧图又叫精灵图原理就是将一些小图标合并到一张图上,用css的背景定位来设置要显示的部分。
建议先阅读网上的源码解析
先转化成AST树,再获得的render函数返回VNode(Vue的虚拟DOM节点)
采用数据劫持结合发布者-订阅者模式的方式,经过Object.defineProperty()来劫持各个属性的setter,getter,在数据变更时发布消息给订阅者,触发相应的监听回调。
vue实现数据双向绑定主要步骤:
*更加详细请看源码和解析
Vue的路由实现:hash模式 和 history模式
*详细自行查找
改变状态的方式,同步逻辑封装在mutation中,异步逻辑封装在action中。 详细自行查找
注意:命名时若是是indexPage,使用的时候用index-page
看源码解析
一、第一步:解析模板成render函数
template 二、第二步:响应式开始监听
object.defineProperty
data属性代理到vm上
三、第三步:首次渲染,显示页面,且绑定依赖
(1)为什么要监听get,直接监听set不行吗?
①data中有不少属性,有些被用到,有些可能不被用到(data中没有人访问,就不会用get,如没有{{aaa}}指的就是aaa没有被访问)
②被用到的会走到get,不被用到的不会走到get
③未走到get中的属性,set的时候也无需关心
④避免没必要要的重复渲染
四、第四步:data属性变化,触发rerender defineProperty, get, set
(1)修改属性,被响应式的set监听到
(2)set中执行updateComponent
(3)updateComponent从新执行vm._render()
(4)生成的vnode和prevVnode,经过Patch进行对比
渲染到html
通常问项目还有计算机基础 具体看共性问题
排序、树、图……
mysql、mongodb、存储过程……
……
这些建议查找网上面经,会比个人要详细不少,要是打算进国企,则必定要有好聊的实习和项目,还有必定的基础,基本上剩下的就看学历了。
先写到这,有缘往后再补充。