整理所有看过的文章的面试题+各种百度每一道题的答案,希望可以有效的帮助别人
本章博客,梳理所有基础的css,js,html,jquery,vue等题,包含面试题,可供参考学习,也督促自我学习
渐进增强:在网页开发中,先对低版本的浏览器进行css样式处理,构建页面,满足最基本的功能,在对高级浏览器进行效果,交互。写法如下:
优雅降级:在网页开发中,先对高版本的浏览器进行css样式处理,构建页面,完善功能,在对低版本浏览器进行测试修复,完成基本功能。写法如下:
问题一:标签最低高度设置min-height不兼容
问题二:H5新标签在IE9以下的浏览器不识别
问题三:被点击过的超链接不再具有hover和active属性
文件合并
文件压缩
使用cdn托管资源
gizp压缩你的js和css文件
使用缓存
meta标签优化(title,description,keywords)、heading标签的优化(h1-h6)、alt优化
反向链接,网站外链接优化
(1)内核
(2)渲染引擎
加载顺序
回流reflow
如果渲染树的结点发生了结构性变化,例如:宽高或者位置等,那么会触发回流reflow的逻辑。
重绘repaint
如果渲染树的结点发生了非结构性的变化,例如:背景色等,会触发repaint重绘的逻辑。
定义
关系
优缺点
http
http是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从www服务器传输超文本到本地浏览器的传输协议,它可是使浏览器更加高效,使网络传输减少。
https
https是以安全为目标的http通道,简单讲是http的安全版,是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议
OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP是先有协议和应用在提出了模型,参照OSI模型
时间复杂度: 指执行算法所需要的计算工作量,也就是语句执行次数
1.用常数1代替运行实践中的所有加法常数
2.修改后的运行次数函数中,只保留最高阶级
3.去除最高阶项的系数
for: O(n) for+for: O(n^2) while: O(logn)
冒泡排序
每次将相邻的两个元素进行比较,将较小的元素放到前面
快速排序
快速排序是冒泡排序的一种改进,第一趟排序时将数据分成两个部分,一个部分比另一个部分的所有数据都要小,然后递归调用,在两边都实现快速排序
插入排序
从第一个元素开始,该元素可以认为已经被排序,取出下一个元素,在已经排序的元素序列中从后向前扫描,如果该元素大于新元素,将该元素移到下一个位置,知道找到已排序的元素小雨或者等于新元素的位置,将新元素插入到下一个位置中,继续扫描
选择排序
在要排序的一组数中,选出最小的一个数与第一个数的位置交换,然后在剩下的数中再找最小的与第2的交换,知道由小到大排序为止
希尔排序
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法终止
归并排序
归并排序是一种稳定的排序方法,将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有序
堆排序
堆排序可以把每一趟元素的比较结果保存下来,以便我们在选择最小/大元素时对已经比较过的元素做出相应调整。
1.将长度为n的待排序的数组进行有序化构造成一个大顶堆
2.将根结点与尾节点交换并输出此时的尾节点
3.将剩余的n-1个节点重新进行堆有序化
4.重复步骤2, 步骤3直至构造成一个有序列表
TCP三次握手
TCP四次握手(挥手)
为什么建立协议是三次握手,关闭连接却是四次握手?
dns: 域名解析,将url地址的域名解析成ip地址
dns prefetch是一种dns预解析技术,当浏览网页时,浏览器会在加载网页时对网页中的域名进行解析缓存,这样在单击当前网页中的连接时就无需进行dns的解析,减少用户等待时间,提高用户体验
设置dns-prefetch
localStorage和sessionStorage的区别
主要区别sessionStorage与localStorage的生命周期不一样。都属于web Storage存在客户端
cookie和session
cookie和session都是用来跟踪浏览器用户身份的会话方式
区别
(1)保持状态:
cookie保存在浏览器端,session保存在服务器端
(2)使用方式:
一、 cookie机制:如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种cookie简称会话cookie,如果在浏览器中设置了cookie的过期时间,cookir被保存在硬盘中,关闭浏览器后,cookie数据仍在,知道过期时间结束才消失
二、session机制:服务器收到请求需要创建session对象时,首先会检查客户端请求中是否包含sessionid。如果有sessionid,服务器将根据该id返回对应session对象。如果客户端请求中没有sessionid,服务器会创建新的session对象,并把sessionid在本次响应中返回给客户端。通常使用cookie方式存储sessionid到客户端,在交互中浏览器按照规则将sessionid发送给服务器。如果用户禁用cookie,则要使用URL重写,可以通过response.encodeURL(url) 进行实现;API对encodeURL的结束为,当浏览器支持cookie时,url不做任何处理;当浏览器不支持cookie的时候,将会重写URL将SessionID拼接到访问地址后。
四者对比
HTML的输入框可以拥有自动完成的功能,当你往输入框输入内容的时候,浏览器会从你以前的同名输入框的历史记录中查找出类似的内容并列在输入框下面,这样就不用全部输入进去了,直接选择列表中的项目就可以了。但有时候我们希望关闭输入框的自动完成功能,例如当用户输入内容的时候,我们希望使用AJAX技术从数据库搜索并列举而不是在用户的历史记录中搜索。
方法:
title属性没有明确意义,只表示标题;
h1表示层次明确的标题,对页面信息的抓取也有很大的影响
strong标明重点内容,语气加强含义;
b是无意义的视觉表示
em表示强调文本;i是斜体,是无意义的视觉表示
视觉样式标签:b i u s
语义样式标签:strong em ins del code
在alt和title同时设置的时候,alt作为图片的替代文字出现,title是图片的解释文字。
优点:
缺点:
在线情况下,浏览器发现HTML头部有manifest属性,它会请求manifest文件,如果是第一次访问,那么浏览器就会根据manifest文件的内容下载相应的资源,并进行离线存储。如果已经访问过并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面。然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不会做任何操作,如果文件改变了,那么就会重新下载文件中的资源,并且进行离线存储。例如,
在页面头部加入manifest属性
在cache.manifest文件中编写离线存储的资源
(1)去掉或丢失样式的时候能够让页面呈现出清晰的结构。
(2)有利于SEO和搜索引擎建立良好沟通,有助于爬虫抓取更多的信息,爬虫依赖于标签来确定上下文和各个关键字的权重。
(3)方便其它设备解析。
(4)便于团队开发和维护,语义化根据可读性。
(1)header: header标签定义页面的页眉信息。【主要用于定义结构,一般来说也可以使用其他方式来创建头部,但使用header就标注出了这个结构是头部,比其他多出了语意】
(2) nav: 定义导航链接。【主要用于定义结构,一般来说也可以使用其他方式来创建导航,但使用nav就标注出了这个结构是导航,比其他多出了语意】
(3)article: 定义一个独立的内容,article比p,比div多了语意,虽然理论上都可以使用div来实现,但多出了语意。【比如一本书可以一章可以有多个段落,但可以有几章,而article的语意就像章节,它的内容是独立的,而不是仅仅的“段落”】
(4)footer:用来定义页尾。【主要用于定义结构,一般来说也可以使用其他方式来创建页脚,但使用footer就标注出了这个结构是页脚,比其他多出了语意】
(5)session:功能:定义网页的中的“区块”【比p多出语意“区块”,而又比div少出样式之意,div更多的用来定义样式,而session可以用来做结构划分】【如果article是一篇文章的话,那么session可以某块围绕一个论点的文章内容】
(6)autio: 可以用来定义音乐。属性:src、controls、autoplay、loop...
(7)video定义一个视频。属性:src,controls,autoplay,loop,width...
(8)embed:embed标签用来定义插入的内容(媒体内容),比如可以插入swf
a. XHTML 元素必须被正确地嵌套。
b. XHTML 元素必须被关闭。
c. 标签名必须用小写字母。
d. XHTML 文档必须拥有根元素。
a. HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。
b. 拖拽释放(Drag and drop) API
c. 语义化更好的内容标签(header,nav,footer,aside,article,section),见11
d. 音频、视频API(audio,video)
e. 画布(Canvas) API
f. 地理(Geolocation) API
g. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失
h. sessionStorage 的数据在页面会话结束时会被清除
i. 表单控件,calendar、date、time、email、url、search
j. 新的技术webworker, websocket等
a. 纯表现的元素:basefont,big,center, s,strike,tt,u;
b. 对可用性产生负面影响的元素:frame,frameset,noframes;
因为浏览器页面渲染的时候是从上至下的,而table 和 iframe 这两种元素会改变这样渲染规则,他们是要等待自己元素内的内容加载完才整体渲染。用户体验会很不友好。
用来控制元素的盒子模型解析模式,默认为content-box
不同浏览器下的margin和padding不一样
Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示
添加额外标签,例如
使用br标签和其自身的html属性,例如
父元素设置 overflow:hidden;在IE6中还需要触发hasLayout,例如zoom:1;
父元素设置 overflow:auto 属性;同样IE6需要触发hasLayout
父元素也设置浮动
父元素设置display:table
使用:after 伪元素;由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。
原理:当样式表晚于结构性html加载,当加载到此样式表时,页面将停止之前的渲染。此样式表被下载和解析后,将重新渲染页面,也就出现了短暂的花屏现象。
解决方法:使用link标签将样式表放在文档HEAD中。
Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
flex-direction属性决定主轴的方向(即项目的排列方向)。
flex-wrap属性: 默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行。
justify-content属性定义了项目在主轴上的对齐方式。
align-items属性定义项目在交叉轴上如何对齐。
align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
(1)less和sass在语法上有些共性:(8个)
js表达式:在css样式中使用js表达式赋值(在less或者sass文件中可以使用js的表达式,用来赋值)
(2)less和sass之间的区别:
很多开发者不选择less是因为less输出修改过的css到浏览器需要依赖于js引擎,而js引擎需要额外的时间来处理代码。关于这个有很多种方式,我选择的是只在开发环节使用less。一旦开发完成,我就复制粘贴less输出到一个压缩器,然后到一个单独的css文件来替代less文件。另一种方式是使用less app来编译和压缩你的less文件。两种方式都将是最小化你的样式输出,从而避免由于用户的浏览器不支持js而可能引起的任何问题。
string,boolean,number,undefined,function,object
强制(parseInt,parseFloat,number)
隐式(== ===)
前者是将字符串切割成数组的形式,后者是将数组转换成字符串
push()尾部添加
pop()尾部删除
unshift()头部添加
shift()头部删除
1)创建新节点
2)添加、移除、替换、插入
3)查找
前者会自动转换类型,再判断是否相等
后者不会自动类型转换,直接去比较
在Javscript中,解析器在向执行环境中加载数据时,对函数声明和函数表达式并非是一视同仁的,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析执行。
全局变量:当前页面内有效
局部变量:函数方法内有效
null是一个表示"无"的对象,转为数值时为0;
undefined是一个表示"无"的原始值,转为数值时为NaN。
当声明的变量还未被初始化时,变量的默认值为undefined。
null用来表示尚未存在的对象
1)变量被声明了,但没有赋值时,就等于undefined。
2)调用函数时,应该提供的参数没有提供,该参数等于undefined。
3)对象没有赋值的属性,该属性的值为undefined。
4)函数没有返回值时,默认返回undefined。
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
使用prototype原型来实现。
主要数据类型:string, boolean, number
复合数据类型:function, object
特殊类型:undefined,null
(1)创建对象
(2)打开请求
(3)发送请求
(4)接收响应
(1)JSON 是一种轻量级的数据交换格式。
(2)JSON 独立于语言和平台,JSON 解析器和 JSON 库支持许多不同的编程语言。
(3)JSON的语法表示三种类型值,简单值(字符串,数值,布尔值,null),数组,对象
alert
/confirm/i
prompt
(1)innerXXX(不兼容ie)
(2)document.documentElement.clientXXX(兼容ie)
可视区域距离页面顶部的距离
(1)元素节点:nodeType ===1;
(2)文本节点:nodeType ===3;
(3)属性节点:nodeType ===2;
(1)offsetWidth (content宽度+padding宽度+border宽度)
(2)offsetHeight(content高度+padding高度+border高度)
(3)clientWidth(content宽度+padding宽度)
(4)clientHeight(content高度+padding高度)
(1)希望一个变量长期驻扎在内存当中(不被垃圾回收机制回收)
(2)避免全局变量的污染
(3)私有成员的存在
(4)安全性提高
内容使用特定标签,通过标签就能大概了解整体页面的布局分布
确保用户在不同地区能用最快的速度打开网站,其中某个域名崩溃用户也能通过其他郁闷访问网站
1、压缩css、js文件
2、合并js、css文件,减少http请求
3、外部js、css文件放在最底下
4、减少dom操作,尽可能用变量替代不必要的dom操作
事件委托原理:事件冒泡机制
1.可以大量节省内存占用,减少事件注册。比如ul上代理所有li的click事件就很不错。
2.可以实现当新增子对象时,无需再对其进行事件绑定,对于动态内容部分尤为合适
事件代理的常用应用应该仅限于上述需求,如果把所有事件都用事件代理,可能会出现事件误判。即本不该被触发的事件被绑定上了事件.
作用
1、减少延迟,让你的网站更快,提高用户体验。
2、避免网络拥塞,减少请求量,减少输出带宽。
Cache-Control中的max-age是实现内容cache的主要手段,共有3种常用策略:max-age和Last-Modified(If-Modified-Since)的组合、仅max-age、max-age和ETag的组合。
对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。
对于比较缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。
1.基本数据类型(自身不可拆分的):Undefined、Null、Boolean、Number、String
2.引用数据类型(对象):Object (Array,Date,RegExp,Function)
1.行内样式 1000
2.id 0100
3.类选择器、伪类选择器、属性选择器[type="text"] 0010
4.标签选择器、伪元素选择器(::first-line) 0001
5.通配符*、子选择器、相邻选择器 0000
1)dom节点的根节点是不是body
回答: 不是,dom节点的根节点是html(包含head和body,head中分为meta、title等。body又分为一组)
2)dom元素都会有offsetParent吗
回答: offsetParent属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素。 如果这个容器元素未进行CSS定位, 则offsetParent属性的取值为根元素(在标准兼容模式下为html元素;在怪异呈现模式下为body元素)的引用。 当容器元素的style.display 被设置为 "none"时(译注:IE和Opera除外),offsetParent属性 返回 null。
3)[1,3,5]转译成字符串是什么
回答: '1,3,5'
调用toString方法,生成该字符串
4)li标签的祖级元素可以为li,父级元素也可以为例
回答: 错误
页面加载-->创建window全局对象,并生成全局作用域-->然后生成执行上下文,预解析变量(变量提升),生成全局变量对象;
Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。类似长轮循长连接 ; 发送一次请求 ; 源源不断的得到信息
攻击方法:
手动攻击:
自动攻击
1. 将cookie等敏感信息设置为httponly,禁止Javascript通过document.cookie获得2. 对所有的输入做严格的校验尤其是在服务器端,过滤掉任何不合法的输入,比如手机号必须是数字,通常可以采用正则表达式
3. 净化和过滤掉不必要的html标签,比如:<iframe>, alt,<script> 等
4. 净化和过滤掉不必要的Javascript的事件标签,比如:onclick, onfocus等
5. 转义单引号,双引号,尖括号等特殊字符,可以采用htmlencode编码 或者过滤掉这些特殊字符
6. 设置浏览器的安全设置来防范典型的XSS注入
2.SQL注入
攻击方法:
2. 减少不必要的数据库抛出的错误信息
3. 对数据库的操作赋予严格的权限控制
4. 净化和过滤掉不必要的SQL保留字,比如:where, or, exec 等
5. 转义单引号,上引号,尖括号等特殊字符,可以采用htmlencode编码 或者过滤掉这些特殊字
3.CSRF,也就是跨站请求伪造
防范方法:
1. 在客户端进行cookie的hashing,并在服务端进行hash认证
2. 提交请求是需要填写验证码
3. 使用One-Time Tokens为不同的表单创建不同的伪随机值
可以通过设置domin来实现
部分渲染树(或者整个渲染树)需要重新分析并且节点尺寸需要重新计算。这被称为重排。注意这里至少会有一次重排-初始化页面布局。
由于节点的几何属性发生改变或者由于样式发生改变,例如改变元素背景色时,屏幕上的部分内容需要更新。这样的更新被称为重绘。
添加、删除、更新 DOM 节点
通过 display: none 隐藏一个 DOM 节点-触发重排和重绘
通过 visibility: hidden 隐藏一个 DOM 节点-只触发重绘,因为没有几何变化
移动或者给页面中的 DOM 节点添加动画
添加一个样式表,调整样式属性
用户行为,例如调整窗口大小,改变字号,或者滚动。
proto是指内部原型,和Object.getPrototypeOf()结果等价
function f(){}
f.proto === Object.getPrototypeOf(f); //true
f.prototype === Object.getPrototypeOf(f); //false
HTML5带来的新协议,通过类似HTTP的请求建立连接。主要目的是可以获取服务端的推送。
原来的方式可能是使用long poll(即不中断连接一直等待数据),或者是ajax轮询的方式(每隔一段时间发送请求,建立连接,询问是否有新的数据)。这两种方式的缺点在于long poll的阻塞,以及ajax轮询的冗余连接。
WebSocket的设计思想有点类似于回调,在发送请求升级服务端的协议并收到确认信息后,服务端一有新的信息/数据就会主动推送给客户端,至于要一次HTTP握手便可以建立持久连接
相同点
都是循环遍历数组中的每一项
forEach和map方法里每次执行匿名函数都支持3个参数,参数分别是item(当前每一项)、index(索引值)、arr(原数组)
匿名函数中的this都是指向window
只能遍历数组
都有兼容问题
不同点
map速度比foreach快
map会返回一个新数组,不对原数组产生影响,foreach不会产生新数组,
map因为返回数组所以可以链式操作,foreach不能
但又不能将所有的script放在body之后,因为有一些页面的效果的实现,是需要预先动态的加载一些js脚本。所以这些脚本应该放在<body>之前。
script放置位置的原则“页面效果实现类的js应该放在body之前,动作,交互,事件驱动,需要访问dom属性的js都可以放在body之后
概念:
(1)call()、apply()可以看作是某个对象的方法,通过调用方法的形式来间接调用函数,简单来说就是让函数在某个指定的对象下执行。
(2)bind()就是将某个函数绑定到某个对象上。
(3)三个方法的作用都是改变函数的执行上下文。
区别:
(1)call和apply的第一个参数相同,就是指定的对象。这个对象就是该函数的执行上下文。他们的区别在于参数不同,call第一个参数之后的其他所有参数就是传入该函数的值,以逗号分隔;apply只有两个参数,第二个是数组,这个数组就是该函数的参数。
(2)bind和两者的区别在于bind方法会返回执行上下文被改变的函数而不会立即执行,前两者是直接执行该函数。bind的参数和call相同。
所有任务都可以分成两种,一种是同步任务(syn),另一种是异步任务(asyn)。同步任务指的是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程,而进入‘任务队列’的任务,只有‘任务对列’通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
运行机制如下:
(1)、构造函数、原型、实例的关系
构造函数都有一个proptotype属性;
原型对象prototype里面有一个constructor属性,该属性指向原型对象所属的构造函数;
实例对象都有一个proto属性,该属性也指向构造函数的原型对象,他是一个非标准属性,不可以用于编程,是浏览器自己使用的。
(2)prototype和proto关系
prototype是构造函数的属性,proto是实例对象的属性。这两者都指向同一个对象。
(3)原型链属性搜索(什么是原型链)?
在访问对象的某个成员的时候,会先从对象本身进行查找,如果对象中查找不到,那么就会去它的构造函数的原型对象中进行查找,如果没有找到,那么就会去它的原型对象的原型对象中查找,这样一层一层往上查找,直到object的原型对象的原型是null为止。
闭包的概念:
闭包就是能够读取其他函数内部变量的函数。在js中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解为‘定义在一个函数内部的函数’。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
闭包的用途:
(1)可以读取函数内部的变量
(2)让这些变量的值始终保持在内存中,因为这些变量始终被引用着,所以不会被垃圾回收机制回收
闭包的注意点:
(1)由于闭包使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页性能问题,在IE中可能导致内存泄漏。解决办法:在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部改变父函数内部变量的值。所以,如果你把父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时候要小心,不能随便改变父函数内部变量的值。
宿主对象是指DOM和BOM等由宿主框架通过某种机制注册到Javascript引擎中的对象。原生对象是Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、Math等ECMAscript官方定义的对象。
第一个是定义了一个函数Person
第二个是把Person当普通函数执行,并把返回值赋值给person。
第三个是当做构造函数,通过new关键字创建一个实例对象,赋值给person
Function原型上定义的方法,所有函数都可以访问使用。主要应用场景在绑定函数执行的this,并返回一个新函数,可以在我们要调用的时候才执行。原理是函数的预处理思想,把this当做参数预置。
特性检测更适合针对实现了特定特性的浏览器进行操作。UA字符串由于被浏览器厂商可以随意修改因此不太靠谱。
无刷新在页面与服务器通信,更新页面,用户体验好。
异步与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。
前端和后端负载平衡。
界面与应用分离
Ajax使WEB中的界面与应用分离(也可以说是数据与呈现分离),有利于分工合作、减少非技术人员对页面的修改造成的WEB应用程序错误、提高效率、也更加适用于现在的发布系统。
基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
AJAX干掉了Back和History功能,即对浏览器机制的破坏。
AJAX的安全问题
Ajax技术就如同对企业数据建立了一个直接通道,这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。Ajax也难以避免一些已知的安全弱点,诸如跨站点脚步攻击、SQL注入攻击和基于Credentials的安全漏洞等等
对搜索引擎支持较弱。
客户端过肥,太多客户端代码造成开发上的成本。
违背URL和资源定位的初衷,采用了Ajax技术,也许你在该URL地址下面看到的和我在这个URL地址下看到的内容是不同的。
作用域内所有变量声明都被提到顶部,被提升的变量初始值为undefined,执行到所在行时才真正赋值。
FOUC(Flash Of Unstyled Content)–文档样式闪烁
而引用CSS文件的@import就是造成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM,然后再去导入外部的CSS文件,因此,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。解决方法简单的出奇,只要在之间加入一个或者<script>元素就可以了。
router 是 hash 改变
location.href 是页面跳转,刷新页面
(1)生命周期
2.0生命周期变得更加语义化了,增加了beforeUpdate、updated等,删除了attached、detached。
(2)过滤器
2.0将1.0所有自带的过滤器都删除了,我们需要自己定义过滤器:
如果想展示JSON数据,不需要调用过滤器了,框架会自动帮我们解析出来;
2.0过滤器的传参方式不是以前的方式,是以函数传参的方式:
(3)循环
在Vue2.0中丢弃了key,将track-by替换成key属性,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素。
(4)片段代码
在编写template的时候,2.0必须要用一个根元素(如div)将代码片段包裹起来,否则报错。1.0则不需要。
(5)el属性绑定的元素,限制为一个普通的元素,不能再绑定再body、html元素上。
(6)v-model增加了.trim、.number等后缀修饰符