前端问题记录

  1. HTML相关
  2. CSS相关
  3. javascript相关
  4. dom相关
  5. HTTP相关
  6. VUE相关
  7. 算法相关
  8. 网络安全相关
  9. webpack相关
  10. 其他

    Html相关

    1 html语义化
    意义:根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析。
    注意:
    1.尽可能少的使用无语义的标签div和span;
    2.在语义不明显时,既可以使用div或者p时,尽量用p, 因为p在默认情况下有上下间距,对兼容特殊终端有利;
    3.不要使用纯样式标签,如:b、font、u等,改用css设置。
    4.需要强调的文本,可以包含在strong或者em标签中(浏览器预设样式,能用CSS指定就不用他们),strong默认样式是加粗(不要用b),em是斜体(不用i);
    5.使用表格时,标题要用caption,表头用thead,主体部分用tbody包围,尾部用tfoot包围。表头和一般单元格要区分开,表头用th,单元格用td;
    6.表单域要用fieldset标签包起来,并用legend标签说明表单的用途;
    7.每个input标签对应的说明文本都需要使用label标签,并且通过为input设置id属性,在lable标签中设置for=someld来让说明文本和相对应的input关联起来。

新标签:
h5新元素

2 meta viewport相关
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  H5标准声明,使用 html5 doctype,不区分大小写
<head lang=”en”> 标准的 lang 属性写法
<meta charset=’utf-8′> 声明文档使用的字符编码
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″/> 优先使用 IE 最新版本和 Chrome
<meta name=”description” content=”不超过150个字符”/> 页面描述
<meta name=”keywords” content=””/> 页面关键词
<meta name=”author” content=”name, email@gmail.com”/> 网页作者
<meta name=”robots” content=”index,follow”/> 搜索引擎抓取
<meta name=”viewport” content=”initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no”> 为移动设备添加 viewport
<meta name=”apple-mobile-web-app-title” content=”标题”> iOS 设备 begin
<meta name=”apple-mobile-web-app-capable” content=”yes”/> 添加到主屏后的标题(iOS 6 新增)
是否启用 WebApp 全屏模式,删除苹果默认的工具栏和菜单栏
<meta name=”apple-itunes-app” content=”app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL”>
添加智能 App 广告条 Smart App Banner(iOS 6+ Safari)
<meta name=”apple-mobile-web-app-status-bar-style” content=”black”/>
<meta name=”format-detection” content=”telphone=no, email=no”/> 设置苹果工具栏颜色
<meta name=”renderer” content=”webkit”> 启用360浏览器的极速模式(webkit)
<meta http-equiv=”X-UA-Compatible” content=”IE=edge”> 避免IE使用兼容模式
<meta http-equiv=”Cache-Control” content=”no-siteapp” /> 不让百度转码
<meta name=”HandheldFriendly” content=”true”> 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓
<meta name=”MobileOptimized” content=”320″> 微软的老式浏览器
<meta name=”screen-orientation” content=”portrait”> uc强制竖屏
<meta name=”x5-orientation” content=”portrait”> QQ强制竖屏
<meta name=”full-screen” content=”yes”> UC强制全屏
<meta name=”x5-fullscreen” content=”true”> QQ强制全屏
<meta name=”browsermode” content=”application”> UC应用模式
<meta name=”x5-page-mode” content=”app”> QQ应用模式
<meta name=”msapplication-tap-highlight” content=”no”> windows phone 点击无高光
设置页面不缓存
<meta http-equiv=”pragma” content=”no-cache”>
<meta http-equiv=”cache-control” content=”no-cache”>
<meta http-equiv=”expires” content=”0″>
3 canvas 相关
1
2
3
4
5
6
7
使用前需要获得上下文环境,暂不支持3d
常用api:
1.fillRect(x,y,width,height)实心矩形
2.strokeRect(x,y,width,height)空心矩形
3.fillText("Hello world",200,200);实心文字
4.strokeText("Hello world",200,300)空心文字
各种东西!!!
新标签兼容低版本
  1. ie9之前版本通过createElement创建html5新标签
  2. 引入html5shiv.js

    CSS相关

    1.盒模型
    1.ie盒模型算上border、padding及自身(不算margin),标准的只算上自身窗体的大小
    css设置方法如下
    1
    2
    3
    4
    /* 标准模型 */
    box-sizing:content-box;
    /*IE模型*/
    box-sizing:border-box;

