前端面试基础

一、页面布局

题目1:请写出三栏布局,左右各300px, 中间自适应

1. float

特点:

  • 不会脱离文档流
  • 浮动元素与文字(inline boxes)不会重叠
  • 浮动元素会触发BFC
# html 部分
<div class="box">
  <div class="left"></div>
  <div class="right"></div>
  <div class="center"></div>
</div>
# css 部分
.left{float: left;}
.right{float: right;}
.center{
   /* 开启BFC, 不会与float元素发生重叠, 同时宽度也是自适应 */
   overflow: hidden;
}
  1. flex
# html 部分
 <div class="box">
    <div class="left">左</div>
    <div class="center">flex布局</div>
    <div class="right">右</div>
</div>
# css 部分
 .box{  display: flex; }
 .center { flex: 1; }
  1. position
# html 部分
<div class="box">
    <div class="left">左</div>
    <div class="center">absolute布局</div>
    <div class="right">右</div>
</div>
# css部分
.box{ position: relative; }
.left { position: absolute; left: 0; }
.center { position: absolute; left: 300px; right: 300px; }
.right { position: absolute; right: 0; }
  1. table-cell
# html 部分
<div class="box">
    <div class="left">左</div>
    <div class="center">absolute布局</div>
    <div class="right">右</div>
</div>
# css 部分
.box{ display: table; }
.center{ display: table-cell; width: 100%; }
.left{ width: 300px; }
.right{ width: 300px; }

5.inline-block + calc

# html 部分
<div class="box">
    <div class="left">左</div>
    <div class="center">absolute布局</div>
    <div class="right">右</div>
</div>
# css 部分
.box{ font-size: 0; }
.left, .right, .center{ display: inline-block; font-size: 16px; }
.left: { width:300px; }
.right{ width: 300px; }
.center{ width: (100% - 600px); }

题目2: 实现水平垂直居中

题目3: 实现等高布局

题目4: 实现瀑布流布局

二、css 盒模型

一个html文档(body)中的元素可以看成是一个盒子, 这个盒子包含margin border padding content 4 个部分。两种盒模型分别是:

  • 标准盒模型 box-sizing: content-box
  • IE盒模型 box-sizing: border-box
  1. js如何获取盒模型对应的宽/高?
# html
<div style="width: 100px; height: 50px;"></div>

let dom = document.querySelector('div')
# 获取内联样式的宽高
dom.style.width/height  // 100px/50px

# 获取渲染后的元素的真实样式 currentStyle只兼容ie, getComputedStyle兼容chrome和firfox
window.getComputedStyle(dom).width/height

# getBoundingClientRect 获取元素的定位信息
dom.getBoundingClientRect().width/height
  1. BFC

三、DOM事件

  1. DOM事件级别
  • DOM0 dom.onclick = function(){}
  • DOM2 document.addEventListener('click', function(){})
  • DOM3 document.addEventListener('keyup', function(){})
  1. DOM事件模型(捕获和冒泡)
  2. DOM事件流
  3. 捕获和冒泡的过程
    捕获 window -> document ->documentElement ->body -> ... 目标元素
  4. DOM事件对象
  • target 目标元素
  • currentTarget 冒泡/捕获阶段的元素
  • preventDefault 阻止默认事件
  • stopPropagation 阻止事件传播
  • stopImmediatePropagation 阻止事件传播, 并且阻止元素上的监听事件继续执行
  1. 自定义事件
var customEvent = new CustomEvent('gameStart', { detail: {name: 'lalala'}})
dom.addEventListener('gameStart', function(e){
  console.log(e.detail)  // { name: 'lalala' }
})
dom.dispatch(customEvent)

四、http协议

  1. http协议的主要特点?
    无状态、无连接、简单、灵活
  2. http报文的组成?
  • 请求报文
    • 请求行 POST /notes/71bb3cf19095/mark_viewed.json HTTP/1.1
    • 请求头
    • 空行
    • 请求体
  • 响应报文
    • 响应行 HTTP/1.1 200 OK
    • 响应头
    • 空行
    • 响应体
  1. http方法
    get/post/put/delete/option/head
  2. get和post的区别?
  • get通过url传递参数,post通过request body 传递参数
  • get请求通过url传递的参数有大小限制 ,post没有
  • get请求将参数直接暴露在url中, 不太安全
  • get请求通常用户查询资源, post 用于提交创建/修改
  • 浏览器会主动缓存get请求,post需要手动设置
  • get请求只能进行url编码, post支持多种格式的编码
  1. http状态码
    1xx: 请求已经接收,继续处理
    2xx: 请求成功
    3xx: 重定向,要完成请求必须进一步操作
    4xx: 客户端错误, 请求无法实现或语法错误
    5xx: 服务端错误,服务器未能实现合法请求
    206: 客服端发送了一个带range的get请求,服务器完成了它。
    301: 所请求的页面已转移至新的url
    302: 所请求的页面已临时转移至新的url
    304: 客户端有缓存的文档,并发出了一个条件性请求, 服务器告诉客户端原来的文档还可以继续用。
    400: 客户端有语法错误
    401: 请求未经授权
    403: 对请求的页面禁止访问
    500: 服务器错误, 原来的缓存文档还可以继续使用

  2. 持久连接和管线化
    持久连接: http/1.1 connection: keep-alive
    管线化: 浏览器可以多次发送请求到服务器, 而不需要等待上一次请求的结果,实现并行请求。
    管线化特点:

  • 通过持久化连接完成,仅http/1.1 支持
  • 只有get和head可以支持,post有所限制
  • 初次创建连接时也不应启动管线机制,因为对方(服务器)不一定支持HTTP/1.1版本的协议。
  1. 缓存
    http缓存分为强制缓存和对比缓存
    强制
  2. 跨域

