出来面试了许多家公司,遇到的面试题来看,也是彻底不一样,对于一个初学者来讲,作多少项目都是虚的,毕竟没有扎实的功底,javascript
你说项目是你作的,人家一问就漏底不是,因此在这里总结一些本身遇到过的基础的面试题,从题目来看,php
主要分为概念题,css和js的题目,在这里就先从概念题开始吧。固然只是本人总结,仅供你们参考,若是有错误和不足,但愿你们指出。css
Typeof的返回值类型html
返回值类型有:Number/Boolean/undefined/function/string/object
Display的属性block 、inline、block-inline的区别前端
block元素的特色是:
老是在新行上开始;
高度,行高以及顶和底边距均可控制;
宽度缺省是它的容器的100%,除非设定一个宽度
<div>, <p>, <h1>, <form>, <ul> 和 <li>是块元素的例子。vue
display:inline就是将元素显示为行内元素.html5
inline元素的特色是:
和其余元素都在一行上;
高,行高及顶和底边距不可改变;
宽度就是它的文字或图片的宽度,不可改变。
<span>, <a>, <label>, <input>, <img>, <strong> 和<em>是inline元素的例子。java
inline和block能够控制一个元素的行宽高等特性,须要切换的状况以下:node
让一个inline元素重新行开始;
让块元素和其余元素保持在一行上;
控制inline元素的宽度(对导航条特别有用);
控制inline元素的高度;
无须设定宽度便可为一个块元素设定与文字同宽的背景色。react
display:inline-block将对象呈递为内联对象,可是对象的内容做为块对象呈递。旁边的内联对象会被呈递在同一行内,容许空格。
CSS 选择符有哪些?哪些属性能够继承?优先级算法如何计算? CSS3新增伪类有那些?
1.id选择器(
# myid)
2.类选择器(.myclassname)
3.标签选择器(div, h1, p)
4.相邻选择器(h1 + p)
5.子选择器(ul > li)
6.后代选择器(li a)
7.通配符选择器( * )
8.属性选择器(a[rel = "external"])
9.伪类选择器(a: hover, li:nth-child)
优先级为:
!important > id > class > tag
important 比 内联优先级高,但内联比 id 要高
CSS3新增伪类举例:
p:first-of-type 选择属于其父元素的首个 <p> 元素的每一个 <p> 元素。
p:last-of-type 选择属于其父元素的最后 <p> 元素的每一个 <p> 元素。
p:only-of-type 选择属于其父元素惟一的 <p> 元素的每一个 <p> 元素。
p:only-child 选择属于其父元素的惟一子元素的每一个 <p> 元素。
p:nth-child(2) 选择属于其父元素的第二个子元素的每一个 <p> 元素。
:enabled :disabled 控制表单控件的禁用状态。
:checked 单选框或复选框被选中。
CSS3有哪些新特性?
CSS3实现圆角(border-radius),阴影(box-shadow),
对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)
transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜
增长了更多的CSS选择器 多背景 rgba
在CSS3中惟一引入的伪元素是::selection.
媒体查询,多栏布局
border-image
position包含几种属性?absolute和relative的区别?(基础中的基础,必须吃透彻的前端基础)
static:默认状态、没有定位、正常流
inherit:从父元素集成position属性的值
fixed:生成绝对定位的元素(相对于浏览器窗口进行定位)
absolute:生成绝对定位的元素(相位与static定位之外的第一个父元素定位)
relative:生成相对定位的元素(相对于其正常位置定位)
absolute和relative区别:父元素的padding对relative的子元素布局有影响,absolute的子元素不受影响
前端性能优化
减小HTTP请求、使用内容发布网络、压缩组件、使用Expire头、JS放底部、CSS放顶部、避免CSS表达式等。
盒子模型
盒子模型包括四部分:内容(content)、填充(padding)、边框(border)、边界(margin)
盒子模型能够分为两种:IE盒子模型和W3C标准盒子模型
区别:二者对于width的计算方式不一样,前者width=border+padding+内容宽度,后者width=内容宽度。
一个页面从URL到加载显示完成,都发生了什么?
①经过DNS将该地址解析成IP地址;
②发起网络链接,进行http协议会话:客户端发送报头(请求报头),服务端回馈报头(响应报头)
③返回一个页面(根据页面上的外链的URL从新发送请求获取)
④接收文件完毕,对加载到的资源进行语法解析,以及相应的内部数据结构(网页渲染)
ajax 是什么?ajax 的交互模型?同步和异步的区别?如何解决跨域问题?
1. 经过异步模式,提高了用户体验
2. 优化了浏览器和服务器之间的传输,减小没必要要的数据往返,减小了带宽占用
3. Ajax在客户端运行,承担了一部分原本由服务器承担的工做,减小了大用户量下的服务器负载。
2. Ajax的最大的特色是什么。
Ajax能够实现动态不刷新(局部刷新)
readyState属性 状态 有5个可取值: 0=未初始化 ,1=启动 2=发送,3=接收,4=完成
ajax的缺点
一、ajax不支持浏览器back按钮。
二、安全问题 AJAX暴露了与服务器交互的细节。
三、对搜索引擎的支持比较弱。
四、破坏了程序的异常机制。
五、不容易调试。
跨域: jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面
ajax过程
(1)建立XMLHttpRequest对象,也就是建立一个异步调用对象.
(2)建立一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.
(3)设置响应HTTP请求状态变化的函数.
(4)发送HTTP请求.
(5)获取异步调用返回的数据.
(6)使用JavaScript和DOM实现局部刷新.
DOM操做——怎样添加、移除、移动、复制、建立和查找节点。
(1)建立新节点
createDocumentFragment() //建立一个DOM片断
createElement() //建立一个具体的元素
createTextNode() //建立一个文本节点
(2)添加、移除、替换、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子节点前插入一个新的子节点
(3)查找
getElementsByTagName() //经过标签名称
getElementsByName() //经过元素的Name属性的值(IE容错能力较强,会获得一个数组,其中包括id等于name值的)
getElementById() //经过元素Id,惟一性
行内元素有哪些?块级元素有哪些? 空(void)元素有那些?
行内元素:a、b、span、img、input、strong、select、label、em、button、textarea
块级元素:div、ul、li、dl、dt、dd、p、h1-h六、blockquote
空元素:即系没有内容的HTML元素,例如:br、meta、hr、link、input、img
html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?
* HTML5 如今已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增长。
* 拖拽释放(Drag and drop) API
语义化更好的内容标签(header,nav,footer,aside,article,section)
音频、视频API(audio,video)
画布(Canvas) API
地理(Geolocation) API
本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
sessionStorage 的数据在浏览器关闭后自动删除
表单控件,calendar、date、time、email、url、search
新的技术webworker, websocket, Geolocation
* 移除的元素
纯表现的元素:basefont,big,center,font, s,strike,tt,u;
对可用性产生负面影响的元素:frame,frameset,noframes;
支持HTML5新标签:
* IE8/IE7/IE6支持经过document.createElement方法产生的标签,
能够利用这一特性让这些浏览器支持HTML5新标签,
浏览器支持新标签后,还须要添加标签默认的样式:
* 固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
如何区分: DOCTYPE声明\新增的结构元素\功能元素
JSONP是什么?它是如何实现跨域的?为何它能够实现跨域?
JSONP(JSON with Padding)是一个非官方的协议,它容许在服务器端集成Script tags返回至客户端,经过javascript callback的形式实现跨域访问。
因为同源策略的限制,XmlHttpRequest只容许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,能够经过script标签实现跨域请求
(由于同源策略不阻止动态脚本插入,而且将脚本看做是从提供 Web 页面的域上加载的),而后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。
Javascript中callee和caller的做用?
caller是返回一个对函数的引用,该函数调用了当前函数;
callee是返回正在被执行的function函数,也就是所指定的function对象的正文。
浏览器兼容问题
css兼容性问题:
①不一样浏览器的标签默认的外补丁和内补丁不一样,解决方案:用通配符*来设置各个标签的内外补丁是0(即设置margin和padding为0);
②div的垂直居中问题 vertical-align:middle;文字居中:将行距增长到和整个div同样,高line-height=行高;
③margin加倍问题:设置为float的div在ie下的margin会加倍。解决方案:为这个div设置样式:display:inline;
js兼容性问题:
①在标准的事件绑定中绑定事件的方法函数为addEventListener,而IE使用的是attachEvent;②事件处理中event属性的获取不一样。
标准浏览器是做为参数带入,而后经过e.target获取目标元素;而IE是经过window.event方式得到,经过e.srcElement获取目标元素;
JS和JAVA的做用域有什么区别
java是块级做用域,js是函数做用域,没有块级做用域。
var name="global";
if(true){
var name="local";
console.log(name)
}
console.log(name);
这段都输出是“local",若是有块级做用域,明显if语句将建立局部变量name,并不会修改全局name,但是没有这样,因此Js没有块级做用域。
闭包问题
闭包:函数能被外部调用到,则该做用连上的全部变量都会被保存下来。
做用:
一、能够读取函数内部的变量二、至关于划出了一块私有做用域,避免数据污染;三、让变量始终保存在内存中
闭包有三个特性:
1.函数嵌套函数
2.函数内部能够引用外部的参数和变量
3.参数和变量不会被垃圾回收机制回收
使用全局变量被认为是很差的习惯,并且容易形成错误而且维护成本较高,因此js能够采用闭包的方式读取函数的内部变量。
可是若是大量使用闭包就会形成过多的变量始终保存在内存中,会形成内存泄漏。
一个简单的闭包例子:
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
js中this的工做原理
② 全局范围内:指向全局对象: this;
②函数调用:指向全局对象: foo();
③ 方法调用:this指向test对象: test.foo();
④ 调用构造函数:this指向新建立的对象: new foo();
⑤显示的设置this:使用call或者apply方法时,this指向第一个参数
function foo(a, b, c) {}
var bar = {};
foo.apply(bar, [1, 2, 3]); // 数组将会被扩展,以下所示
foo.call(bar, 1, 2, 3); // 传递到foo的参数是:a = 1, b = 2, c = 3
简述一下src与href的区别
href 是指向网络资源所在位置,创建和当前元素(锚点)或当前文档(连接)之间的连接,用于超连接。
src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,
例如js脚本,img图片和frame等元素。当浏览器解析到该元素时,会暂停其余资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,
相似于将所指向资源嵌入当前标签内。这也是为何将js脚本放在底部而不是头部。
模块化编程
①AMD(异步模块定义) requirejs
defined(id,deps,factory)
require([dependency],function(){})
异步加载,浏览器不会失去响应
它指定的回调函数,只有前面的模块都加载完成后,才会运行,解决了依赖性问题
②CMD(通用模块定义) seajs
模块定义方式和模块加载时机处理不一样
defined(id,deps,factory)
function(require,exports,module)
module.exports = ______;
③区别:AMD依赖前置,在定义模块的时候就要声明其依赖的模块;CMD就近依赖,只有在用到哪一个模块的时候再去require;
JS继承与原型问题
Js全部的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型。每个对象都有原型,在浏览器中它体如今一个隐藏的 proto 属性上。
当一个对象须要调用某个方法时,它回去最近的原型上查找该方法,若是没有找到,它会再次往下继续查找。这样逐级查找,一直找到了要找的方法。 这些查找的原型构成了该对象的原型链条。原型最后指向的是null。咱们说的原型继承,就是将父对像的方法给子类的原型。子类的构造函数中不拥有这些方法和属性。
少用float?
①使用float可能会形成兼容性问题,好比在ie6如下,float元素margin加倍问题;②使用float以后会影响左右元素,有可能形成错位问题(float以后都要clear)
解决:可用display、position转化
无序连接(ul、li),设定li标签属性:display:inline
②div左右结构,好比在右侧要放一个more(更多)来显示更多信息的时候用到了float:right,能够用定位来作。给包裹more的div设定position:relative,而后more这个标签right:0便可。结构更为清晰一点。
解释下浮动和它的工做原理?清除浮动的技巧
浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。
1.使用空标签清除浮动。
这种方法是在全部浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增长了无心义标签。
2.使用overflow。
给包含浮动元素的父标签添加css属性 overflow:auto; zoom:1; zoom:1用于兼容IE6。
3.使用after伪对象清除浮动。
该方法只适用于非IE浏览器。具体写法可参照如下示例。使用中需注意如下几点。1、该方法中必须为须要清除浮动元素的伪对象中设置 height:0,不然该元素会比实际高出若干像素;
浮动元素引发的问题和解决办法?
浮动元素引发的问题:
(1)父元素的高度没法被撑开,影响与父元素同级的元素
(2)与浮动元素同级的非浮动元素(内联元素)会跟随其后
(3)若非第一个元素浮动,则该元素以前的元素也须要浮动,不然会影响页面显示的结构
解决方法: 使用 CSS 中的 clear:both ;属性来清除元素的浮动可解决二、3问题,对于问题1,添加以下样式,给父元素添加 clearfix 样式:
.clearfix:after{content: ".";display: block;height: 0;clear: both;visibility: hidden;}
.clearfix{display: inline-block;} /* for IE/Mac */
清除浮动的几种方法:
1,额外标签法,<div style="clear:both;"></div>(缺点:不过这个办法会增长额外的标签使HTML结构看起来不够简洁。)
2,使用after伪类
#parent:after{
content:".";
height:0;
visibility:hidden;
display:block;
clear:both;
}
3,浮动外部元素
4,设置`overflow`为`hidden`或者auto
px和em的区别
px和em都是长度单位,区别是,px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,而且em会继承父级元素的字体大小。
浏览器的默认字体高都是16px。因此未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em
队列、堆、栈的区别?
队列是先进先出:就像一条路,有一个入口和一个出口,先进去的就能够先出去。而栈就像一个箱子,后放的在上边,因此后进先出。堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对通常内存的访问没有区别。
栈(Stack)是操做系统在创建某个进程时或者线程为这个线程创建的存储区域。在编程中,例如C/C++中,全部的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就能够把栈中的内容销毁,因此速度最快。
堆(Heap)是应用程序在运行的时候请求操做系统分配给本身内存,通常是申请/给予的过程。因为从操做系统管理的内存分配因此在分配和销毁时都要占用时间,因此用堆的效率低的多!可是堆的好处是能够作的很大,C/C++对分配的Heap是不初始化的。
在Java中除了简单类型(int,char等)都是在堆中分配内存,这也是程序慢的一个主要缘由。可是跟C/C++不一样,Java中分配Heap内存是自动初始化的。在Java中全部的对象(包括int的wrapper Integer)都是在堆中分配的,可是这个对象的引用倒是在Stack中分配。也就是说在创建一个对象时从两个地方都分配内存,在Heap中分配的内存实际创建这个对象,而在Stack中分配的内存只是一个指向这个堆对象的指针(引用)而已。
什么是线程?进程和线程的关系是什么?
线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度实体。 在具备多线程机制的操做系统中,处理机调度的基本单位不是进程而是线程。一个进程能够有多个线程,并且至少有一个可执行线程。
打个比喻:进程比如工厂(计算机)里的车间,一个工厂里有多个车间(进程)在运转,每一个车间里有一个或多个工人(线程)在协同工做,这些工人就能够理解为线程。
线程和进程的关系:
1.线程是进程的一个组成部分.
2.进程的多个线程都在进程地址空间活动.
3.系统资源是分配给进程的,线程须要资源时,系统从进程的资源里分配给线程.
4.处理机调度的基本单位是线程.
CSS3中的transform属性和transition属性?
transform:
功能:使元素变形的属性,其配合rotate(旋转角度)、scale(缩放倍数)、skew(扭曲元素)等参数一块儿使用
语法:
transform:rotate(旋转角度);//正数为顺时针、负数为逆时针;
transform:scale(缩放倍数);
transition:skew(扭曲);
功能:设置元素由样式一变为样式二所须要的一些变化效果
语法:transition: property duration timing-function delay ;
值 |
描述 |
transition-property |
规定设置过渡效果的 CSS 属性的名称。 |
transition-duration |
规定完成过渡效果须要多少秒或毫秒。 |
transition-timing-function |
规定速度效果的速度曲线。 |
transition-delay |
定义过渡效果什么时候开始。 |
注:使用这两个属性时应考虑到浏览器的兼容性,因此要针对不一样的浏览器都添加一次样式,以下:
-webkit-transform:rotate(0deg) scale(1.20);
-moz-transform:rotate(0deg) scale(1.20);
transform:rotate(0deg) scale(1.20);
什么是MVVM框架?
MVVM是Model-View-ViewModel的简写。
MVVM 是 Web 前端一种很是流行的开发模式,利用 MVVM 能够使咱们的代码更专一于处理业务逻辑而不是去关心 DOM 操做。目前著名的 MVVM 框架有 vue, avalon, angular 等,这些框架各有千秋,可是实现的思想大体上是相同的:数据绑定 + 视图刷新。跟MVC同样,主要目的是分离视图(View)和模型(Model)。View能够独立于Model变化和修改,一个ViewModel能够绑定到不一样的"View"上,当View变化的时候Model能够不变,当Model变化的时候View也能够不变。
在MVVM中,数据是核心,因为VIewModel与View之间的双向绑定,操做了ViewModel中的数据(固然只能是监控属性),就会同步到DOM,咱们透过DOM事件监控用户对DOM的改动,也会同步到ViewModel。
<div id="mobile-list">
<h1 v-text="title"></h1>
<ul>
<li v-for="item in brands">
<b v-text="item.name"></b>
<span v-show="showRank">Rank: {{item.rank}}</span>
</li>
</ul>
</div>
var element = document.querySelector('#mobile-list');
var vm = new MVVM(element, {
'title' : 'Mobile List',
'showRank': true,
'brands' : [
{'name': 'Apple', 'rank': 1},
{'name': 'Galaxy', 'rank': 2},
{'name': 'OPPO', 'rank': 3}
]
});
vm.set('title', 'Top 3 Mobile Rank List'); // => <h1>Top 3 Mobile Rank List</h1>
以上这段如此简洁的代码,就是MVVM框架的一个简单的实现效果。在HTML代码里面,可能会嵌入不少自定义的属性(标记),以此来实现数据的绑定,并且还能够进行一些简单的逻辑处理,好比if和循环等。
react应该也算是MVVM框架,可是与传统的MVVN框架不一样的是,react默认数据绑定方式是单向绑定,而vue及angular都是双向绑定;react使用虚拟DOM配合JSX,而vue及angular直接将数据经过属性绑定在真实DOM上的。
MVVM框架的优势:
一、方便测试
在MVC下,Controller基本是没法测试的,里面混杂了个各类逻辑,并且分散在不一样的地方。有了MVVM咱们就能够测试里面的viewModel,来验证咱们的处理结果对不对。
二、便于代码的移植
能够把一些视图逻辑放在一个ViewModel里面,让不少view重用这段视图逻辑。好比iOS里面有iPhone版本和iPad版本,除了交互展现不同外,业务逻辑的model是一致的。这样,咱们就能够以很小的代价去开发另外一个app。
三、独立开发
开发人员能够专一于业务逻辑和数据的开发(ViewModel),设计人员能够专一于页面设计,使用Expression Blend能够很容易设计界面并生成xml代码。
利用@media screen实现网页布局的自适应。
判断媒体类型,执行不一样的css样式属性
重要属性:min-width:设置最小分辨率大小;max-width:设置最大分辨率大小。
①方式一:经过css
///1280分辨率以上(大于1200px)
@media screen and (min-width:1200px){
#content{ width: 1100px; }
#mian,.div1{width: 730px;}
#secondary{width:310px;}
}
//1100分辨率(大于960px,小于1199px)
@media screen and (min-width: 960px) and (max-width: 1199px) {
#content{ width: 960px; }
#main,.div1{width: 650px;}
#secondary{width:250px}
}
②方式二:经过link引入不一样的css文件
//意思是当屏幕的宽度大于600小于800时,应用styleB.css
<link rel="stylesheet" type="text/css" href="styleB.css" media="screen and (min-width: 600px) and (max-width: 800px)">
优势:无需插件和手机主题,对移动设备友好,可以适应各类窗口大小。只需在CSS中添加@media screen属性,根据浏览器宽度判断并输出不一样的长宽值。
异步加载和延迟加载
1.异步加载的方案: 动态插入script标签
2.经过ajax去获取js代码,而后经过eval执行
3.script标签上添加defer或者async属性
4.建立并插入iframe,让它异步执行js
5.延迟加载:有些 js 代码并非页面初始化的时候就马上须要的,而稍后的某些状况才须要的。
前端安全方面有没有了解?XSS和CSRF如何攻防?
XSS(Cross Site Scripting)是跨站脚本攻击,为了区分CSS,因此缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
在网页的一些公共区域(例如,建议提交表单或消息公共板的输入表单)输入一些文本,这些文本被其它用户看到,但这些文本不只仅是他们要输入的文本,同时还包括一些能够在客户端执行的脚本。如:
"/> <script>alert(document.cookie);</script><!--
在文本框中输入以上代码,而后点击提交,就会把用户的cookie弹出来。
XSS漏洞修复
1.将重要的cookies标记为HTTP ONLY。
2.只容许用户输入咱们指望的数据。如年龄框只能输入数字。
3.对数据进行HTTP Encode处理。
4.过滤或者移除特殊的HTML标签。
5.过滤JS事件的标签。
CSRF(Cross-site request forgery)是跨站请求伪造。XSS利用站点内的信任用户,而CSRF则经过假装来自受信任用户的请求来利用受信任的网站。其实就是攻击者盗用了你的身份,以你的名义发送恶意请求。
CSRF攻击的思想
用户浏览并登录信任网站A;经过验证,在用户处产生X的cookie;用户在没有登出X的时候,浏览危险网站B;B要求访问第三方网站A,发出一个请求;根据这个请求,浏览器使用刚才产生的cookie直接访问A。
一个简单的实例
银行网站A,它以GET请求来完成银行转帐的操做,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危险网站B,它里面有一段HTML的代码以下:
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
首先,你登陆了银行网站A,而后访问危险网站B,噢,这时你会发现你的银行帐户少了1000块......
CSRF的防护
1.在表单里增长Hash值,以认证这确实是用户发送的请求,而后在服务器端进行Hash值验证。
2.验证码:每次的用户提交都须要用户在表单中填写一个图片上的随机字符串。
XSS原理及防范
Xss(cross-site scripting) 攻击指的是攻击者往Web页面里插入恶意 html 标签或者 javascript 代码。好比:攻击者在论坛中放一个 看似安全的连接,骗取用户点击后,窃取cookie中的用户私密信息;或者攻击者在论坛中加一个恶意表单, 当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户本来觉得的信任站点。
XSS防范方法
1.代码里对用户输入的地方和变量都须要仔细检查长度和对 ”<”,”>”,”;”,”’” 等字符作过滤;其次任何内容写到页面以前都必须加以 encode ,避免不当心把 html tag 弄出来。这一个层面作好,至少能够堵住超过一半的 XSS 攻击。
2.避免直接在 cookie 中泄露用户隐私,例如 email 、密码等等。 3.经过使cookie 和系统ip 绑定来下降 cookie 泄露后的危险。这样攻击者获得的cookie 没有实际价值,不可能拿来重放。
4.尽可能采用POST 而非GET 提交表单
XSS与CSRF有什么区别吗?
XSS 是获取信息,不须要提早知道其余用户页面的代码和数据包。 CSRF 是代替用户完成指定的动做,须要知道其余用户页面的代码和数据包。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
1.登陆受信任网站A,并在本地生成Cookie。 2.在不登出A的状况下,访问危险网站B。
请你谈谈Cookie的弊端
cookie 虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但仍是有不少局限性的。 第一:每一个特定的域名下最多生成20个 cookie
1.IE6或更低版本最多20个cookie
2.IE7和以后的版本最后能够有50个cookie。
3.Firefox最多50个cookie
4.chrome和Safari没有作硬性限制
IE 和 Opera 会清理近期最少使用的 cookie , Firefox 会随机清理 cookie 。
cookie 的最大大约为 4096 字节,为了兼容性,通常不能超过 4095 字节。
IE 提供了一种存储能够持久化用户数据,叫作 userdata ,从 IE5.0 就开始支持。每一个数据最多128K,每一个域名下最多1M。这个持久化数据放在缓存中,若是缓存没有清理,那么会一直存在。
优势:极高的扩展性和可用性
1.经过良好的编程,控制保存在cookie中的session对象的大小。
2.经过加密和安全传输技术(SSL),减小cookie被破解的可能性。
3.只在cookie中存放不敏感数据,即便被盗也不会有重大损失。
4.控制cookie的生命期,使之不会永远有效。偷盗者极可能拿到一个过时的cookie。
缺点:
1.`Cookie`数量和长度的限制。每一个domain最多只能有20条cookie,每一个cookie长度不能超过4KB,不然会被截掉。
2.安全性问题。若是cookie被人拦截了,那人就能够取得全部的session信息。即便加密也与事无补,由于拦截者并不须要知道cookie的意义,他只要原样转发cookie就能够达到目的了。
3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,咱们须要在服务器端保存一个计数器。若是咱们把这个计数器保存在客户端,那么它起不到任何做用。
浏览器本地存储
在较高版本的浏览器中, js 提供了 sessionStorage 和 globalStorage 。在 HTML5 中提供了 localStorage 来取代 globalStorage 。
html5 中的 Web Storage 包括了两种存储方式: sessionStorage 和 localStorage 。
sessionStorage 用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问而且当会话结束后数据也随之销毁。所以 sessionStorage 不是一种持久化的本地存储,仅仅是会话级别的存储。
而 localStorage 用于持久化的本地存储,除非主动删除数据,不然数据是永远不会过时的。
web storage和cookie的区别
Web Storage 的概念和 cookie 类似,区别是它是为了更大容量存储设计的。 Cookie 的大小是受限的,而且每次你请求一个新的页面的时候 Cookie 都会被发送过去,这样无形中浪费了带宽,另外 cookie 还须要指定做用域,不能够跨域调用。
除此以外, Web Storage 拥有 setItem,getItem,removeItem,clear 等方法,不像 cookie 须要前端开发者本身封装 setCookie,getCookie 。
可是 cookie 也是不能够或缺的: cookie 的做用是与服务器进行交互,做为 HTTP 规范的一部分而存在 ,而 Web Storage 仅仅是为了在本地“存储”数据而生
浏览器的支持除了 IE7 及如下不支持外,其余标准浏览器都彻底支持(ie及FF需在web服务器里运行),值得一提的是IE老是办好事,例如IE七、IE6中的 userData 其实就是 javascript 本地存储的解决方案。经过简单的代码封装能够统一到全部的浏览器都支持 web storage 。
localStorage 和 sessionStorage 都具备相同的操做方法,例如 setItem、getItem 和 removeItem 等
cookie 和session 的区别:
一、cookie数据存放在客户的浏览器上,session数据放在服务器上。
二、cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
三、session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
四、单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。
五、因此我的建议:
将登录信息等重要信息存放为SESSION
其余信息若是须要保留,能够放在COOKIE中
请描述一下cookies,sessionStorage和localStorage的区别
sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问而且当会话结束后数据也随之销毁。所以sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。而localStorage用于持久化的本地存储,除非主动删除数据,不然数据是永远不会过时的。
web storage和cookie的区别
Web Storage的概念和cookie类似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,而且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还须要指定做用域,不能够跨域调用。
除此以外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie须要前端开发者本身封装setCookie,getCookie。可是Cookie也是不能够或缺的:Cookie的做用是与服务器进行交互,做为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生。
display:none和visibility:hidden的区别?
display:none 隐藏对应的元素,在文档布局中再也不给它分配空间,它各边的元素会合拢,
就当他历来不存在。
visibility:hidden 隐藏对应的元素,可是在文档布局中仍保留原来的空间。
CSS中 link 和@import 的区别是?
(1) link属于HTML标签,而@import是CSS提供的;
(2) 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
(3) import只在IE5以上才能识别,而link是HTML标签,无兼容问题;
(4) link方式的样式的权重 高于@import的权重.
position:absolute和float属性的异同
A:共同点:
对内联元素设置`float`和`absolute`属性,可让元素脱离文档流,而且能够设置其宽高。
B:不一样点:
float仍会占据位置,position会覆盖文档流中的其余元素。
介绍一下box-sizing属性?
box-sizing 属性主要用来控制元素的盒模型的解析模式。默认值是 content-box 。
content-box :让元素维持W3C的标准盒模型。元素的宽度/高度由border + padding + content的宽度/高度决定,设置width/height属性指的是content部分的宽/高
border-box :让元素维持IE传统盒模型(IE6如下版本和IE6~7的怪异模式)。设置width/height属性指的是border + padding + content
标准浏览器下,按照W3C规范对盒模型解析,一旦修改了元素的边框或内距,就会影响元素的盒子尺寸,就不得不从新计算元素的盒子尺寸,从而影响整个页面的布局。
XML和JSON的区别?
(1).数据体积方面。
JSON相对于XML来说,数据的体积小,传递的速度更快些。
(2).数据交互方面。
JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。
(3).数据描述方面。
JSON对数据的描述性比XML较差。
(4).传输速度方面。
JSON的速度要远远快于XML。
对BFC规范的理解?
BFC,块级格式化上下文,一个建立了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个BFC中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的margin会发生折叠。
(W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行布局,以及与其余元素的关系和相互做用。)
解释下 CSS sprites,以及你要如何在页面或网站中使用它。
CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background- repeat”,“background-position”的组合进行背景定位,background-position能够用数字能精确的定位出背景图片的位置。这样能够减小不少图片请求的开销,由于请求耗时比较长;请求虽然能够并发,可是也有限制,通常浏览器都是6个。对于将来而言,就不须要这样作了,由于有了`http2`。
说说你对语义化的理解?
1,去掉或者丢失样式的时候可以让页面呈现出清晰的结构
2,有利于SEO:和搜索引擎创建良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来肯定上下文和各个关键字的权重;
3,方便其余设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;
4,便于团队开发和维护,语义化更具可读性,是下一步吧网页的重要动向,遵循W3C标准的团队都遵循这个标准,能够减小差别化。
Doctype做用? 严格模式与混杂模式如何区分?它们有何意义?
(1)、<!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签以前。告知浏览器以何种模式来渲染文档。
(2)、严格模式的排版和 JS 运做模式是 以该浏览器支持的最高标准运行。
(3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点没法工做。
(4)、DOCTYPE不存在或格式不正确会致使文档以混杂模式呈现。
你知道多少种Doctype文档类型?
该标签可声明三种 DTD 类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。
HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。
XHTML 1.0 规定了三种 XML 文档类型:Strict、Transitional 以及 Frameset。
Standards (标准)模式(也就是严格呈现模式)用于呈现遵循最新标准的网页,而 Quirks
(包容)模式(也就是松散呈现模式或者兼容模式)用于呈现为传统浏览器而设计的网页。
HTML与XHTML——两者有什么区别
区别:
1.全部的标记都必需要有一个相应的结束标记
2.全部标签的元素和属性的名字都必须使用小写
3.全部的XML标记都必须合理嵌套
4.全部的属性必须用引号""括起来
5.把全部<和&特殊符号用编码表示
6.给全部属性赋一个值
7.不要在注释内容中使“--”
8.图片必须有说明文字
常见兼容性问题?
* png24位的图片在iE6浏览器上出现背景,解决方案是作成PNG8.也能够引用一段脚本处理.
* 浏览器默认的margin和padding不一样。解决方案是加一个全局的*{margin:0;padding:0;}来统一。
* IE6双边距bug:块属性标签float后,又有横行的margin状况下,在ie6显示margin比设置的大。
* 浮动ie产生的双倍距离(IE6双边距问题:在IE6下,若是对元素设置了浮动,同时又设置了margin-left或margin-right,margin值会加倍。)
#box{ float:left; width:10px; margin:0 0 0 100px;}
这种状况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入 ——_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)
* 渐进识别的方式,从整体中逐渐排除局部。
首先,巧妙的使用“\9”这一标记,将IE游览器从全部状况中分离出来。
接着,再次使用“+”将IE8和IE七、IE6分离开来,这样IE8已经独立识别。
css
.bb{
/*全部识别*/
.background-color:#00deff\9; /*IE六、七、8识别*/
+/*IE六、7识别*/
_background-color:#1e0bd1;/*IE6识别*/
}
* IE下,能够使用获取常规属性的方法来获取自定义属性,
也能够使用getAttribute()获取自定义属性;
Firefox下,只能使用getAttribute()获取自定义属性.
解决方法:统一经过getAttribute()获取自定义属性.
* IE下,event对象有x,y属性,可是没有pageX,pageY属性;
Firefox下,event对象有pageX,pageY属性,可是没有x,y属性.
* 解决方法:(条件注释)缺点是在IE浏览器下可能会增长额外的HTTP请求数。
* Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示,
可经过加入 CSS 属性 -webkit-text-size-adjust: none; 解决.
* 超连接访问事后hover样式就不出现了 被点击访问过的超连接样式不在具备hover和active了解决方法是改变CSS属性的排列顺序:
L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}
* 怪异模式问题:漏写DTD声明,Firefox仍然会按照标准模式来解析网页,但在IE中会触发怪异模式。为避免怪异模式给咱们带来没必要要的麻烦,最好养成书写DTD声明的好习惯。如今能够使用[html5](http://www.w3.org/TR/html5/single-page.html)推荐的写法:`<doctype html>`
* 上下margin重合问题
ie和ff都存在,相邻的两个div的margin-left和margin-right不会重合,可是margin-top和margin-bottom却会发生重合。
解决方法,养成良好的代码编写习惯,同时采用margin-top或者同时采用margin-bottom。
* ie6对png图片格式支持很差(引用一段脚本处理)
如何实现浏览器内多个标签页之间的通讯?
调用localstorge、cookies等本地存储方式
你如何对网站的文件和资源进行优化?
期待的解决方案包括:
文件合并
文件最小化/文件压缩
使用 CDN 托管
缓存的使用(多个域名来提供缓存)
其余
你都使用哪些工具来测试代码的性能?
Profiler, JSPerf(http://jsperf.com/nexttick-vs-setzerotimeout-vs-settimeout), Dromaeo
什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?
FOUC - Flash Of Unstyled Content 文档样式闪烁
<style type="text/css" media="all">@import "../fouc.css";</style>
而引用CSS文件的@import就是形成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM,而后再去导入外部的CSS文件,所以,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。
解决方法简单的出奇,只要在<head>之间加入一个<link>或者<script>元素就能够了。
null和undefined的区别?
null 是一个表示"无"的对象,转为数值时为0; undefined 是一个表示"无"的原始值,转为数值时为 NaN 。
当声明的变量还未被初始化时,变量的默认值为 undefined 。 null 用来表示还没有存在的对象,经常使用来表示函数企图返回一个不存在的对象。
undefined 表示"缺乏值",就是此处应该有一个值,可是尚未定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
null 表示"没有对象",即该处不该该有值。典型用法是:
(1) 做为函数的参数,表示该函数的参数不是对象。
(2) 做为对象原型链的终点。
new操做符具体干了什么呢?
一、建立一个空对象,而且 this 变量引用该对象,同时还继承了该函数的原型。
二、属性和方法被加入到 this 引用的对象中。
三、新建立的对象由 this 所引用,而且最后隐式的返回 this 。
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
js延迟加载的方式有哪些?
defer和async、动态建立DOM方式(建立script,插入到DOM中,加载完毕后callBack)、按需异步载入js
如何解决跨域问题?
jsonp、 document.domain+iframe、window.name、window.postMessage、服务器上设置代理页面
jsonp的原理是动态插入script标签
documen.write和 innerHTML的区别
document.write只能重绘整个页面
innerHTML能够重绘页面的一部分
.call() 和 .apply() 的区别和做用?
做用:动态改变某个类的某个方法的运行环境。
哪些操做会形成内存泄漏?
内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在。
垃圾回收器按期扫描对象,并计算引用了每一个对象的其余对象的数量。若是一个对象的引用数量为 0(没有其余对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象的内存便可回收。
setTimeout 的第一个参数使用字符串而非函数的话,会引起内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
如何判断当前脚本运行在浏览器仍是node环境中?
经过判断Global对象是否为window,若是不为window,当前脚本没有运行在浏览器中
什么叫优雅降级和渐进加强?
渐进加强 progressive enhancement:
针对低版本浏览器进行构建页面,保证最基本的功能,而后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
优雅降级 graceful degradation:
一开始就构建完整的功能,而后再针对低版本浏览器进行兼容。
区别:
a. 优雅降级是从复杂的现状开始,并试图减小用户体验的供给
b. 渐进加强则是从一个很是基础的,可以起做用的版本开始,并不断扩充,以适应将来环境的须要
c. 降级(功能衰减)意味着往回看;而渐进加强则意味着朝前看,同时保证其根基处于安全地带
WEB应用从服务器主动推送Data到客户端有那些方式?
Javascript数据推送
Commet:基于HTTP长链接的服务器推送技术
基于WebSocket的推送方案
SSE(Server-Send Event):服务器推送数据新方式
对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
一、实现界面交互
二、提高用户体验
三、有了Node.js,前端能够实现服务端的一些事情
前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
参与项目,快速高质量完成实现效果图,精确到1px;
与团队成员,UI设计,产品经理的沟通;
作好的页面结构,页面重构和用户体验;
处理hack,兼容、写出优美的代码格式;
针对服务器的优化、拥抱最新前端技术。
平时如何管理你的项目?
先期团队必须肯定好全局样式(globe.css),编码模式(utf-8) 等;
编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
页面进行标注(例如 页面 模块 开始和结束);
CSS跟HTML 分文件夹并行存放,命名都得统一(例如style.css);
JS 分文件夹存放 命名以该JS功能为准的英文翻译。
图片采用整合的 images.png png8 格式文件使用 尽可能整合在一块儿使用方便未来的管理
说说最近最流行的一些东西吧?常去哪些网站?
Node.js、Mongodb、npm、MVVM、MEAN、three.js,React 。
网站:w3cfuns,sf,hacknews,CSDN,慕课,博客园,InfoQ,w3cplus等
javascript对象的几种建立方式
1,工厂模式
2,构造函数模式
3,原型模式
4,混合构造函数和原型模式
5,动态原型模式
6,寄生构造函数模式
7,稳妥构造函数模式
javascript继承的6种方法
1,原型链继承
2,借用构造函数继承
3,组合继承(原型+借用构造)
4,原型式继承
5,寄生式继承
6,寄生组合式继承
sql注入原理
就是经过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
总的来讲有如下几点:
1.永远不要信任用户的输入,要对用户的输入进行校验,能够经过正则表达式,或限制长度,对单引号和双"-"进行转换等。
2.永远不要使用动态拼装SQL,能够使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库链接,为每一个应用使用单独的权限有限的数据库链接。
4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
CSRF的防护
1.服务端的CSRF方式方法不少样,但总的思想都是一致的,就是在客户端页面增长伪随机数。 2.使用验证码
ie各版本和chrome能够并行下载多少个资源
IE6 两个并发,iE7升级以后的6个并发,以后版本也是6个
Firefox,chrome也是6个
javascript里面的继承怎么实现,如何避免原型链上面的对象共享
用构造函数和原型链的混合模式去实现继承,避免对象共享能够参考经典的extend()函数,不少前端框架都有封装的,就是用一个空函数当作中间变量
grunt, YUI compressor 和 google clojure用来进行代码压缩的用法。
YUI Compressor 是一个用来压缩 JS 和 CSS 文件的工具,采用Java开发。
使用方法:
//压缩JS
java -jar yuicompressor-2.4.2.jar --type js --charset utf-8 -v src.js > packed.js
//压缩CSS
java -jar yuicompressor-2.4.2.jar --type css --charset utf-8 -v src.css > packed.css
Flash、Ajax各自的优缺点,在使用中如何取舍?
一、Flash ajax对比
Flash适合处理多媒体、矢量图形、访问机器;对CSS、处理文本上不足,不容易被搜索。
Ajax对CSS、文本支持很好,支持搜索;多媒体、矢量图形、机器访问不足。
共同点:与服务器的无刷新传递消息、用户离线和在线状态、操做DOM
请解释一下 JavaScript 的同源策略。
概念:同源策略是客户端脚本(尤为是 Javascript )的重要的安全度量标准。它最先出自 Netscape Navigator2.0 ,其目的是防止某个文档或脚本从多个不一样源装载。
这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议。 指一段脚本只能读取来自同一来源的窗口和文档的属性。
为何要有同源限制?
咱们举例说明:好比一个黑客程序,他利用 Iframe 把真正的银行登陆页面嵌到他的页面上,当你使用真实的用户名,密码登陆时,他的页面就能够经过 Javascript 读取到你的表单中 input 中的内容,这样用户名,密码就轻松到手了。
什么是 "use strict"; ? 使用它的好处和坏处分别是什么?
ECMAscript 5 添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得 Javascript 在更严格的条件下运行。
设立"严格模式"的目的,主要有如下几个:
- 消除Javascript语法的一些不合理、不严谨之处,减小一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提升编译器效率,增长运行速度;
- 为将来新版本的Javascript作好铺垫。
注:通过测试 IE6,7,8,9 均不支持严格模式。
缺点: 如今网站的 JS 都会进行压缩,一些文件用了严格模式,而另外一些没有。这时这些原本是严格模式的文件,被 merge 后,这个串就到了文件的中间,不只没有指示严格模式,反而在压缩后浪费了字节。
GET和POST的区别,什么时候使用POST?
GET:通常用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,通常在2000个字符
POST:通常用于修改服务器上的资源,对所发送的信息没有限制。
GET方式须要使用Request.QueryString来取得变量的值,而POST方式经过Request.Form来获取变量的值,
也就是说Get是经过地址栏来传值,而Post是经过提交表单来传值。
然而,在如下状况中,请使用 POST 请求:
没法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
哪些地方会出现css阻塞,哪些地方会出现js阻塞?
js的阻塞特性:全部浏览器在下载 JS 的时候,会阻止一切其余活动,好比其余资源的下载,内容的呈现等等。直到 JS 下载、解析、执行完毕后才开始继续 并行下载 其余资源并呈现内容。为了提升用户体验,新一代浏览器都支持并行下载 JS ,可是 JS 下载仍然会阻塞其它资源的下载(例如.图片,css文件等)。
因为浏览器为了防止出现 JS 修改 DOM 树,须要从新构建 DOM 树的状况,因此就会阻塞其余的下载和呈现。
嵌入 JS 会阻塞全部内容的呈现,而外部 JS 只会阻塞其后内容的显示,2种方式都会阻塞其后资源的下载。也就是说外部样式不会阻塞外部脚本的加载,但会阻塞外部脚本的执行。
CSS 怎么会阻塞加载了? CSS 原本是能够并行下载的,在什么状况下会出现阻塞加载了(在测试观察中, IE6 下 CSS 都是阻塞加载)
当 CSS 后面跟着嵌入的 JS 的时候,该 CSS 就会出现阻塞后面资源下载的状况。而当把嵌入 JS 放到 CSS 前面,就不会出现阻塞的状况了。
根本缘由:由于浏览器会维持 html 中 css 和 js 的顺序,样式表必须在嵌入的JS执行前先加载、解析完。而嵌入的 JS 会阻塞后面的资源加载,因此就会出现上面 CSS 阻塞下载的状况。
嵌入 JS 应该放在什么位置?
一、放在底部,虽然放在底部照样会阻塞全部呈现,但不会阻塞资源下载。
二、若是嵌入JS放在head中,请把嵌入JS放在CSS头部。
三、使用defer(只支持IE)
四、不要在嵌入的JS中调用运行时间较长的函数,若是必定要用,能够用`setTimeout`来调用
Javascript无阻塞加载具体方式
将脚本放在底部。 <link> 仍是放在 head 中,用以保证在 js 加载前,能加载出正常显示的页面。 <script> 标签放在 </body> 前。
成组脚本:因为每一个 <script> 标签下载时阻塞页面解析过程,因此限制页面的 <script> 总数也能够改善性能。适用于内联脚本和外部脚本。
非阻塞脚本:等页面完成加载后,再加载 js 代码。也就是,在 window.onload 事件发出后开始下载代码。 (1) defer 属性:支持IE4和 fierfox3.5 更高版本浏览器 (2)动态脚本元素:文档对象模型(DOM)容许你使用js动态建立 HTML 的几乎所有文档内容。代码以下:
<script>
var script=document.createElement("script");
script.type="text/javascript";
script.src="file.js";
document.getElementsByTagName("head")[0].appendChild(script);
</script>
此技术的重点在于:不管在何处启动下载,文件额下载和运行都不会阻塞其余页面处理过程。即便在head里(除了用于下载文件的http连接)。
eval是作什么的?
它的功能是把对应的字符串解析成JS代码并运行;
应该避免使用eval,不安全,很是耗性能(2次,一次解析成js语句,一次执行)。
JavaScript原型,原型链 ? 有什么特色?
* 原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有本身的原型,若是一个原型对象的原型不为null的话,咱们就称之为原型链。
* 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链。
事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡?
1. 咱们在网页中的某个操做(有的操做对应多个事件)。例如:当咱们点击一个按钮就会产生一个事件。是能够被 JavaScript 侦测到的行为。
2. 事件处理机制:IE是事件冒泡、firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件。;
3. ev.stopPropagation();注意旧ie的方法 ev.cancelBubble = true;
网站重构的理解?
网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的状况下,对网站进行优化,在扩展的同时保持一致的UI。
对于传统的网站来讲重构一般是:
表格(table)布局改成DIV+CSS
使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的)
对于移动平台的优化
针对于SEO进行优化
深层次的网站重构应该考虑的方面
减小代码间的耦合
让代码保持弹性
严格按规范编写代码
设计可扩展的API
代替旧有的框架、语言(如VB)
加强用户体验
一般来讲对于速度的优化也包含在重构中
压缩JS、CSS、image等前端资源(一般是由服务器来解决)
程序的性能优化(如数据读写)
采用CDN来加速资源加载
对于JS DOM的优化
HTTP服务器的文件缓存
如何获取UA?
<script>
function whatBrowser() {
document.Browser.Name.value=navigator.appName;
document.Browser.Version.value=navigator.appVersion;
document.Browser.Code.value=navigator.appCodeName;
document.Browser.Agent.value=navigator.userAgent;
}
</script>
HTTP状态码
100 Continue 继续,通常在发送post请求时,已发送了http header以后服务端将返回此信息,表示确认,以后发送具体参数信息
200 OK 正常返回信息
201 Created 请求成功而且服务器建立了新的资源
202 Accepted 服务器已接受请求,但还没有处理
301 Moved Permanently 请求的网页已永久移动到新位置。
302 Found 临时性重定向。
303 See Other 临时性重定向,且老是使用 GET 请求新的 URI。
304 Not Modified 自从上次请求后,请求的网页未修改过。
400 Bad Request 服务器没法理解请求的格式,客户端不该当尝试再次使用相同的内容发起请求。
401 Unauthorized 请求未受权。
403 Forbidden 禁止访问。
404 Not Found 找不到如何与 URI 相匹配的资源。
500 Internal Server Error 最多见的服务器端错误。
503 Service Unavailable 服务器端暂时没法处理请求(多是过载或维护)。
说说TCP传输的三次握手策略
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。用TCP协议把数据包送出去后,TCP不会对传送 后的状况置之不理,它必定会向对方确认是否成功送达。握手过程当中使用了TCP的标志:SYN和ACK。
发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,表明“握手”结束
若在握手过程当中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。
说说你对Promise的理解
依照 Promise/A+ 的定义, Promise 有四种状态:
pending: 初始状态, 非 fulfilled 或 rejected.
fulfilled: 成功的操做.
rejected: 失败的操做.
settled: Promise已被fulfilled或rejected,且不是pending
另外, fulfilled 与 rejected 一块儿合称 settled 。
Promise 对象用来进行延迟(deferred) 和异步(asynchronous ) 计算。
Promise 的构造函数
构造一个 Promise ,最基本的用法以下:
var promise = new Promise(function(resolve, reject) {
if (...) { // succeed
resolve(result);
} else { // fails
reject(Error(errMessage));
}
});
Promise 实例拥有 then 方法(具备 then 方法的对象,一般被称为 thenable )。它的使用方法以下:
promise.then(onFulfilled, onRejected)
接收两个函数做为参数,一个在 fulfilled 的时候被调用,一个在 rejected 的时候被调用,接收参数就是 future,onFulfilled 对应 resolve , onRejected 对应 reject 。
Javascript垃圾回收方法
标记清除(mark and sweep)
这是 JavaScript 最多见的垃圾回收方式,当变量进入执行环境的时候,好比函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。
垃圾回收器会在运行的时候给存储在内存中的全部变量加上标记,而后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成以后仍存在标记的就是要删除的变量了
引用计数(reference counting)
在低版本 IE 中常常会出现内存泄露,不少时候就是由于其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每一个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,若是该变量的值变成了另一个,则这个值得引用次数减1,当这个值的引用次数变为0的时 候,说明没有变量在使用,这个值无法被访问了,所以能够将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。
在IE中虽然 JavaScript 对象经过标记清除的方式进行垃圾回收,但BOM与DOM对象倒是经过引用计数回收垃圾的,也就是说只要涉及BOM及DOM就会出现循环引用问题。
谈谈性能优化问题
代码层面:避免使用css表达式,避免使用高级选择器,通配选择器。 缓存利用:缓存Ajax,使用CDN,使用外部js和css文件以便缓存,添加Expires头,服务端配置Etag,减小DNS查找等 请求数量:合并样式和脚本,使用css图片精灵,初始首屏以外的图片资源按需加载,静态资源延迟加载。 请求带宽:压缩文件,开启GZIP,
移动端性能优化
尽可能使用 css3 动画,开启硬件加速。适当使用 touch 事件代替 click 事件。避免使用 css3 渐变阴影效果。 尽量少的使用 box-shadow 与 gradients 。 box-shadow 与 gradients 每每都是页面的性能杀手
什么是Etag?
浏览器下载组件的时候,会将它们存储到浏览器缓存中。若是须要再次获取相同的组件,浏览器将检查组件的缓存时间, 假如已通过期,那么浏览器将发送一个条件GET请求到服务器,服务器判断缓存还有效,则发送一个304响应, 告诉浏览器能够重用缓存组件。
那么服务器是根据什么判断缓存是否还有效呢?答案有两种方式,一种是前面提到的ETag,另外一种是根据 Last-Modified
Expires和Cache-Control
Expires 要求客户端和服务端的时钟严格同步。HTTP1.1引入 Cache-Control 来克服Expires头的限制。若是max-age和Expires同时出现,则max-age有更高的优先级。
Cache-Control: no-cache, private, max-age=0
ETag: abcde
Expires: Thu, 15 Apr 2014 20:00:00 GMT
Pragma: private
Last-Modified: $now // RFC1123 format
关于Http 2.0 你知道多少?
HTTP/2 引入了“服务端推(serverpush)”的概念,它容许服务端在客户端须要数据以前就主动地将数据发送到客户端缓存中,从而提升性能。
HTTP/2 提供更多的加密支持 HTTP/2 使用多路技术,容许多个消息在一个链接上同时交差。 它增长了头压缩(header compression),所以即便很是小的请求,其请求和响应的
header 都只会占用很小比例的带宽。
http与https的区别
https协议须要到ca申请证书,通常免费证书不多,须要交费。
http是超文本传输协议,信息是明文传输,https 则是具备安全性的ssl加密传输协议
http和https使用的是彻底不一样的链接方式用的端口也不同,前者是80,后者是443。
http的链接很简单,是无状态的
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全