2.margin、border、padding、content由外到里
3.几种获得宽高的方式

  • dom.style.width/height
      这种方式只能取到dom元素内联样式所设置的宽高,也就是说如果该节点的样式是在style标签中或外联的CSS文件中设置的话,通过这种方法是获取不到dom的宽高的。
  • dom.currentStyle.width/height
      这种方式获取的是在页面渲染完成后的结果,就是说不管是哪种方式设置的样式,都能获取到。但这种方式只有IE浏览器支持。
  • window.getComputedStyle(dom).width/height
      这种方式的原理和2是一样的,这个可以兼容更多的浏览器,通用性好一些。
  • dom.getBoundingClientRect().width/height
      这种方式是根据元素在视窗中的绝对位置来获取宽高的
  • dom.offsetWidth/offsetHeight
      这个就没什么好说的了,最常用的,也是兼容最好的。

4.拓展 各种获得宽高的方式

  • 获取屏幕的高度和宽度(屏幕分辨率):
    window.screen.height/width
  • 获取屏幕工作区域的高度和宽度(去掉状态栏):
    window.screen.availHeight/availWidth
  • 网页全文的高度和宽度:
    document.body.scrollHeight/Width
  • 滚动条卷上去的高度和向右卷的宽度:
    document.body.scrollTop/scrollLeft
  • 网页可见区域的高度和宽度(不加边线):
    document.body.clientHeight/clientWidth
  • 网页可见区域的高度和宽度(加边线):
    document.body.offsetHeight/offsetWidth

5.边距重叠解决方案(BFC)
BFC原理

  • 内部的box会在垂直方向,一个接一个的放置
    每个元素的margin box的左边,与包含块border box的左边相接触(对于从做往右的格式化,否则相反)
  • box垂直方向的距离由margin决定,属于同一个bfc的两个相邻box的margin会发生重叠
  • bfc的区域不会与浮动区域的box重叠
  • bfc是一个页面上的独立的容器,外面的元素不会影响bfc里的元素,反过来,里面的也不会影响外面的
  • 计算bfc高度的时候,浮动元素也会参与计算
    创建bfc
  • float属性不为none(脱离文档流)
  • position为absolute或fixed
  • display为inline-block,table-cell,table-caption,flex,inine-flex
  • overflow不为visible
  • 根元素
    demo
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <section class="top">
    <h1>h1>
    这块margin-bottom:30px;
    section>

    <div style="overflow:hidden">
    <section class="bottom">
    <h1>h1>
    这块margin-top:50px;
    section>
    div>
css reset 和 normalize.css 有什么区别
  • 两者都是通过重置样式,保持浏览器样式的一致性
  • 前者几乎为所有标签添加了样式,后者保持了许多浏览器样式,保持尽可能的一致
  • 后者修复了常见的桌面端和移动端浏览器的bug:包含了html5元素的显示设置、预格式化文字的font-size问题、在IE9中SVG的溢出、许多出现在各浏览器和操作系统中的与表单相关的bug。
  • 前者中含有大段的继承链
  • 后者模块化,文档较前者来说丰富
    居中方法
    水平方向上
    1
    2
    3
    4
    针对inline, 内联块inline-block, 内联表inline-table, inline-flex元素及img,span,button等元素
    .text_div{
    text-align:center;
    }
