- var let const 区别
- var是es5语法,let,const是es6语法。var有变量提升
- var,let是用来声明变量,可修改。const是用来声明常量,不可修改
- let,const 有块级作用域(会形成暂时性死区),var没有
- typeof能判断哪些类型
- undefined,string,boolean,number,symbol (所有的值类型)
- object ([], {}, null)
- function
- 强制类型转换和隐士类型转化
- pareInt,parseFloat,toString
- ==,逻辑运算,if,+字符串拼接
- split() 和 join()的区别
split(): 将字符串转化为数组
join() : 将数组转化为字符串 - pop,push,shift,unshift 分别是什么
分析: 功能是什么,返回值是什么,是否对原数组造成影响
pop删除数组的最后一项,返回删除的元素
shift删除数组的第一项,返回删除的元素
push在数组的最后一项增加一个元素,返回数组的长度
unshift在数组的第一项增加一个元素,返回数组的长度
都对数组造成影
纯函数:(不该变原数组,返回一个数组)
concat,map,filter - slice 和splice的区别
slice 剪切 纯函数
splice 剪接 非纯函数 - [10,20,30].map(parseInt) 10 NAN NAN 拆解
- ajax中get和post的区别
- get一般用于查询 post用于用户提交数据
- get参数拼接在url上,post放在请求体中(数据可以很大)
- post有利于防范xsrf攻击
- call 和 apply bind 的区别是什么
改变this执行
call :第一个参数是this,后面是零散的数据
apply:第一个参数是this,后面是一个数组,或者一个结合
bind:第一个参数是this,但是返回一个函数,需要重新调用 - 事件委托(代理)是什么
就是把一个元素响应事件的函数委托到另一个元素,利用冒泡的原理,把事件加到父级上,触发执行效果 - 闭包是什么,有什么特性,负面影响
两个函数存在嵌套关系,内部函数可以访问外部函数的参数
函数作为参数被传入 函数作为返回值
自由变量在函数定义的地方查找
变量会常驻内存,得不到释放。不要乱用 - 如何阻止事件冒泡和默认行为
- e.stopPropagation()
- e.preventDefault()
- 增删改查dom节点方法
- creatElement,appendChild,removeChild,getelementById
- 如何减少dom操作
- dom查找是非常耗性能
- 缓存dom查询结果
- 多次dom操作,合并到一次插入
- creatDocumentFragment
-
jsonp的原理,为何不是真正的ajax
jsonp 是通过script标签实现的
ajax是用过xmlHttpRequest
img ,script =>
jsonp -
load,ready区别
-
== ===
类型转换 ,严格相等 -
函数声明和函数表达式的区别
-
this的场景题
-
new Object() {}, Object.creat()区别
Object.creat() 创建一个空对象,把空对象的原型执行你传入的对象 -
手写trim,兼容
-
获取最大值
-
js实现继承
class
prototype -
什么是json
json是一种数据格式,本质就是一个字符串
window.JSON是全局对象。JSON.stringifry JSON.parse -
如何捕获js异常
try catch window.onerror -
获取当前页面的url参数
location.serach -
手写深拷贝 object.assign不是深拷贝(只能一层)
-
requestAnimateFrame
-
性能优化:
原则:多使用内存,缓存,减少计算,网络请求
方向:文件获取更快,代码执行更快 -
http在哪一层协议(作为一个实习生,这个问题90%会问到)
(1):osi
这个模型,把网络通信的工作分为7层,分别是
物理层
,
数据链路层
,
网络层(ip)
,
传输层(tcp:传输控制协议TCP,udp:用户数据报协议)
,
会话层
,
表示层
,
应用层:文件传输协议(HTTP,FTP,NFS,SMTP)
User Agent:使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
28:你了解的ssr是什么,用ssr有什么好处
29:从地址栏输入url,发生了什么
2.21 电话面试
- 简述冒泡排序
- 简述数组去重
- es6,es7新增了那些
- 箭头函数的this和普通函数的this
- 怎么样形成闭包,怎么解决闭包变量污染的情况
- typeof
- 改变this指向的方法
- vue组件通信
解答:
13: 简述冒泡排序
(1) 首先判断是否是数组,数组是否为空
instanceof Object.prototype.toString.call() length
(2) 双层循环:
外层循环控制趟数
内层循环控制次数
function bubble(arr) {
// 先判断是否是数组或者是空数组
if (arr instanceof Array && arr.length > 1) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
let temp = []
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
}
}
return arr
}
}
let arr = [1, 7, 4, 6, 3]
console.log(bubble(arr));
14 :数组去重
1:先获取到数组的当前项let item = arr[i],然后去除当前项(split(i+1))
2:然后用当前项,和后面的每一项做比较,indexOf(有匹配到的返回-1)
3:将没有重复的项,添加到新数组里面
let arr = [1, 1, 8, 2]
let newArr = []
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
arg = arr.slice(i + 1)
if (arg.indexOf(item) > -1) {
// 未找到和当前匹配的。会返回-1,现在>-1说明,有和当前匹配的,有重复的
} else {
newArr.push(item)
}
}
console.log(newArr);
16:箭头函数和普通函数
普通函数的this:在运行时基于函数执行环境绑定的
箭头函数:箭头函数没有this,箭头函数的this继承自所处上下问的this,call和apply无法改变this的执行
箭头函数中没有arguments类数组,只能基于…arg获取传递参数的集合数组
箭头函数不能被new执行,因为箭头函数没有this叶没有prototype
由于this只是在当前函数内部使用,而且js函数可以多层嵌套,使得我们无法得到最开始的this,这时我们可以用一个变量存储起来/es6提供的箭头函数
2.27 电话面试
- 离职原因
- 简单的自我介绍
- 由于我简历一开始就写的vue,所以问的vue比较多
- vue的双向数据绑定里面的defineProperty里面的get,set是用什么样的设计模式实现的
- vue组件里面data,你觉得为什么要有data这个东西呢 数据的监听
- route router 使用上有什么本质区别
- route 现在的前端技术都会加# 怎么去掉#
- hash函数
- keep-alive 使用过吗, 会用在什么场景
- vue的核心是什么
- 你又是怎么理解数据和组件
- 有了框架会带来一些便利,但是也会带来一些缺陷:
- 加载耗时,打包,传统的seo,历史页面,不适合开发大型项目
- h5,vue存数据,你有看过数据存在哪里?是存在磁盘吗?
- 怎么搞兼容性问题?从哪些方面解决这些事情
- 浏览器渲染的性能优化
- 给你一个数组 ,把其中重复的数据 思想
3.13 面试
图片自适应有哪些方式
h5的存储
音频视屏
flex的属性
怎么获取视屏播放的事件
3.24 知乎面试
说说路由守卫
生命周期函数
MVVM和MVC的区别
数组排序
v-show v-if的区别
url输入发生了什么
jq的选择器
3.14: 滴滴
1:说说http协议
2: 点击事件