- 下面有关HTML的Doctype和严格模式与混杂模式的描述:
<!DOCTYPE> 声明位于文档中的最前面,处于<html>标签之前。告知浏览器的解析器,用什么文档类型 规范来解析这个文档
在标准模式中,浏览器根据规范呈现页面;在混杂模式中,页面以一种比较宽松的向后兼容的方式显示
浏览器根据DOCTYPE是否存在以及使用的哪种DTD来选择要使用的呈现方法
DOCTYPE不存在或格式不正确会导致文档以兼容模式 呈现
2.下面这段代码输出什么:
function Foo() {
var i = 0;
return function() {
console.log(i++);
}
}
var f1 = Foo(),
f2 = Foo();
f1();
f1();
f2();
答案:010
3.浏览器中使用js跨域获取数据:
js可以使用jsonp进行跨域
通过修改document.domain来跨子域
使用window.name来进行跨域
4.Flash和js通过什么类如何交互:
ExternalInterface
5.jQuery ajax中都支持哪些数据类型:
xml/html/jsonp/json/script/text
7.在js里判断一个对象是否为String类型:
obj instanceof String
8.浏览器端的储存技术:
cookie/webStorage(localStorage,sessionStorage)/globalStorage/
userData/IndexedDB/Google Gear/Flash ShareObject
9.嵌入在HTML文档中的图像格式可以是
.jpg/.jpeg/.png/.gif/.bmp/.webp
重要!:数组有哪些方法?
join()
push()和pop()
shift() 和 unshift()
sort()
reverse()
concat()
slice()
splice()
indexOf()和 lastIndexOf() (ES5新增)
forEach() (ES5新增)
map() (ES5新增)
filter() (ES5新增)
every() (ES5新增)
some() (ES5新增)
reduce()和 reduceRight() (ES5新增)
- substring和slice得区别?
参数都为正时没区别,参数为负数时返回值不同。
- 简述VUE的生命周期有哪些?
beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、 beforeDestroy、destroyed
- v-if和v-show的区别?
v-if | v-show | |
本质 | 条件渲染,添加或删除元素 | 控制display属性 |
首次渲染消耗 | 小 | 大 |
切换渲染消耗 | 大 | (css切换)小 |
配套 | v-else | -- |
- 简述vue数据双向绑定实现的原理/vue响应式原理
是通过数据劫持结合发布订阅模式的方式实现的,也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变。利用了Object.defineProperty()这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。
它接收三个参数,1.要操作的对象2.要定义或修改的对象属性名3.属性描述符。其中重点就是属性描述符。
属性描述符:是一个对象,主要有两种形式:数据描述符号、获取描述符。这两种对象只能选择一种使用,不能混合两种描述符的属性同时使用。getset属于储存描述对象的属性。
- 在vue中使用Watch方法监听数组需要注意些什么?
- vue router的原理?
结合router-link和router-view通过改变 URL,在不重新请求页面的情况下,更新页面视图。
- 如何解决跨域问题?
理解跨域的概念:协议、域名、端口都相同才同域,否则都是跨域
出于安全考虑,服务器不允许 ajax 跨域获取数据,但是可以跨域获取文件内容,所以基于这一点,可以动态创建 script 标签,使用标签的 src 属性访问 js 文件的形式获取 js 脚本,并且这个 js 脚本中的内容是函数调用,该函数调用的参数是服务器返回的数据,为了获取这里的参数数据,需要事先在页面中定义回调函数,在回调函数中处理服务器返回的数据,这就是解决跨域问题的主流解决方案
- 如何实现深拷贝?
- 利用JSON的stringify方法和parse方法实现(弊端)
- 用for...in实现遍历和复制
- 利用数组的Array.prototype.forEach进行深拷贝
- 递归
- 多个iframe 之间怎么传值?
- 从输入url到浏览器显示页面发生了什么?
- 输入网址
- 浏览器查找域名的IP地址
- 建立TCP链接
- 浏览器向WEB服务器发起Http请求
- 服务器端处理响应
- 关闭TCP链接
- 浏览器解析资源
h) 浏览器布局渲染
- vue里的data数据更新了,但视图没有更新是什么原因导致的,怎么解决?
原因:
- vue无法检测实例被创建时不存在于data中的property;
- vue无法检测对象property的添加或移除;
- vue不能检测通过数组索引直接修改的数组项;
- vue不能检测直接修改数组长度的变化;
- 在异步更新执行之前操作DOM数据不会变化;
解决办法:
- 使用this.$set()修改数据;
- this.$forceUpdate(),强制视图更新
c)在数据变化之后立即使用Vue.nextTick(callback)
- VUE的单页面应用首页加载白屏是什么原因?怎么解决?
原因:
单页面应用的html是靠js 生成,因为首屏需要加载很大的js文件(app.js 和vendor.js),所以当网速差的时候会产生一定程度的白屏
解决办法:
- 路由懒加载
- CDN资源优化
- gzip压缩
- 在vue.config.js中关闭productionSourceMap
- SSR,服务器渲染,在服务器端事先拼装好首页所需的html
f) 首页加loading或骨架屏(优化体验)
- 简述VUE的过滤器?
- 哪几种情况会导致js内存泄漏?
- 意外的全局变量
- 闭包
- 未清除dom元素的引用
- 循环引用
e) 未结束的计时器或回调
- 是否使用过函数防抖和节流,简述一下?
- 函数防抖:任务频繁触发情况下,只有任务触发的间隔超过指定间隔的时候,任务才会被执行
b) 函数节流:指定时间间隔内只会执行一次任务
- 了解js中的事件循环吗?
事件循环步骤如下:
-
- 所有同步任务都在主线程执行,形成一个执行栈
- 主线程之外有一个消息队列,只要异步操作执行完成(就是进入了回调),就到消息队列排队等候回调
- 同步代码,即栈中代码执行完后,就到消息队列中读取异步任务,结束异步人物的等待状态,并且放到执行栈中(并不是执行在队列执行),开始执行。
d) 不停重复上面三步。
- 在setTimeout中设置定时500ms是真的500ms吗?什么原因导致?谁导致的?
- 父子和兄弟和爷孙组件传参
- 父传子:props/
子传父:绑定事件,this.$emit(事件名,参数)
- vuex的工作流程就是:
(1)通过dispatch去提交一个actions,
(2) actions接收到这个事件之后,在actions中可以执行一些异步|同步操作,根据不同的情况去分发给不同的mutations,
(3)actions通过commit去触发mutations,
(4) mutations去更新state数据,state更新之后,就会通知vue进行渲染
- foreach和map的区别
forEach()方法不会返回执行结果,forEach()会修改原来的数组。而map()方法会得到一个新的数组并返回。
- ES6新特性
变量声明/模版字符串/箭头函数/函数参数默认值/扩展运算符/for...of for...in/class类
- 父子组件嵌套时生命周期的执行顺序
- 父组件:beforeCreate
- 父组件:created
- 父组件:beforeMount
- 子组件:beforeCreate
- 子组件:created
- 子组件:beforeMounte
- 子组件:mounted
h) 父组件:mounted
- 数据类型
- 基础数据类型/简单数据类型:Number/Boolean/String/Undefined/Null
b) 引用数据类型:Object
- ElementUI常用组件
由于样式比较统一,常用于后台管理系统,常用的有导航栏,按钮,提示框,小图标等等
- 深克隆/浅克隆
浅克隆:原始类型按值传递,对象类型按引用传递,与原对象共用一处内存,修改会使原对象也修改
深克隆:在内存中开辟一块新内存,将原对象中的所有值全部复制过去,与原对象完全脱离,修改新对象中的属性值不会影响原对象
- ES6有多少种操作数组的方法
forEach/map/filter/find/every/some/reduce
- Vue路由有几种方式,他们分别是什么
嵌套路由/动态路由/路由守卫/编程式导航
- 显式原型:每个函数function都有一个prototype,这个就是显式原型
隐式原型:每个实例对象都有一个__proto__,这个就是隐式原型
- vuex的使用
- store.js
- 获取:this.$store.state.属性名
c) 修改:this.$store.commit(“store函数名”)
- vue路由守卫
- 全局路由守卫:router.beforeEach(to,from,next)
- to:进入哪个路由
- from:从哪个路由离开
- 全局路由守卫:router.beforeEach(to,from,next)
iii. next:函数,决定是否展示你要看到的路由页面
- vue的两个核心:双向数据绑定/组件系统
- js垃圾回收机制说下你的理解?
原理
找到不再被使用的变量,然后释放其占用的内存,但这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定时间间隔周期性的执行
回收方式
a.标记清除
当变量进入环境时,将这个变量标记为“进入环境”;当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存
b.引入计数(低级浏览器)
当变量声明,第一次赋值时记为1,然后当这个变量值改变时,记录为0,将计数为0的回收
- VUE项目中苹果端和安卓端遇到的兼容性问题有哪些?
1. 日期格式问题. 这个问题应该是遇到最多的.也是最多被熟知的.safari不识别2018-08-08的日期格式.会显示NaN.
解决方式: 在处理日期之前转换为2018/08/08的格式.
2. 设置了input背景颜色在safari颜色异常显示的问题. 这是由于safari对于input有默认的渲染背景颜色.必须把input原生颜色清除.否则会造成颜色显示特别不纯正.
解决方式: 所有的input加上-webkit-appearance: none;属性.
3.safari不兼容select居中属性text-align-last.
解决方式:如果内容宽度固定: 这个如果你的select内的内容的宽度是固定的还好办.直接用空格或者padding就能解决.
- vue项目中怎么储存账号密码?
前端实现记住密码功能有两种方式:1.浏览器自带保存功能2.将登陆信息储存在cookie中
下面我们说一下第二种方法的实现思路:
1.在向后台提交登陆信息成功后,判断用户是否勾选记住密码,如果勾选,将账号,密码以及token(需要封装拦截器)储存在cookie中,如果没勾选,向cookie中存入账号和密码字段为空
2.密码需要加密,目前加密方式有很多种sha1,base64和md5等
3.npm安装base64依赖:
在页面加载时从cookie中获取登录信息,判断是否存在,如果存在,需要先将密码解密,将其赋值给登录表单,并将记住密码选择框勾选
- js中实现继承的方式
原型连继承/构造继承/拷贝继承/组合继承