1. 你是如何理解 HTML 语义化的?
2. meta viewport 是做什么用的,怎么写?
控制页面在移动端不要缩小显示。
一开始,所有页面都是给PC准备的,乔布斯推出 iPhone 3GS,页面是不适应手机屏幕的,所以乔布斯的工程师想了一个办法,默认把手机模拟成 980px,页面缩小。
后来,智能手机普及,这个功能在部分网站不需要了,所以我们就用 meta:vp 让手机不要缩小我的网页。
3. canvas 元素是干什么的?
项目丢给他。
看 MDN 的 canvas 入门手册。
1. (必考) 说说盒模型。
举例:
content-box: width == 内容区宽度
border-box: width == 内容区宽度 + padding 宽度 + border 宽度
2. css reset 和 normalize.css 有什么区别?
* 考英文:
* reset 重置,之前的样式我不要,a{color: red;},抛弃默认样式
* normalize 让所有浏览器的标签都跟标准规定的默认样式一致,各浏览器上的标签默认样式基本统一。
3. (必考)如何居中?
* 平时总结:
* 水平居中:
* 内联:爸爸身上写 text-align:center;
* 块级:margin-left: auto; margin-right: auto;
* 垂直居中: https://jscode.me/t/topic/1936
4. 选择器优先级如何确定?
1. 选择器越具体,优先级越高。 #xxx 大于 .yyy
2. 同样优先级,写在后面的覆盖前面的。
3. color: red !important; 优先级最高。
5. BFC 是什么?
* 举例:
* overflow:hidden 清除浮动。(方方总是用 .clearfix 清除浮动,坚决不用 overflow:hidden 清除浮动)
* overflow:hidden 取消父子 margin 合并。http://jsbin.com/conulod/1/edit?html,css,js,output (方方用 padding-top: 1px;)
6. 如何清除浮动?
1. overflow: hidden (方方反对)
2. .clearfix 清除浮动写在爸爸身上
.clearfix::after{
content: ''; display: block; clear:both;
}
.clearfix{
zoom: 1; /* IE 兼容 */
}
JS 押题
JS 有哪些数据类型?
string number bool undefined null object symbol
object 包括了数组、函数、正则、日期等对象
一旦出现(数组、函数、正则、日期、NaN)直接0分
(必考) Promise 怎么使用?
then
$.ajax(...).then(成功函数, 失败函数)
链式 then
$.ajax(...).then(成功函数, 失败函数).then(成功函数2, 失败函数2)
如何自己生成 Promise 对象
function xxx(){
return new Promise(function(resolve, reject){
setTimeout(()=>{
resolve() 或者 reject()
},3000)
})
}
xxx().then(...)
(必考) AJAX 手写一下?
let xhr = new XMLHttpRequest()
xhr.open('POST', '/xxxx')
xhr.onreadystatechange = function(){
if(xhr.readyState === 4 && xhr.status === 200){
console.log(xhr.responseText)
}
}
xhr.send('a=1&b=2')
(必考)闭包是什么?
function (){
var n = 0
return function(){
n += 1
}
}
let adder = ()
adder() // n === 1
adder() // n === 2
console.log(n) // n is not defined
正确参考:https://zhuanlan.zhihu.com/p/22486908
(必考)这段代码里的 this 是什么?
(必考)什么是立即执行函数?使用立即执行函数的目的是什么?
;(function (){
var name
}())
;(function (){
var name
})()
!!!!!!!function (){
var name
}()
~function (){
var name
}()
造出一个函数作用域,防止污染全局变量
ES 6 新语法
{
let name
}
async/await 语法了解吗?目的是什么?
function returnPromise(){
return new Promise( function(resolve, reject){
setTimeout(()=>{
resolve('fuck')
},3000)
})
}
returnPromise().then((result)=>{
result === 'fuck'
})
var result = await returnPromise()
result === 'fuck'
把异步代码写成同步代码。
如何实现深拷贝?
JSON 来深拷贝
var a = {...}
var b = JSON.parse( JSON.stringify(a) )
缺点:JSON 不支持函数、引用、undefined、RegExp、Date……
递归拷贝
function clone(object){
var object2
if(! (object instanceof Object) ){
return object
}else if(object instanceof Array){
object2 = []
}else if(object instanceof Function){
object2 = eval(object.toString())
}else if(object instanceof Object){
object2 = {}
}
你也可以把 Array Function Object 都当做 Object 来看待,参考 https://juejin.im/post/587dab348d6d810058d87a0a
for(let key in object){
object2[key] = clone(object[key])
}
return object2
}
环
RegExp、Date、Set、Symbol、WeakMap
如何实现数组去重?
计数排序的逻辑(只能正整数)
var a = [4,2,5,6,3,4,5]
var hashTab = {}
for(let i=0; i
Set 去重
Array.from(new Set(a))
WeakMap 任意类型去重
如何用正则实现 string.trim() ?
function trim(string){
return string.replace(/^\s+|\s+$/g, '')
}
JS 原型是什么?
* 举例
1. var a = \[1,2,3\]
2. 只有0、1、2、length 4 个key
3. 为什么可以 a.push(4) ,push 是哪来的?
4. a.**proto** === Array.prototype
5. push 就是沿着 a.**proto** 找到的,也就是 Array.prototype.push
6. Array.prototype 还有很多方法,如 join、pop、slice、splice
7. Array.prototype 就是 a 的原型(**proto**)
参考:[https://zhuanlan.zhihu.com/p/23090041](https://zhuanlan.zhihu.com/p/23090041 "null")
* 把 MDN class 章节看完
* 记住一个例子
* 原型链
function Animal(){
this.body = '肉体'
}
Animal.prototype.move = function(){
}
function Human(name){
Animal.apply(this, arguments)
this.name = name
}
// Human.prototype.__proto__ = Animal.prototype // 非法
var f = function(){}
f.prototype = Animal.prototype
Human.prototype = new f()
Human.prototype.useTools = function(){}
var frank = new Human()
* extends 关键字
class Animal{
constructor(){
this.body = '肉体'
},
move(){}
}
class Human extends Animal{
constructor(name){
super()
this.name = name
},
useTools(){}
}
var frank = new Human()
DOM 押题
DOM 事件模型是什么?
移动端的触摸事件了解吗?
事件委托是什么?有什么好处?
假设父元素有4个儿子,我不监听4个儿子,而是监听父元素,看触发事件的元素是哪个儿子,这就是事件委托。
可以监听还没有出生的儿子(动态生成的元素)。省监听器。
function listen(element, eventType, selector, fn){
element.addEventListener(eventType, e=>{
if(e.target.matches(selector)){
fn.call(el, e, el)
}
})
}// 有 bug 但是可以应付面试官的事件委托
function listen(element, eventType, selector, fn) {
element.addEventListener(eventType, e => {
let el = e.target
while (!el.matches(selector)) {
if (element === el) {
el = null
break
}
el = el.parentNode
}
el && fn.call(el, e, el)
})
return element
} // 工资 12k+ 的前端写的事件委托
listen(ul, 'click', 'li', ()=>{})
ul>li*5>span
HTTP 押题
Vue 押题
(必考)Vue 有哪些生命周期钩子函数?
(必考)Vue 如何实现组件通信?
Vuex 的作用是什么?
VueRouter 路由是什么?
Vue 的双向绑定是如何实现的?有什么缺点?
Computed 计算属性的用法?跟 Methods 的区别。
https://zhuanlan.zhihu.com/p/33778594
算法押题
把上面三个背一下,算法题必过。
安全押题
举例
div.innerHTML = userComment // userComment 内容是
// 恶意就被执行了,这就是 XSS
预防
<
>
&
'
"
<
’).replace…Webpack 题
发散题
从输入 URL 到页面展现中间发生了什么?
你没有工作经历吗?
你遇到过最难的问题是什么?
https://www.zhihu.com/question/35323603/answer/338796153
你的期望薪资是多少?
你想要的工资 加 1000~2000。
(任何你不会的问题)
刁钻代码题
map加parseInt
[1,2,3].map(parseInt)
parseInt(1,0, array) // 1
parseInt(2,1, array) // NaN
parseInt(3,2, array) // NaN
a.x = a = {}
var a = {n:1};
var b = a;
a.x = a = {n:2};
问 a.x 是多少?
(a 1 && a 2 && a==3) 可能为 true 吗?
a = {
value: 0,
toString(){
a.value += 1
return a.value
}
}