1
2
3
4
不定宽块状元素居中
.text_div{
margin:0 auto;
}
1
2
3
4
5
6
7
8
9
10
通过给父元素设置 float,然后给父元素设置 position:relativeleft:50%,子元素设置 position:relativeleft: -50% 来实现水平居中。
.wrap{
float:left;
position:relative;
left:50%;
clear:both;
}
.wrap-center{
left:-50%;
}

垂直居中

1
2
3
4
5
6
7
单行内联(inline-)元素垂直居中 
通过设置内联元素的高度(height)和行高(line-height)相等,从而使元素垂直居中。

.text_div{
height: 120px;
line-height: 120px;
}

1
2
3
4
5
6
7
8
利用表布局
.father {
display: table;
}
.children {
display: table-cell;
vertical-align: middle;
}
1
2
3
4
5
6
flex布局
.center-flex {
display: flex;
flex-direction: column;//上下排列
justify-content: center;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
绝对布局方式
已知高度
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
height: 100px;
margin-top: -50px;
}
未知高度
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
transform: translateY(-50%);
}

垂直水平居中根据上方结合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
flex方式
.parent {
display: flex;
justify-content: center;
align-items: center;
}
grid方式
.parent {
height: 140px;
display: grid;
}
.child {
margin: auto;
}

css优先级确定
  • 每个选择器都有权值,权值越大越优先
  • 继承的样式优先级低于自身指定样式
  • !important优先级最高 js也无法修改
  • 权值相同时,靠近元素的样式优先级高 顺序为内联样式表(标签内部)> 内部样式表(当前文件中)> 外部样式表(外部文件中)
    bfc内容见盒模型
    如何清除浮动
    不清楚浮动会发生高度塌陷:浮动元素父元素高度自适应(父元素不写高度时,子元素写了浮动后,父元素会发生高度塌陷)
  • clear清除浮动(添加空div法)在浮动元素下方添加空div,并给该元素写css样式: {clear:both;height:0;overflow:hidden;}
  • 给浮动元素父级设置高度
  • 父级同时浮动(需要给父级同级元素添加浮动)
  • 父级设置成inline-block,其margin: 0 auto居中方式失效
  • 利用br标签的clear属性
  • 给父级添加overflow:hidden 清除浮动方法
  • 万能清除法 after伪类 清浮动(现在主流方法,推荐使用)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    .float_div:after{
    content:".";
    clear:both;
    display:block;
    height:0;
    overflow:hidden;
    visibility:hidden;
    }
    .float_div{
    zoom:1
    }
自适应布局

思路:

  1. 左侧浮动或者绝对定位,然后右侧margin撑开
  2. 使用div包含,然后靠负margin形成bfc
  3. 使用flex
    画三角形
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #item {
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-top: 50px solid transparent;
    border-bottom: 50px solid blue;
    background: white;
    }
  1. link是xhtml标签,除了加载CSS外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS。
  2. link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载。
  3. link无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持。
  4. ink支持使用javascript控制dom去改变样式;而@import不支持。
    animation
    长宽比方案
  5. 使用padding方式结合calc实现
  6. 长宽一项设置百分比另一项aspect-ratio实现(需借助插件实现)
    display相关
  7. block:div等容器类型
  8. inline:img span等行内类型
  9. table系列:将样式变成table类型
  10. flex:重点把握,非常强大
  11. grid:同上
  12. inline-block:可设置宽度,两者间有一点间隙
  13. inherit:继承父级

    javascript相关

    1 [“1”, “2”, “3”].map(parseInt)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    首先, map接受两个参数, 一个回调函数 callback, 一个回调函数的this

    其中回调函数接受三个参数 currentValue, index, arrary;

    而题目中, map只传入了回调函数--parseInt.

    其次, parseInt 只接受两个两个参数 string, radix(基数).
    本题理解来说也就是key与 index

    所以本题即问
    parseInt('1', 0);
    parseInt('2', 1);
    parseInt('3', 2);

    parseInt(string, radix)
    string 必需。要被解析的字符串。
    radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
    如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
