“金三银四,金九银十”,用来形容求职最好的几个月。但是随着行业的饱和,初中级前端er就业形势不容乐观。
行业状态不可控,我们能做的当然只是让自己变得更加具有竞争力。
今年自己也用了几个月的时间来准备笔记面试,巩固基础知识。特此将自己在这个过程总结的题目分享出来,希望对于求职和准备求职的同学有所帮助。
CSS
列举不同的清除浮动的技巧
1 | /* 1.添加新元素 */ |
一像素边框
使用sass
语法。
1 | /* 定义 */ |
形成BFC(Block Formatting Context)的几种方式
BFC全称”Block Formatting Context”, 中文为“块级格式化上下文”。BFC元素特性表现原则就是,内部子元素再怎么翻江倒海,翻云覆雨都不会影响外部的元素。
float
为left|right
overflow
为hidden|auto|scroll
display
为table-cell|table-caption|inline-block
position
为absolute|fixed
布局
左定宽右自适应宽度,并且等高布局(最小高度200px)
1 | /* HTML */ |
JS
async
与defer
区别
异步(async) 脚本将在其加载完成后立即执行,而 延迟(defer) 脚本将等待 HTML 解析完成后,并按加载顺序执行。
location.replace()
与location.assign()
区别
location.replace()
的url不会出现在history中
new
操作符
- 创建一个空对象,并且
this
变量引用该对象,同时还继承了 该函数的原型 - 属性和方法被加入到
this
引用的对象中 - 新创建的对象由
this
所引用,并且最后隐式的返回this
AMD CMD CommonJS
1 | /* AMD是RequireJS对模块化的定义 |
DOM 操作
1 | // 创建节点 |
JS设置css样式的几种方式
1 | /* 1.直接设置style属性 */ |
阻止默认行为
1 | function stopDefault( e ) { |
阻止冒泡
1 | function stopBubble(e) { |
Ajax交互过程
- 创建XMLHttpRequest对象,也就是创建一个异步调用对象.
- 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
- 设置响应HTTP请求状态变化的函数.
- 发送HTTP请求.
- 获取异步调用返回的数据.
- 使用JavaScript和DOM实现局部刷新.
考察知识点最广的JS面试题
1 | function Foo() { |
具体讲解参见一道常被人轻视的前端JS面试题
JS数组深浅拷贝
slice
实现
1 | var arr = ['old', 1, true, null, undefined]; |
concat
实现
1 | var arr = ['old', 1, true, null, undefined]; |
以上两种方法只是浅拷贝,如果数组元素是基本类型,就会拷贝一份新的;但是如果数组元素是对象或者数组,就只会拷贝引用(类似指针),修改其中一个就会影响另外一个。
1 | var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]; |
JSON.stringify
实现数组深拷贝
1 | var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]; |
简单粗暴,但是问题是不能拷贝函数,不推荐。
然后我们来手动实现深浅拷贝。
- 浅拷贝
1 | var shallowCopy = function (obj) { |
- 深拷贝
1 | var deepCopy = function (obj) { |
数组去重
filter
+indexOf
1 | function unique (arr) { |
filter
+sort
1 | function unique (arr) { |
ES6
1 | function uniqu3 (arr) { |
找出数组中的最大值
reduce
1 | var arr = [6, 4, 1, 8, 2, 11, 3]; |
apply
1 | var arr = [6, 4, 1, 8, 2, 11, 3]; |
ES6
1 | var arr = [6, 4, 1, 8, 2, 11, 3]; |
打乱数组的方法
1 | var arr = []; |
数组扁平化
1 | var arr = [1, [2, [3, 4]]]; |
排序
1 | // 冒泡 |
数字格式化 1234567890 -> 1,234,567,890
1 | function formatNum (num) { |
打乱数组的方法
1 | var arr = []; |
尾调用优化
即只保存内层函数的调用帧(只有开启严格模式,才会生效),只有不再用到外层函数的内部变量,内层函数的调用帧才会取代外层函数的调用帧,否则无法进行“尾调用优化。1
2
3
4
5
6
7
8
9
10
11
12function factorial(n) {
if (n === 1) return 1;
return n * factorial(n-1);
}
factorial(5)
/* 优化尾递归 */
function factorial(n, total) {
if (n === 1) return total;
return factorial(n - 1, n * total);
}
factorial(5, 1)
柯里化
实现add(1,2)
和add(1)(2)
均输出3
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
27function add () {
let sum = 0;
Array.prototype.forEach.call(arguments, function (item, index){
if (typeof item !== 'number') {
return false;
} else {
sum += item;
}
})
var tmp = function () {
Array.prototype.forEach.call(arguments, function (item, index){
if (typeof item !== 'number') {
return false;
} else {
sum += item;
}
})
return tmp;
}
tmp.toString = function () {
return sum
}
return tmp;
}
add(1, 2); // 3
add(1)(2); // 3
add(1, 2, 3)(1, 4)(2, 2)(1) // 16
ES8 新特性
- 字符串填充
1 | str.padStart(targetLength [, padString]) |
values
和entries
函数
1 | Object.values(obj) |
getOwnPropertyDescriptors
函数
1 | Object.getOwnPropertyDescriptors(obj) |
- 函数参数逗号结尾
1 | function es8(var1, var2, var3,) {} |
- 异步函数
由async
关键词定义的函数声明了一个可以异步执行的函数,返回一个AsyncFunction
类型的对象。
1 | fucntion fetchTextByPromise () { |
数据类型判断
1 | var class2type = {}; |
防抖
1 | /* |
简单的字符串模板
1 | var TemplateEngine = function(tpl, data) { |
apply
、call
和bind
apply
和call
在严格模式下,未指定环境对象而调用函数,则this 值不会转型为window。除非明确把函数添加到某个对象或者调用apply()或call(),否则this 值将是undefined。
在非严格模式下,call、apply的第一个参数传递为null或undefined时,函数体内的this会指向默认的宿主对象,在浏览器中则是window。
apply
、call
和bind
比较
1 | var obj = { |
很明显,bind
方法后面多了一对括号。也就是说,当你希望改变上下文环境之后并且立即执行,而是回调执行的时候(多用于事件监听器函数),使用bind()
方法,而apply/call
则会立即执行函数。
- 定义一个 log 方法,让它可以代理 console.log 方法。
1 | function log(){ |
- 给每一个 log 消息添加一个”(app)”的前辍,比如:
1 | log("hello world"); //(app)hello world |
1 | function log(){ |
apply
实现bind
1 | function bind (fn, context) { |
创建对象
- 工厂模式
1 | function createPerson(name, age, job){ |
- 构造函数模式
1 | function Person(name, age, job){ |
- 原型模式
1 | function Person(){ |
- 构造函数 + 原型模式
1 | function Person(name, age, job){ |
JS实现Jquery的extend()
方法
1 | function extend() { |
自定义事件(通过观察者模式)
1 | function EventTarget () { |
安全
跨域的几种方法
- 主域相同的跨域
1 | document.domain |
window.postMessage
JSONP
跨域(只支持GET
)
1 | function todo(data){ |
websocket
跨域
XSS 和 CSRF
性能
CSS 优化
- 正确的时机调用CSS
- 使用媒体查询标记
<link>
,选择性加载 - 减少css文件数量
- 压缩css代码