五、面向对象

原型链

function Persion(name) { this.name = name }
Persion.prototype.say = function(){ console.log(this.name) }

let p = new Persion('孔明')
p.__proto__ === Persion.prototype // 都指向Persion的原型对象
p instanceof Persion // true

  1. instanceof 、constructor、typeof 的原理是什么?
    实例的原型(proto或者proto.proto)是否存在构造函数的原型

  2. 创建对象的几种方式?

# 方法一 对象字面量,
var obj = {}

# 方法二 new
function Persion(){}
var obj = new Persion()
var obj1 = new Object()

# 方法三 Object.create
function Persion(){}
var obj = Object.create(Persion)
  1. new 运算符
    3.1 一个新对象被创建,继承自原型(构造函数的prototype)
    3.2 构造函数被执行,参数传入,同时this指向创建的实例。
    3.3 如果构造函数返回了一个对象,那么这个对象就会替换new出来的结果。

  2. js的继承有几种方式?
    4.1 借助构造函数实现继承
    4.2 组合继承

function Person(){
  this.name = 'name'
}
Person.prototype = {
  constructor: Person,
  getName(){
    return this.name
  }
}

六、通信

  1. 跨域产生的原因
    浏览器同源策略:协议+域名+端口
  2. 跨域的影响
    跨域时默认不允许访问cookie、localStorage、indexDB
    DOM和JS对象无法获取
    AJAX请求不能发送
  3. 跨域解决方案
    3.1 jsonp
    通过动态创建script标签指定回调函数来实现跨域,只支持get请求跨域。
    3.2 cors 跨域资源共享
    通过配置nginx
# 设置允许跨的域名
add_header Access-Control-Allow-Origin <要跨的域名>;
# 设置是否跨域时, 是否允许携带cookie
add_header Access-Control-Allow-Credentials true;
# 设置跨域时,是否允许自定义header
add_header Access-Control-Allow-Headers <字段名>;

3.3 postMessage实现跨域
通过触发message事件, 达到父级和iframe内的页面传递参数
3.4 location.hash + iframe
父级页面修改hash值, 子页面监听hash值变化,window.onhashchang
3.5 window.name + iframe
3.6 websocket
3.7 fetch

前端通过设置 withCredentials可携带cookie

七、安全

CSRF(跨站请求伪造)
XSS(跨站脚本攻击)

八、算法

  • 排序
  • 堆栈、队列、链表

九、浏览器渲染机制

  1. DOCTYPE 定义文档类型
    html5: <!DOCTYPE html>

  2. 浏览器渲染过程
    DOM tree CSSOM tree render tree layout painting

  3. reflow 重排
    当渲染树中的一部分(布局,显示隐藏, 几何属性等)发生改变, 重新构建的过程, 成为reflow

  4. 什么时候触发reflow
    布局变化
    隐藏
    几何属性发生变化

  5. 重绘
    当渲染树中的DOM元素外观(颜色、背景等)发生变化,将触发重绘过程。

重排reflow一定会触发重绘repaint, 重绘不一定会触发重排。

十、页面性能

  1. 合并、压缩资源,减少http请求
  2. DNS 预解析
  3. 使用CDN
  4. 非核心资源异步加载
  5. 合理利用缓存(最重要的部分) 强缓存、协商缓存

十一、错误监测

  1. 错误分类
  • 即时错误, js运行时报错
    • window.onerror
    • try catch
  • 资源加载时错误
    • Error事件捕获, 资源加载错误不会冒泡, 所以只能从捕获阶段获取错误。
    • object.onerror
    • performance.getEntries()
  1. 跨域资源错误捕获

  2. script添加crossorigin属性

  3. 设置js响应头Access-Control-Allow-Origin: *

  4. 错误上报

  • ajax
  • Image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容