2 [[3,2,1].reduce(Math.pow), [].reduce(Math.pow)]
1
2
3
4
5
arr.reduce(callback[, initialValue])
reduce接受两个参数, 一个回调, 一个初始值.
回调函数接受四个参数 previousValue, currentValue, currentIndex, array
需要注意的是 If the array is empty and no initialValue was provided, TypeError would be thrown.
所以第二个表达式会报异常. 第一个表达式等价于 Math.pow(3, 2) => 9; Math.pow(9, 1) =>9
3
1
2
3
4
5
6
7
8
9
var ary = [0,1,2];
ary[10] = 10;
ary.filter(function(x) { return x === undefined;});
我们看到在迭代这个数组的时候, 首先检查了这个索引值是不是数组的一个属性, 那么我们测试一下.

0 in ary; => true
3 in ary; => false
10 in ary; => true
也就是说 从 3 - 9 都是没有初始化的bug !, 这些索引并不存在与数组中. 在 array 的函数调用的时候是会跳过这些坑的.
4 [typeof null, null instanceof Object]
1
2
3
4
5
6
7
8
9
10
11
12
typeof 返回一个表示类型的字符串.
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上.
type result
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol "symbol"
Host object Implementation-dependent
Function "function"
Object "object"
5 js数据类型

1.number;

2.string;

3.boolean;

4.undefined;

5.null;

6.symbol(ES6新增,文章后面有对着新类型的解释)Symbol 生成一个全局唯一的值。

7.Object.(包括Object,Array,Function)

6 promise 用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
定义
var promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
使用
promise.then(function(value) {
// success
}, function(error) {
// failure
});
//等价于:
promise.then(function(){
//success
}).catch(function(){
//failure
})
7 es6 promise ajax
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
定义
const myHttpClient = url => {
return new Promise((resolve, reject) => {
let client = new XMLHttpRequest();
client.open("GET", url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
function handler() {
if (this.readyState !== 4) {
return;
}
if (this.status === 200) {
resolve(this.response);
} else {
reject(new Error(this.statusText));
}
}
});
};
使用
myHttpClient('https://www.baidu.com').then(res => {
console.log(res);
}).catch(error => {
console.log(error);
});
8闭包
1
2
3
4
5
6
7
8
9
10
11
function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2); // bar 现在是一个闭包
bar(10);
结果是16
es6通常用let const块级作用域代替,
闭包缺点,ie中会引起内存泄漏,严格来说是ie的缺点不是闭包的问题
9 什么是立即执行函数?使用立即执行函数的目的是什么?
1
2
3
4
5
6
7
8
9
10
11
常见两种方式
1.(function(){...})()
(function(x){
console.log(x);
})(12345)
2.(function(){...}())
(function(x){
console.log(x);
}(12345))
作用 不破坏污染全局的命名空间,若需要使用,将其用变量传入如
function(window){...}(window))
10 async/await 语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
作用:异步代码的新方式
promise示例
const makeRequest = () => {
return getJSON()
.then(data => {
if (data.needsAnotherRequest) {
return makeAnotherRequest(data)
.then(moreData => {
console.log(moreData)
return moreData
})
} else {
console.log(data)
return data
}
})
}
async/await示例
const makeRequest = async () => {
const data = await getJSON()
if (data.needsAnotherRequest) {
const moreData = await makeAnotherRequest(data);
console.log(moreData)
return moreData
} else {
console.log(data)
return data
}
}
函数前面多了一个aync关键字。await关键字只能用在aync定义的函数内。async函数会隐式地返回一个promise,该promise的reosolve值就是函数return的值。(示例中reosolve值就是字符串"done")
11 深浅拷贝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let a = {
aa: 1,
bb: 2,
cc: 3,
dd: {
ee: 5,
},
ff: {
gg: 6,
}
};
let d = JSON.parse(JSON.stringify(a));//深复制包含子对象
let c = {...a};//深拷贝单不包含子对象
let b = a;//浅拷贝
b.bb = 22;
c.cc = 33;
c.dd.ee = 55;
d.ff.gg = 66;
console.log(a);
console.log(b);
console.log(c);
console.log(d);
12数组去重
1
2
3
4
5
6
思路1:定义一个新数组,并存放原数组的第一个元素,然后将元素组一一和新数组的元素对比,若不同则存放在新数组中
思路2:先将原数组排序,在与相邻的进行比较,如果不同则存入新数组。
思路3:利用对象属性存在的特性,如果没有该属性则存入新数组。
思路4(最常用):使用es6 set
let arr= [1, 2, 3, 3, 5, 7, 2, 6, 8];
console.log([...new Set(arr)]);
13正则实现trim()功能
1
2
3
4
5
function myTrim(str) {
let reg = /^\s+|\s+$/g;
return str.replace(reg, "");
}
console.log(myTrim(' asdf '));
14 JS原型
1
2
1.每个对象都有 __proto__ 属性,但只有函数对象才有 prototype 属性
2.个人粗略理解与python的类方法静态方法实例方法差不多

#####15 es6 class

1
面向对象,java中类

16 JS 如何实现继承
1
2
1.使用原型继承(既继承了父类的模板,又继承了父类的原型对象。优点是继承了父类的模板,又继承了父类的原型对象,缺点就是父类实例传参,不是子类实例化传参,不符合常规语言的写法)
2.使用call的方式(继承了父类的模板,不继承了父类的原型对象。优点是方便了子类实例传参,缺点就是不继承了父类的原型对象)
17 手写jquery插件
1
2
3
4
5
6
7
8
9
10
11
(function ($) {
$.fn.myPlugins = function (options) {
//参数赋值
options = $.extend(defaults, options);//对象合并
this.each(function () {
//执行代码逻辑
});
};
})(jquery);

$(selector).myPlugins({参数});
18 数组合并去重排序
1
2
3
4
5
let arr1 = [1, 25, 2, 26, 1234, 6, 213];
let arr2 = [2, 6, 2134, 6, 31, 623];
let c = [...new Set([...arr1, ...arr2])].sort((a, b) => {
return a - b;
});
19 call apply

作用:在函数调用时改变函数的执行上下文也就是this的值
区别:call采用不定长的参数列表,而apply使用一个参数数组。
性能优化图
性能优化

20 for 中setTimeOut

要为循环题创建不同的循环副本

21 sort函数

V8 引擎 sort 函数只给出了两种排序 InsertionSort 和 QuickSort,数量小于10的数组使用 插入,比10大的数组则使用 快排。

22 navigator

Navigator

23 jquery绑定方式
  1. click后者覆盖
  2. bind后者覆盖
  3. on(jquery>=1.7)
  4. live
  5. delegate
    24 事件流向
  6. 冒泡:子节点一层层冒泡到根节点
  7. 捕获顺序与冒泡相反
  8. addEventListener最后个参数true代表捕获反之代表冒泡
  9. 阻止冒泡不停止父节点捕获
    25原生操作class
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //判断有无
    function hasClass(ele, cls) {
    return ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
    }

    //添加
    function addClass(ele, cls) {
    if (!this.hasClass(ele, cls)) ele.className += " " + cls;
    }

    //删除
    function removeClass(ele, cls) {
    if (hasClass(ele, cls)) {
    let reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
    ele.className = ele.className.replace(reg, " ");
    }
    }

    html5中加入classList
    一系列操作
    兼容至IE10

dom相关

dom事件模型

dom之事件模型分脚本模型、内联模型(同类一个,后者覆盖)、动态绑定(同类多个)
demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37


>Hello1</button>



>Hello3</button>

body>