什么是语义化的HTML?javascript
说下行内元素和块级元素的区别?行内块元素的兼容性使用?(IE8 如下)php
行内元素特性:css
块级元素特性:html
div { display: inline-block;//先用display:inline-block属性触发块元素 *zoom: 1;//经过zoom:1触发块元素的layout *display: inline;//让块元素呈x现为内联对象 }
XHTML和HTML有什么区别前端
XHTML是更严格的HTML标准,主要表如今:XHTML元素必须正确的嵌套和关闭,标签名必须用小写字母,文档必需要有根元素vue
前端页面有哪三层构成,分别是什么?做用是什么?html5
Doctype做用?标准模式与兼容模式各有什么区别?java
你知道多少种Doctype文档类型?node
对于标准模式,有严格型。对于准标准模式,有过渡型,框架集型。这两种模式的差别几乎能够忽略不计。mysql
HTML5 为何只须要写 <!DOCTYPE HTML>?
HTML5不基于SGML(标准通用标记语言)的子集,所以不须要对DTD(文档类型定义规则)进行引用。可是须要Doctype来规范浏览器的行为。
html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和
HTML5?
新特性:
移除了纯表现的元素:big,center,font,strike等等。对可用性产生负面影响的元素:frame,frameset,noframes;
浏览器兼容问题:IE8/IE7/IE6支持经过document.createElement方法产生的标签,能够利用这一特性让这些浏览器支持HTML5新标签。固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
如何区分:DOCTYPE声明\新增的结构元素\功能元素
iframe的优缺点?
优势:
缺点:
div+css的布局较table布局有什么优势?
<meta>文档编码格式
http-equivcontent-type值能够设计文档的编码格式。把 content 属性关联到 HTTP 头部。
<meta http-equiv='Content-Type' content='text/html; charset=gbk'>
页面导入样式时,使用link和@import有什么区别?
CSS放在顶部/底部有什么区别
什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?
就是@import引发的。@import是等到页面加载完成后再加载。所以会出现闪烁的感受。解决办法是link引用css文件
简要说一下CSS的元素分类
块级元素:div p ul ol li form
行内元素:span a input img strong em label
CSS 选择符有哪些?哪些属性能够继承?优先级算法如何计算? CSS3新增伪类有那些?以及这些选择器的使用场景?
选择器:(按优先级)
优先级算法:同权重下以最近者为准
!important>行内样式(权重1000)>id选择器(权重100)>id选择器 |属性选择器|伪类选择器 (权重10)>标签选择器|伪元素选择器(权重1)
可继承的样式:font的样式,color,visiblity
不可继承的:关于盒模型的:width height margin padding border
新增伪类:first-child last-child nth-child(n)
CSS选择器,nth-chlid(n)和nth-of-type(n)区别
ele:nth-of-type(n)是指父元素下第n个ele元素, 而ele:nth-child(n)是指父元素下第n个元素且这个元素为ele,若不是,则选择失败
介绍一下CSS的盒子模型?
W3C标准盒模型:content,padding,border,margin。其中width指的是内容content的宽度
IE盒模型:content,padding,border,margin。其中width指的是content的宽度+padding+border的宽度
box-sizing经常使用的属性有哪些?分别有什么做用?
是CSS3中提供的属性。主要控制盒模型的解析方式。每种盒模型计算元素宽高的方式不一样:
display的值:
规定元素生成框的类型:
display:none与visibility:hidden的区别是什么?
他们均可以隐藏对应的元素。
position的值, relative和absolute分别是相对于谁进行定位的?
为什么要初始化CSS样式?
由于浏览器的兼容问题,不一样浏览器对某些标签的默认值不一样。若是没有初始化,会致使页面在不一样浏览器中存在差别。
垂直居中设置(已知大小和未知大小,图片)多行文本居中
已知大小:
块元素:绝对定位后margin左上都设置为负的1/2宽高。
.center{ position: absolute; width: 200px; height: 200px; left:50%; top:50; margin-top:-100px; margin-left: -100px; }
文本:将文本text-align:center;line-height设置为父容器的高;
.text{ height:100px; text-align: center; line-height: 100px; }
多行文本居中:width,height必须使用px单位,再配合vertial-align:middle和display:table-cell属性,且div不能浮动,若是浮动就在里面再添加一个div
.parent{ display: table-cell; vertical-align: middle; }
未知大小元素居中:
方法一:使用CSS3的flex-box
.wrap { display: flex; align-items: center; justify-content: center; }
方法2:父元素相对定位,子元素绝对定位,左右为50%,再使用transform:translate上下移动自身的-50%;
.parent{ position: relative; } .child{ position: absolute; left: 50%; top: 50%; -webkit-transform: translate(-50%,-50%); }
方法4:给子元素加上table标签,让table的margin:0 auto;height:100%;
<table style="margin: 0 auto;height: 100%;"> <tbody> <tr> <td> <ul ><!-- ul居中--> <li>8888888888</li> <li>8888888888</li> <li>8888888888</li> <li>8888888888</li> <li>8888888888</li> </ul> </td> </tr> </tbody> </table>
居中图片:
.parent{ display:table-cell; vertical-align:middle; text-align:center; }
浮动原理,浮动产生的问题,CSS清除浮动的几种方法(至少两种)
浮动的元素脱离文档流,不占用空间。能够向左和向右浮动,直到它的外边缘碰到包含框或者另一个浮动框的边缘为止。
浮动产生的问题:
解决办法:
CSS隐藏元素的几种方法(至少说出三种)
<strong>,<em>和<b>,<i>标签
img的alt与title有何异同?
px,em的区别
它们都是长度单位,px的值是固定的,指定多少就是多少,em的值是不固定的,他会继承父级元素的大小。浏览器默认字体高都是16排序,因此未经调整的话1em=16px;
怎么实现三角形?
宽高设为0,border设置很大的宽度,再根据所须要的三角形方向设置border-left/right等。
#triangle-left { width: 0px; height: 0px; border: 100px solid transparent; border-right: 100px solid red; }
怎么实现一个圆形可点区域?
1.border-radius设置成50%;
.circle { width: 100px; height: 100px; border-radius: 50%; cursor: pointer; }
2.map+area
<img src="t.jpg" width="1366" height="768" border="0" usemap="#Map" /> <map name="Map" id="Map"> <area shape="circle" coords="821,289,68" href="www.baidu.com" target="_blank" /> </map>
<area shape="circle" coords="x1, y1,r" href=url>表示设定热点的形状为圆形,圆心坐标为(X1,y1),半径为r。
3.JS实现,获取鼠标点击位置坐标,判断其到圆点的距离是否不大于圆的半径,来判断点击位置是否在圆内
document.onclick = function(e) { var r = 50; var x1 = 100; var y1 = 100; var x2= e.clientX; var y2= e.clientY; var distance = Math.abs(Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2))); if (distance <= 50) alert("Yes!"); }
css一个冒号和两个冒号区别?
一个冒号用于CSS伪类,两个冒号用于CSS伪元素。它是CSS3中引入的,为了区分伪类和伪元素。为了兼容IE,仍是用一个比较好。
两栏分布,左边定宽右边自适应。
左侧固定宽度,让他绝对定位。右侧margin-left设为左侧宽度
.left{ width:200px; height: 800px; position: absolute; left:0; top:0; } .right{ height: 800px; margin-left: 200px; background-color: green; }
三栏分布
左侧右侧固定宽度而且绝对定位。中间设置marginleft和right。
.left{ width: 200px; position: absolute; left: 0; top: 0; height: 800px; } .right{ width: 300px; position: absolute; right: 0; top: 0; height: 800px; } .main{ /* position: absolute; left: 200px; right: 300px; */ margin-left: 200px; margin-right: 300px; }
css hack原理和分类,利弊
原理:因为不一样的浏览器和浏览器各版本对CSS的支持及解析结果不同,以及CSS优先级对浏览器展示效果的影响,咱们能够据此针对不一样的浏览器情景来应用不一样的CSS。
分类:
利弊:使用hack虽然对页面表现的一致性有好处,但过多的滥用会形成html文档混乱不堪,增长管理和维护的负担。
浏览器前缀
如今写css3代码的时候,为了实现兼容性,须要在前面加前缀以便兼容对应的浏览器。
-webkit //Webkit 谷歌和Safari浏览器 -moz //Gecko内核,火狐浏览器 -o //Presto内核,Opera浏览器 -ms //Trident内核,IE浏览器
什么是Css Hack?ie6,7,8的hack分别是什么?
对不一样的浏览器写不一样的CSS的过程,就是CSS hack
background-color:red\9; /*all ie*/ background-color:yellow\0; /*ie8*/ +background-color:pink; /*ie7*/ _background-color:orange; /*ie6*/
解释下 CSS sprites,以及你要如何在页面或网站中使用它。
把网页中一些背景图片整合到一张图片文件中。利用CSS的background-image,background-position组合进行定位。减小HTTP请求次数。
对BFC规范的理解?
块级格式化上下文,是CSS2.1提出的一个概念:它决定了元素如何对其内容进行布局,以及和其余元素的关系和相互做用。一个建立了BFC的盒子是独立布局的,盒子里面的元素的样式不会影响到外面的元素。
Css渲染机制
在网页中的应该使用奇数仍是偶数的字体?为何呢?
iconfont矢量图标优势和缺点
Iconfont 就是指用字体文件取代图片文件,来展现图标、特殊字体等元素的一种方法。
优势:
缺点:
知道的网页制做会用到的图片格式有哪些?
canvas为何会出现,用来作什么的;
canvas 元素使用 JavaScript 在网页上绘制图像,适合像素处理,动态渲染和大数据量绘制
简述一下src与href的区别。
什么是外边距重叠?重叠的结果是什么?
CSS中相邻两个盒子的外边距会结合成一个单独的外边距,这种合并的方式称为折叠。两个浮动的块元素不存在margin折叠的状况
折叠结果遵循如下原则:
两个块状元素上下的margin-top和margin-bottom会重叠。啥缘由?怎么解决?
CSS中相邻两个盒子的外边距会结合成一个单独的外边距,这种合并的方式称为折叠。
而对于标准浏览器来讲:两个浮动的块元素不存在margin折叠的状况,可是此时加浮动后会形成IE6的双边距bug,可让其设置为_diplay:inline;
rgba()和opacity的透明效果有什么不一样?
都能实现透明效果。opacity会做用于元素的背景和内容,rgba只会做用于背景。
关于letter-spacing的妙用知道有哪些么?
以用于消除inline-block元素间的换行符空格间隙问题。
Sass、LESS是什么?你们为何要使用他们?
他们是CSS预处理器,他们是一种特殊的语法/语言编译成CSS。例如LESS是一种动态样式语言. 将CSS赋予了动态语言的特性,如变量,继承,运算, 函数. LESS 既能够在客户端上运行 (支持IE 6+, Webkit, Firefox),也可一在服务端运行 (借助 Node.js)
为何要使用它们?
知道css有个content属性吗?有什么做用?有什么应用?
用在before和after伪元素上,用来插入生成内容。
最多见的应用就是清除浮动:
.parent:after{ content:'.'; height:0; visiblity:hidden; display:block; clear:both; *zoom:1; // for IE6 }
去除inline-block间隙的方法
媒体查询
使用@media能够针对不一样的媒体类型或者不一样屏幕大小来定义不一样的样式
@media screen and/not/only (min-width:365px,max-width:667px;)//iphone6 @media screen and/not/only (min-width:768px,max-width:1024px;)//ipad @media screen and/not/only (min-width:1024px)//sm-screen
Css实现动画效果Animation还有哪些其余属性。
CSS3动画的属性主要分为三类:
transform
transition过渡:能够在不使用 Flash 动画或 JavaScript 的状况下,当元素从一种样式变换为另外一种样式时为元素添加效果。
animation:@keyframes 规则用于建立动画。在 @keyframes 中规定某项 CSS 样式,就能建立由当前样式逐渐改成新样式的动画效果
怎么在页面里放置一个很简单的图标,不能用img和background-img
canvas,icon库
谈一谈flexbox,讲一讲哪些浏览器已经支持。
弹性布局。把复杂的网站布局变得简易和快速。
若是咱们把Flexbox新语法、旧语法混合在一块儿使用,在现代浏览器(Chrome、Firefox、Safari、Opera Presto 12.1+,IE10+,IOS和Android)能够获得很好的支持。在这里新旧语法的顺序显得很是重要。须要确保老语法不要覆盖新语法。写的时候对于不一样的浏览器加上不一样的前缀。
任何一个容器均可以指定为Flex布局,它有以下属性(主轴排列方向flex-direction,是否换行flex-wrap,主轴对齐方式justify-content,与主轴垂直的对其方式align-content):
.flex-container { display: -ms-flexbox; display: -webkit-flex; display: flex; /*主轴方向:项目排列方向水平*/ -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; /*超出容器后是否换行:换行*/ -webkit-flex-wrap: wrap; -ms-flex-wrap: wrap; flex-wrap: wrap; /*主轴对齐方向:水平居中*/ -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; /*垂直方向的对齐方式:垂直居中*/ -webkit-align-content: center; -ms-flex-line-pack: center; align-content: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; }
你了解哪些布局?你平时有使用过什么布局实现?
NodeList是DOM操取出来的集合,是集合而不是普通的数组,所以不能使用数组元素的方法来操做nodelist
NodeList具备length,下标索引这些数组的属性特征
NodeList最大的特色就是时效性(live),这个集合是“动态的”:每当文档结构发生变化时,它会获得更新,所以在迭代nodelist的时候,应该将其length缓存到变量值,不然有可能会形成无限循环的问题,并且应该尽可能减小访问nodelist的次数,由于每次访问nodelist都会进行一次基于文档的查询,咱们应该将nodelist中取得的值缓存起来。
另外,咱们能够把NodeList转化为数组,方便操做
在IE8+和其余浏览器当中能够使用
Array.prototype.slice.call(nodelist,0)
在IE中必须手动枚举成员
使用try-catch
另外ES6当中提供了Array.from()将类数组对象转化为数组var brr=Array.from(nodelist);
function converToArray(nodelist) { var arr = []; var len = nodelist.length; try { arr = Array.prototype.slice.call(nodelist, 0)); //针对非IE浏览器 } catch (error) { for (var i = 0; i < len; i++) { arr.push(nodelist[i]) } } return arr; }
事件委托:是 JavaScript 中绑定事件的经常使用技巧,利用事件模型中的冒泡原理,将事件绑定在更上层的父元素时,经过检查事件的目标对象来判断并获取事件源。使用事件代理的好处是能够提升性能。
使用场景:
缺点:事件代理的经常使用应用应该仅限于上述需求,若是把全部事件都用事件代理,可能会出现本不应被触发的事件被绑定上了事件的状况。
在各类浏览器中存在3种事件模型:
1.DOM0(全部浏览器都支持):
2.DOM2(除了IE意外都支持)
3.IE事件模型:
document.write()方法能够用在两个方面:
document.write只能重绘整个页面。innerHTML能够重绘页面的一部分
window.onload()方法是必须等到页面内包括图片的全部元素加载完毕后才能执行。
$(document).ready()是DOM结构绘制完毕后就执行,没必要等到加载完毕。
function ready(fn){ if(document.addEventListener) { //标准浏览器 document.addEventListener('DOMContentLoaded', function() { //注销事件, 避免反复触发 document.removeEventListener('DOMContentLoaded',arguments.callee, false); fn(); //执行函数 }, false); }else if(document.attachEvent) { //IE document.attachEvent('onreadystatechange', function() { if(document.readyState == 'complete') { document.detachEvent('onreadystatechange', arguments.callee); fn(); //函数执行 } }); } };
因此:
dom3新增长了哪些特性,哪些已经被彻底接受了
事件循环
如何在页面中插入一些数据
原生js添加class怎么添加,若是自己已经有class了,会不会覆盖,怎么保留?
document.getElementById("flag").className = "mycalss"
js延迟加载的方式有哪些?
延迟javascript代码的加载是为了加快网页的访问速度
1.把延迟脚本放在页面底部(body标签里):若是把script标签放在head中,那么js加载完后才会加载页面,由于js会阻塞后面的代码的运行。这时候能够放在页面的底部,文档会按照从上到下的顺序加载。
2.动态建立DOM的方式:在文档都加载完后,建立script标签,插入到DOM中
//这些代码应被放置在</body>标签前(接近HTML文件底部) <script type="text/javascript"> function downloadJSAtOnload() { var element = document.createElement("script"); element.src = "defer.js"; document.body.appendChild(element); } if (window.addEventListener) window.addEventListener("load", downloadJSAtOnload, false); else if (window.attachEvent) window.attachEvent("onload", downloadJSAtOnload); else window.onload = downloadJSAtOnload; </script>
3.defer:在script标签里设置这个属性,脚本会被延迟到整个页面都解析完毕后再运行,就是至关于告诉浏览器当即下载但延迟执行。
4.async:它的做用和defer相似,可是不能控制加载的顺序。
<script src="" async="true"/>
5.使用在文档加载完后使用setTimeout()方法延迟加载js:
window.onload=function(){ setTimeout(function(){ var head=document.getElementsByTagName("head")[0]; var script=document.createElement("script"); script.src="defer.js"; head.appendChild("script") },1000) }
六、使用jQuery的$.getScript( "src",callback )方法
$.getScript("defer.js",function(){
console.log("回调函数执行"); })
它是JavaScript另外的一种运行模式,在这种模式下,JavaScript在更严格的条件下执行。
好处:
坏处:
如今网站的js都会进行压缩,一些文件用了严格模式,一些文件没有,压缩后原本是严格模式的文件,不只没有指示严格模式,反而在压缩后浪费了字节。(能够写在当即执行函数当中)
JavaScript 运行机制详解
链式调用就是一行代码就实现了对一个或多个节点的两个或两个以上的操做。好比jquery里面就实现了链式操做:对一个节点进行屡次的操做
实现链式操做的核心思想是在每一个对象的方法里面都返回这个对象:
/*建立对象的方式:组合使用构造函数模式和原型模式:构造函数模式定义属性, 原型模式定义对象的方法,用原型模式能够实现全部对象的实例共享它的方法, 这样能够最大限度的节省内存*/ function Base(){ // 把返回的节点保存在一个数组里头 this.elements=[]; /*获取id*/ this.getId=function(id){ //获取到对象后放在数组里面 this.elements.push(document.getElementById(id)); //在对象的方法中返回这个对象 return this; }; this.getClass=function(className){ this.elements.push(document.getElementsByClassName(className)); return this; }; this.getTag=function(tag){ this.elements.push(document.getElementsByTagName(tag)); return this; }; this.getName=function(name){ this.elements.push(document.getElementsByName(name)); return this; }; } //给原型对象添加方法,全部实例共享这些方法 Base.prototype.css=function(attr,value){ for (var i = 0; i < this.elements.length; i++) { this.elements[i].style[attr]=value; } return this; } Base.prototype.html=function(str){ for (var i = 0; i < this.elements.length; i++) { this.elements[i].innerHTML=str; } return this; } Base.prototype.click=function(fn){ for (var i = 0; i < this.elements.length; i++) { this.elements[i].onclick=fn; } return this; } //避免在前台new一个对象 var $=function(){ return new Base(); }
//在前台就能够使用库当中的代码了 window.onload=function(){ console.log($().getId("id").css("color","red").html("hello world")); }
了解设计模式吗(我说了单例和观察者模式,并写了下代码,介绍有啥做用)
在浏览器端,异步编程很是重要,耗时很长的操做都应该异步执行,避免浏览器失去响应。
在ES6以前,异步编程的方法大概有如下几种
回调函数:将回调函数做为异步函数的参数传入,至关于先执行程序的主要逻辑,将耗时的操做推迟执行,这种方法不利于代码的维护,代码高度耦合
发布订阅模式:假设存在一个信号中心,某个任务执行完成后向信号中心发布一个信号,其余任务能够向信号中心订阅这个信号,从而知道本身何时能够执行,这样去除了代码之间的耦合,并且咱们能够经过查看消息中心能够知道有多少个信号,每一个信号有多少个订阅者
这个模式有多种实现,咱们能够用jquery的插件
Promises对象是CommonJS工做组提出的一种规范,目的是为异步编程提供统一接口,使得控制异步操做更加的容易。promise优势在于避免层层嵌套的回调函数,回调函数变成了链式写法,程序的流程能够看得很清楚。并且若是一个任务已经完成,再添加回调函数,该回调函数会当即执行。因此,你不用担忧是否错过了某个事件或信号。
generator函数:多个线程相互合做,完成异步任务
async函数:generator函数的改进
返回字符串:string,number,undefined,object,boolean,function,symbol
强制:有三个函数能够将非数值转化为数值:parseInt,parseFloat,(将字符串转化为数值)number(适用于任何数据类型)
隐式:==
null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。
当声明的变量还未被初始化时,变量的默认值为undefined。null用来表示还没有存在的对象,经常使用来表示函数企图返回一个不存在的对象。
undefined表示"缺乏值",就是此处应该有一个值,可是尚未定义。典型用法是:
null表示"没有对象",即该处不该该有值。典型用法是:
在一个函数体内,不管在哪声明的变量,都会被提高到函数的顶部,再依次从上到下执行和赋值。
数组方法有哪些?
能改变原数组的:
不能改变原数组的
ES5中的数组方法:
数组遍历:
写出2个以上数组去重的方法:
1.建立一个新的数组存放结果,遍历数组元素,判断新数组在是否存在该元素,不存在就存入
function delSame(arr) { var result = []; var len = arr.length; for (var i = 0; i < len; i++) { if (result.indexOf(arr[i]) == -1) { result.push(arr[i]) }; }; return result; }
2.先将原数组排序,建立新数组并将第一个元素存入新数组,从第二项遍历数组元素,判断每一项和新数组最后一项是否相同,不相同存入该数组
function delSame2(arr) { var arr=arr.sort(); var result=[arr[0]]; var len = arr.length; for (var i = 1; i < len; i++) { if (arr[i]!==result[result.length-1]) { result.push(arr[i]) }; }; return result; }
3,建立一个新的结果数组和空对象,遍历数组元素,判断对象中属性为数组元素的值是否为空,若是为空,将元素存入结果数组,并将对象的属性赋值为1
function delSame3(arr) { var result=[]; var obj={}; var len=arr.length; for (var i = 0; i < len; i++) { var key=arr[i]; if (!obj[key]) { result.push(arr[i]); obj[key]=1; }; }; return result; }
快速排序的思想并实现一个快排?
function quickSort(arr){ if(arr.length<=1){ return arr;//若是数组只有一个数,就直接返回; } var num = Math.floor(arr.length/2);//找到中间数的索引值,若是是浮点数,则向下取整 var numValue = arr.splice(num,1);//找到中间数的值,并从原数组删除 var left = []; var right = []; for(var i=0;i<arr.length;i++){ if(arr[i]<numValue){ left.push(arr[i]);//基准点的左边的数传到左边数组 } else{ right.push(arr[i]);//基准点的右边的数传到右边数组 } } return arguments.callee(left).concat(numValue,arguments.callee(right));//递归不断重复比较 } alert(quickSort([32,45,37,16,2,87]));//弹出“2,16,32,37,45,87”
判断数组的方法:
Javascript垃圾回收方法?
内存泄漏是什么?
DOM
元素的对象或DOM
对象的引用须要被赋值为null
。哪些操做会形成内存泄漏?
谈谈This对象的理解。
this老是指函数运行时所在的对象。在不一样的场景中,this的身份不一样:
ES6中,箭头函数当中的this指的的是定义时所在的对象而不是使用时所在的对象。这样咱们在使用的时候就不会产生不少歧义了。
JavaScript有块做用域吗?
没有。在JavaScript中,if/for语句中初始化变量的表达式中所定义的变量,在循环结束后也依旧会存在于循环外部的执行环境当中。
JavaScript的做用域和做用域链?
说说函数表达式和函数声明的区别
函数声明提高:
执行代码时,JavaScript引擎在第一遍会声明函数并将它们提高到顶部。函数声明语句能够它定义以前出现的代码所调用。
js中上下文是什么,js有哪些函数能改变上下文
call和apply的区别和做用?
区别:
做用:改变函数的上下文,它是以某个对象的方法来调用函数,函数的this指的是第一个参数。若是没有传递参数是null/undefined,this指window
f.call(o) //以对象o的方法来调用函数f
代码的功能:
o.m=f; //将f存储为o的临时方法
o.m(); //调用它,没有参数
delete o.m //将临时方法删除
谈谈你对闭包的理解,为何使用闭包,使用场景,它会有什么影响?
手写一个闭包
function fn(){
var n=0; function fn1(){ n++; console.log(n); } return fn1; } var foo=fn(); foo(); //1 foo(); //2 foo(); //3
new操做符具体作了什么?
var o={}; o.__proto__=Base.prototype; Base.call(o);
给你一个空函数,加new和不加new的区别
for函数里面setTimeout异步问题
setTimeout()是将一段代码延迟必定时间并异步执行。好比想要在for循环里面使变量i每隔1秒输出,若是这样写:
for (var i = 1; i <= 2; i++) { setTimeout(function() { alert(i) }, 1000); }
结果是两次都弹出了3。由于setTimeout是异步的,那么在调用它以前,其实3次循环都已经结束了。每一个定时器处理函数就会共享同一做用域里的同一变量"i"。怎么样才能达到预期效果?你要为每一个定时器处理函数建立不一样的“i”变量副本。
在函数内建立一个当即执行函数,函数引用了变量i,做为实参将其传递给形参,从而建立了变量的值的副本。因为setTimeout()是在该副本的上下文中调用的,因此它每次都有本身的私有的"i"以供使用。
for (var i = 1; i <= 2; i++) { (function(i) { setTimeout(function() { alert(i) }, 1000); })(i); }
定义不可修改属性?
Object.defineProperty(obj,propertyName,{ writable:false, //表示可否修改属性的值,默认是true configurable:false, //表示不能从对象中删除属性,默认是true value:"valueOfProperty", //属性的值,默认是undefined Enumerable:"true" //可以经过for-in循环 ,默认是true })
对象属性的遍历
1.for-in循环能够遍历对象全部 可枚举的(对象继承的方法不可枚举) ,包括自有的和继承的属性。
var o = { name: "lifurong", age: 24 } for (var key in o) { console.log(o[key]) };
//lifurong
//24
二、Object.keys()方法
返回一个由对象中可枚举的自有的属性组成的数组。
三、Object.getOwnPropertyNames()
返回一个由对象中全部的(包括不可枚举的)自有属性组成的数组。
Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
obj.hasOwnProperty(propertyName);这个方法返回一个布尔值。用来检测一个属性是存在于实例中仍是存在于原型中。
object和array的区别
数组表示带有编号的有序数据的集合,而对象表示无序数据的集合。若是数据的顺序很重要,就用数组,不然就用对象。
如何判断对象的类型
instanceof原理
instanceof操做符是来测试实例与原型链中出现的构造函数。若是实例的原型链中有这个构造函数,返回true.
对象中key-value的value怎么再放一个对象。
经过对象字面量的方法
var book={ edition:2, author:{ firstname:"David", lastname:"li" } }
静态属性怎么继承?
静态属性:无需实例化就能够调用的方法就叫静态方法
静态属性不能被继承
function Father() { //公有属性 this.lastname = "li"; //私有属性 var mood="good"; } //静态属性 Father.staticPro="staticPro"; function Child() { this.age = 20; } Child.prototype = new Father();
正则:
匹配模式:i (忽略大小写),g(全局:匹配全部字符串,而不是发现第一个就中止),m(多行模式:忽略文本的末尾)
regexp的方法:
字符串方法:
经常使用的正则:
检验网址的正则:
var str="visit my personal information at http://www.t1amo.com/about.html"
var pattern=/(\w+):\/\/([\w.]+)\/(\S*)/
var result=str.match(pattern);
result[0] // http://www.t1amo.com/about.html
result[1] //http 协议
result[2] //www.t1amo.com域名
result[3] //about.html路径
怎么去除字符串先后的空格:
var str=" hello world ";
手机号码正则:手机号1开头,第二位是[3,4,5,7,8],再后面9位(总共11位)
function checkPhone(){ var phone = document.getElementById('phone').value; if(!(/^1[34578]\d{9}$/.test(phone))){ alert("手机号码有误,请重填"); return false; } }
客户端存储
浏览器本地存储?
sessionStorage:用于存储一个会话中的数据,这些数据只有在同一个标签页或窗口中才能够访问,而且浏览器关闭后数据自动删除。
localStorage:用于持久化的本地存储数据。浏览器关闭后数据不丢失除非主动删除数据;
区别:
web storage和cookie的区别?Cookie、sessionStorage 和 localStrorage?
它们都是为了实现本地存储而设计的。
为何选择Web Storage而不是Cookie?
Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie须要前端开发者本身封装setCookie,getCookie,在不支持web存储的浏览器中,能够使用cookie和IE userData来解决兼容性
/*识别出是哪类存储机制*/ var memory=window.localStorage|| (window.UserDataStorage&& new UserDataStorage())|| new cookieStorage(); /*而后在对应的机制中查询数据*/ var value=memory.getItem("name");
cookie 和session 的区别?
因此通常来讲,将重要信息存放在session,不重要的须要保存的数据存放在cookie。
请你谈谈Cookie的弊端?
cookie虽然在持久保存客户端数据提供了方便,减轻了服务器的负担,可是还有不少局限性:
缺点:
优势:极高的扩展性和可用性
使用cookie须要注意的问题:
cookie的读取,set,以及删除?
cookie属性:有效期和做用域
一、cookie设置
function setCookie(name,value,daystoLive,path,domain,secure){ var cookie=name+"="+encodeURIComponent(value); if (typeof daystoLive === "number") cookie+="; max-age="+(daystoLive*24*60*60); if (path) cookie+="; ="+path; if (domain) cookie+="; domain="+domain; document.cookie=cookie; }
二、cookie的获取:
function getCookie(){ var cookie={}; var all=document.cookie; if (all===null) return cookie; var list=all.split("; "); for (var i = 0; i < list.length; i++) { var p=list[i].indexOf("="); var name=list[i].substring(0,p); var value=list[i].substring(p+1); value=decodeURIComponent(value); cookie[name]=value; } return cookie;//返回的是对象的方式 }
三、cookie删除:
function delCookie(name,path,domain,secure){ //必需要设置成相同的域和路径才能够 var cval=getCookie().name; if (cval!=null) { document.cookie=name+"="+cval+ "; max-age=0"; }; }
如何实现浏览器内多个标签页之间的通讯?
调用localStorage,cookie等本地存储方式
localstorage怎么使用
localStorage仅仅支持存储字符串类型的数据,它和JavaScript对象的使用没什么区别。须要注意的是,当存储一个数字时,会把它自动转化成字符串。当获取该值时应该使用parseInt()转换成数字类型
localStorage.x=10; var x=parseInt(localStorage.x);
localStorage具备setItem("name","value")方法和getItem("name")方法。分别实现数据存储和获取数据,调用removeItem("name")方法能够删除数据。
localStorage.setItem("x",10); localStorage.getItem("x"); //"10" localStorage.removeItem("x")
调用clear()方法能够删除全部存储的数据。
使用length属性和key()方法,枚举存入数据的名字;
for (var i = 1; i < localStorage.length; i++) { var name=localStorage.key(i); console.log(name); var value=localStorage.getItem(name); console.log(value); };
如何保持登陆状态?
若是页面初始载入的时候把ajax请求返回的数据存在localStorage里面,而后每次调用的时候去localStorage里面取数,是否可行。
前端路由的实现原理
大型框架例如Angular的路由就是经过hash实现的。一个url里的#号叫hash,也就是所谓的锚点。当咱们点击一个a标签时,将href属性设置为相应的path,就能够在不用更新网页状况下局部的刷新页面。
hash的运行机制是:
具体的代码以下:
<ul> <li><a href="#/">首页</a></li> <li><a href="#/product">产品页</a></li> <li><a href="#/service">服务页</a></li> </ul> <div id="refreshBox"></div>
<script type="text/javascript"> function Route() { /*存储hash更新时的回调函数到routes里*/ this.routes = {}; this.curUrl = ""; /*存储路由更新时的回调到routes中*/ this.route = function(path, callback) { this.routes[path] = callback; } /*执行当前的回调函数更新页面*/ this.refresh = function() { this.curUrl = location.hash.slice(1) || '/'; //获取当前hash this.routes[this.curUrl](); //根据对应的hash执行回调函数 } //监听浏览器 url hash 更新事件。 this.init = function() { window.addEventListener("load", this.refresh.bind(this), false); window.addEventListener("hashchange", this.refresh.bind(this), false); } } var box = document.getElementById('refreshBox'); var R = new Route(); R.init(); R.route('/', function() { box.style.background = "blue"; box.innerHTML = "这是首页"; }); R.route('/product', function() { box.style.background = "red"; box.innerHTML = "这是产品页"; }); R.route('/service', function() { box.style.background = "yellow"; box.innerHTML = "这是服务页"; }); </script>
如何实现跨浏览存储
说一下什么是javascript的同源策略?
它是一种安全协议。指一段脚本只能读取来自同一来源的窗口和文档的属性,同一来源指的是端口,域名,协议相同。
为何要有同源限制?
好比一个黑客将真正的银行登陆的页面嵌入到他的页面,当用户登陆时它就能够经过js读取到你表单的内容。
如何解决跨域问题
一、JSONP/ Jsonp的原理。怎么去读取一个script里面的数据。
因为同源策略的限制,在js中不能够使用AJAX跨域请求,但能够在页面上引入不一样域的脚本。jsonp正是利用这个特性来实现的。
JSONP又叫填充式json,它由回调函数和传入回调函数的json数据组成。
原理是动态插入script标签,经过script标签引入一个js文件,这个文件载入成功后会执行咱们在url中指定的函数,而且会把服务器端输出的json数据做为参数传入。
<script type="text/javascript"> function jsonpCallback(result) { alert(result.msg); } </script> <script type="text/javascript" src="http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback"></script>
其中jsonCallback是客户端注册的,获取跨域服务器上的JSON数据后,回调的函数。http://crossdomain.com/jsonServerResponse?jsonp=jsonpCallback 这个url是跨域服务器取JSON数据的接口,参数为回调函数的名字,返回的格式为:jsonpCallback({msg:'this is json data'}) 。如此就生成了一段js语法的文档, 传回客户端就能够调用jsonpCallBack函数了.
优势:简单易用,兼容性好
缺点:
二、CORS(跨域资源共享)
它定义了浏览器和服务器是如何经过可控的方式来进行跨域通讯的,CORS经过一些列特殊的HTTP头还实现的,经过HTTP头信息能够容许双方判断请求应该是成功仍是失败。
三、经过修改document.domain来跨子域
将主域和子域的document.domain设置成同一个主域。前提条件:这两个域名必须属于同一个基础域名,并且所用的协议,端口都要一致,不然没法利用document.domain
进行跨域
四、使用window.name跨域
一个窗口内全部的页面共享一个window.name属性,能够读写。
五、使用HTML5提供的window.postMessage()来跨域传递数据。IE8+都支持
我的认为window.name方法既不复杂也能兼容几乎全部浏览器,因此比较好用。
iframe实现跨越的具体方法?
应用页面建立iframe,src指向数据页面;数据页面把数据附加到window.name上;应用界面监听iframe的onload事件,在此事件中设置这个iframe的src指向本地域的代理文件;获取数据后销毁iframe
ajax的内部原理
其核心有JavaScript、XMLHTTPRequest、DOM对象组成,经过XmlHttpRequest对象来向服务器发异步请求,从服务器得到数据,而后用JavaScript来操做DOM而更新页面。
建立ajax过程
readyState几个状态的含义
存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
原生jquery的ajax实现,具体思路
原生:
//首先检查浏览器是否支持XMLHttpRequest对象。 var xhr; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHTTP") }; var xhr = new XMLHttpRequest(); //能够向URL添加须要发送的数据 //为了不获得缓存的结果能够向URL添加一个惟一的id //xhr.open("GET","demo_get.asp?t=" + Math.random(),true); xhr.open("GET", "test.php?key1=value1&key2=value2", true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var result = xhr.responseText; }; } xhr.send();
jquery:
$.ajax()是最底层的AJAX实现。它包含一个对象参数,以键值对的方式提供该方法的请求设置和回调函数。
$.ajax({ /*发送请求的地址*/ url: "url", /*请求的方式*/ type: "POST/GET", /*是否异步*/ async: true, 发送到服务器的数据 data: { name: "furong", age: 20 }, /*服务器返回数据类型*/ dataType: "json/html/xml/text/jsonp/script", /*请求成功后的回调函数*/ success: function(data, status, xhr) { //..callback }, /*请求失败时的回调函数*/ error: function() { //error } });
同步和异步的区别
同步:js代码加载到当前AJAX的时候,页面里全部的代码都会中止加载,当AJAX执行完毕后才会执行ajax后面的代码,页面会出现假死状态。
异步:当ajax发送请求,等待服务器端返回数据的这个过程中,前台会继续执行ajax后面的代码,也就是说这时候是两个线程(ajax发送的线程和ajax块后的线程)
ie各版本和chrome能够并行下载多少个资源
IE6 两个并发,iE7升级以后的6个并发,以后版本也是6个 Firefox,chrome也是6个
ajax的优缺点和在IE下的问题?
优势:
缺点:
IE缓存问题:在IE下,若是是GET请求,而且URL不变,这个结果会被缓存
解决办法:能够向URL添加一个惟一的id
xhr.open("GET","demo_get.asp?t=" + Math.random(),true);
ajax请求的时候get 和post方式的区别?
什么状况下分别使用GET和POST?
POST:
GET:
Post一个file的时候file放在哪的?
请求实体
ajax请求时,如何解释json数据
原生js的AJAX:
Jquery的AJAX:
jquery异步请求将type设为“json”,若是不添加该条属性,则返回来的为字符串。或者利用$.getJSON()方法得到服务器返回json数据,这时候返回的就是json对象了
$.each()是用来在回调函数中解析JSON数据的方法
$.each( collection, callback(indexInArray, valueOfElement) )
success : function(data) { $.each(data.list,function(index,item){ alert(item.id); }) }
多个ajax怎么处理
Ajax 同时处理多个异步请求,可能出现这样的错误:只有最后一个异步请求有效,其余的都没效果。因此当咱们执行完一次异步请求就应该把此次建立出来的 XMLHttpRequest 对象删除,而后再执行下一次异步请求。删除使用 delete 便可:delete xhr;
<body> <p>Input1:<input type="text" id="first" /> <span id="firstSpan"></span></p> <p>Input2:<input type="text" id="second" /> <span id="secondSpan"></span></p> <p>Input3:<input type="text" id="three" /> <span id="threeSpan"></span></p> <p><input type="button" value="发送" onclick="test();" /></p> </body> </html> <script language="javascript"> function getData(url, input, label) { var xhr; if (window.ActiveXObject) { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } else if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } var val = document.getElementById(input).value; var realUrl = url + "?time=" + new Date().getTime() + "&text=" + val;
//GET请求查询字符串必须进行编码。并且全部的键值对必须&分割 realUrl = encodeURI(encodeURI(realUrl)); xhr.onreadystatechange = function() { if (xhr.readyState==4 && xmlHttp.status==200) { var labelSpan = document.getElementById(label); labelSpan.innerHTML = decodeURI(xhr.responseText); delete xhr; // 手动删除 xhr = null } } xmlHttp.open('GET', realUrl); xmlHttp.send(null); } function test() { getData('index.php', 'first', 'firstSpan'); getData('index.php', 'second', 'secondSpan'); getData('index.php', 'three', 'threeSpan'); } </script>
<?php header('Content-Type:text/html;Charset=utf-8'); echo $_GET['text']; ?>
JSON 的了解?
XML和JSON的区别?
JSON字符串转换为JSON对象(互转)
一个页面从输入 URL 到页面加载显示完成,这个过程当中都发生了什么?(流程说的越详细越好)
说说TCP传输的三次握手四次挥手策略
一、三次握手:为了将数据准确无误的送达目标处,TCP协议采用三次握手策略。
三次握手的过程是:
在这个过程中,若是发送方在规定的延迟时间内没有收到回复则默认接收方没有收到请求,TCP协议会再次发送数据包。直到收到回复为止。
二、断开一个TCP链接须要四次握手:
其余 HTTP 请求方法
在请求头的第一行包含了请求的方法,它包括OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE
TCP和UDP的区别
HTTP状态码
HTTP最多见的响应头
http请求头有哪些字段
HTTP和HTTPS
http的端口号,ftp的端口号
为何HTTPS安全
关于Http 2.0 你知道多少?、http1和http2的区别
什么是Etag?应用
web缓存,浏览器怎么知道要从缓存获取;
有没有方法不请求不通过服务器直接使用缓存。(强缓存和协商缓存的命中和管理)、浏览器缓存的区别
Expires和Cache-Control
Expires和Cache-Control是http响应头信息,都用来表示资源在客户端缓存的有效期。浏览器强缓存就是利用它们来实现的。
Expires是较老的强缓存管理header,它是服务器返回的一个绝对时间。用GMT格式的字符串表示。它的缓存原理是:
Cache-Control是比较新的缓存管理header,它是一个相对时间,单位是秒,它的缓存原理是:
304与200读取缓存的区别?讲讲304缓存的原理
禁止缓存,期限,修改/请列举三种禁止浏览器缓存的头字段, 并写出相应的设置值
1.加载文件的时候在文件末尾给一个时间戳做为版本参数以强制刷新
<script>
var js = document.createElement("script");
js.src = "test.js?random" + Math.random(); document.body.appendChild(js); </script>
2.meta方法:在meta标签里设置http-equiv属性,它是用来在HTML文档中模拟HTTP响应头报文的东西。
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="0">
在css/js代码上线以后开发人员常常会优化性能,从用户刷新网页开始,一次js请求通常状况下有哪些地方会有缓存处理?
webscoket会用吗?webSocket如何兼容低浏览器,websocket原理,应用场景
一、webscoket是HTML5提供的传输协议。websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。它能够将服务器的更新及时主动的发给客户端,而不须要客户端以必定时间间隔去轮询。
二、目前主流的浏览器都支持这个协议,IE还不支持。如何兼容呢?
Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基于 multipart 编码发送 XHR 、 基于长轮询的 XHR
三、原理:Websocket的数据传输是frame形式传输的,好比会将一条消息分为几个frame,按照前后顺序传输出去。这样作会有几个好处:
四、应用场景:社交聊天、弹幕、多玩家游戏、协同编辑、基于位置的应用、体育实况更新、视频会议/聊天等须要高实时的场景
说说网络分层里七层模型是哪七层(从上到下)
各类协议
介绍一下你对浏览器内核的理解?
主要分为渲染引擎和JS引擎,浏览器内核不一样致使渲染的效果不一样。
介绍经常使用的几种浏览器和内核
WEB应用从服务器主动推送Data到客户端有那些方式?
上述的1和2统称为comet技术
线程与进程的区别
渐进加强和优雅降级
网站打开比较卡,你怎么优化;
优化网站代码,对网站进行重构。
你有哪些性能优化的方法?
为何利用多个域名来存储网站资源会更有效?
网站资源指网站的图片、视频、js、css。服务器直接把相应文件发送到客户端的文件都是静态资源。(动态资源通常指数据库资源)。
关于多域名,也不是越多越好,浏览器作dns解释也是耗时间的,因此控制在2~4个之间。
移动端性能优化
谈谈你对重构的理解
网站重构也就是说是在不改变UI的状况下,对网站进行优化,简化结构、添加可读性。
对于传统的网站来讲重构一般是:
深层次的网站重构应该考虑的方面:
一般来讲对于速度的优化也包含在重构中:
什么样的前端代码是好的
高复用低耦合,这样文件小,好维护,并且好扩展。
CDN,为何cdn比较快;
CDN:内容分发网络,由于他让用户就近取得所需内容,能够使内容传输的更快,提升用户访问网站的速度。
怎样减小http请求次数
上线后,如何监控网站
能够使用一些监控工具,好比监控宝等等,若是访问不了,监控工具就会按照你设置的方式给你提醒。这个时候你就能够立刻知道问题并想办法解决。不用本身常常去手动访问尝试了。
打不开网站,什么缘由形成的,解决办法
你如何对网站的文件和资源进行优化?
你都使用哪些工具来测试代码的性能?
一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。
谈谈之前端角度出发作好SEO须要考虑什么?
你日常写CSS的时候有考虑过CSS的性能么
reflow和repaint(重排和重绘)
1.repaint(重绘):改变DOM元素的视觉效果时会触发,使浏览器变慢,由于改变某个元素的视觉效果会check这个DOM元素内的全部节点,会从新对DOM渲染。
好比:opacity、background-color、visibility、outline
2.reflow(回流):改变DOM元素的位置时会触发,比repaint开销更大,由于他会从新计算全部元素的位置和占用的面积,这样会引发整个页面的从新渲染,他也会触发repaint。(display:none的元素不会引起重排和重绘)
好比:js添加删除元素,用js改变DOM的可见性(display:none-block),添加删除或改变CSS样式,增长或移除样式表,css3的动画和过渡,使用offsetwidth和offsetheight。还有用户的一些操做:拖动窗口大小,表单输入值 ,改变字体大小,更换样式表等等
常见web安全及防御原理
1.CSRF(Cross-site request forgery):跨站请求伪造:攻击者盗用了你的身份,以你的名义发送恶意请求。
CSRF可以作的事情包括:以你名义发送邮件,发消息,盗取你的帐号,甚至于购买商品,虚拟货币转帐......形成的问题包括:我的隐私泄露以及财产安全。
2.xss (Cross Site Scripting):跨站脚本攻击:经过插入恶意脚本,实现对用户游览器的控制
3.sql注入:以SQL语句做为用户输入,从而达到查询/修改/删除数据的目的
哪些地方会出现css阻塞,哪些地方会出现js阻塞?
CSS 原本是能够并行下载的,当 CSS 后面跟着嵌入的 JS 的时候,该 CSS 就会出现阻塞后面资源下载的状况。由于浏览器会维持 html 中 css 和 js 的顺序,样式表必须在嵌入的 JS 执行前先加载、解析完。而嵌入的 JS 会阻塞后面的资源加载,因此就会出现上面 CSS 阻塞下载的状况。
全部浏览器在下载 JS 的时候,会阻止一切其余活动,好比其余资源的下载,内容的呈现等等。直到 JS 下载、解析、执行完毕后才开始继续并行下载其余资源并呈现内容。
Javascript无阻塞加载具体方式
写出几种IE6 BUG的解决方法
常见兼容性问题?
列举IE 与其余浏览器不同的特性?
超连接访问事后hover样式就不出现的问题是什么?如何解决?
Node.JS
了解Node么?Node的使用场景都有哪些?
对Node的优势和缺点提出了本身的见解?
.如何判断当前脚本运行在浏览器仍是node环境中?
你都用过哪些前端框架?为何选择这个框架?
博客主要经过Angular这个框架搭建的。
Angualr是一款基于MVC的框架,MVC是模型,视图,控制器的缩写。模型负责数据保存,视图负责用户界面,控制器负责业务逻辑。
主要应用于单页面的WEB应用。提供了许多功能,例如双向数据绑定,AJAX服务,路由,模块化等。
博客大体过程就是经过视图,路由等功能搭建了页面,在控制器里经过点击不一样的连接向AJAX请求服务器端的数据。经过php操做数据库进行数据库的查询,再将返回的数据显示在视图上。
在这个过程中也出现了许多问题,例如:在数据传递过程中会出现各类各样的错误,这时候就要调试清楚究竟是哪一个环节出了问题。
AngularJS:
它拓展了HTML,提供了丰富的指令。例如
每个ng-controller都有一个做用域,$scope对象拥有属性和方法,当把scope对象加到控制器时,视图就能够获取这些属性。
每个应用都有一个rootscope根做用域,也就是说它的属性和方法能够做用在app的全部元素当中
Angular还具备http服务,用于读取远程服务器上的数据
$http.get("data/clickRate.php").success(function(response) { $scope.clickRate = response; });
Angular还提供路由。它主要经过#号来实现,由于url中#号后面的内容会被忽略掉,点击连接时向服务器请求的地址是相同的。每当点击链接时就会显示不一样的内容。
Angular优势缺点
Angular JS (Angular.JS) 是一组用来开发Web页面的框架
优势:
是一个比较完善的MVC框架,包含了模板,双向数据绑定,路由功能。双向数据绑定多是AngularJS最酷最实用的特性,将MVC的原理展示地淋漓尽致.
自带丰富的angular指令,无需进行手工DOM操做。
AngularJS很小,只有60K,兼容主流浏览器,与 jQuery 配合良好
缺点:
angular的双向绑定原理
Angular实现了双向绑定机制。所谓的双向绑定,无非是从界面的操做能实时反映到数据,数据的变动能实时展示到界面。
Bootstrap了解程度
对于SASS或是Less的了解程度?喜欢那个?
你以为jQuery或zepto源码有哪些写的好的地方
react native是怎么作到用js调用原生API的?怎么把js代码和java或者OC链接起来的?介绍底层的实现
如何评价AngularJS和BackboneJS
jquery绑定click的方法有几种
vue.js双向绑定的原理,讲一讲MVVM
jQuery源码有看过吗?请说出你印象最深入部分的原理。
请说出jQuery内部判断数据类型的巧妙方式。
针对 jQuery 的优化方法?
你从jQuery学到了什么?
Jquery与jQuery UI 有啥区别?在jquery方法和原型上面添加方法的区别和实现($.extend,$.fn.extend),以及jquery对象的实现(return new jQuery.fn.init)
jquery 中如何将数组转化为json字符串,而后再转化回来?
react虚拟DOM为何有优点,我用原生的为啥就慢,是什么缘由;
工具
对于前端自动化构建工具备了解吗?简单介绍一下
你经常使用的开发工具是什么,为何?
用过哪些自动化构建工具,怎么用的
谈谈你对webpack的见解,webpack底层实现原理,webpack是用来干吗的
平时如何管理你的项目?
新技术
说说最近最流行的一些东西吧?常去哪些网站?
对前端模块化的认识
ES6的了解,es6哪些特性比较吸引你,ES6里头的箭头函数的this对象与其余的有啥区别
requireJS的原理是什么? requirejs怎么防止重复加载
说说你对Promise的理解,构造一个 Promise,用promise手写ajax
babel是如何将es6代码编译成es5的
说说你对AMD和Commonjs的理解
说说你对MVC和MVVM的理解
AMD和CMD 规范的区别
模块化怎么作?
如何将项目里面的全部的require的模块语法换成import的ES6的语法?
看过那些书(高级程序设计看了几遍,有啥收获)
对数据库的了解,mysql与 MongoDB的区别
分别说说同步和异步模块化的应用场景,说下AMD异步模块化实现的原理?
一个静态资源要上线,里面有各类资源依赖,你如何平稳上线
若是要你去实现一个前端模板引擎,你会怎么作
手指点击能够触控的屏幕时,是什么事件?
编写一个b继承a的方法;
function A(name){ this.name = name; this.sayHello = function(){alert(this.name+" say Hello!");}; } function B(name,id){ A.call(this,name); //在子类型的构造函数内部调用父类型的构造函数 this.id = id; } var b=new B("furong",1) b;//B {name: "furong", id: 1, sayHello: function}
实现一个函数clone,能够对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制
原始类型和引用类型克隆的时候有很大区别,由于原始类型存储的是简单的数据段,引用类型存储的是对象在内存当中的地址。
浅克隆:原始类型值传递,引用类型引用传递。
深克隆:对新对象的修改不会影响到原来的对象。
tips:咱们直接经过普通赋值的方式,就实现了函数的克隆,由于函数的克隆会在内存单独开辟一块空间,互不影响。
function isClass(obj){ return Object.prototype.toString.call(obj).slice(8,-1); } function deepClone(obj){ var type=isClass(obj); var result; if (type==="Array") { result=[]; }else if(type==="Object"){ result={}; }else{ //除了数组和对象,其余类型的数据均可以经过简单赋值进行克隆。 return obj; }; //对象属性的遍历 for (var key in obj) { //继续判断属性的数据类型 if (isClass(obj[key])=="Object" || isClass(obj[key])=="Array") { //若是属性值的对象,递归调用 result[key]=deepClone(obj[key]); } else{ //若是属性都是简单的数据段,直接赋值 result[key]=obj[key]; } } return result; }
编写一个方法 求一个字符串的字节长度
英文字母字节数=length,一个中文占两个字节,因此咱们须要把中文的个数计算出来
ASCII 字符集的码值从 0 到 255,表明了字母、数字、标点符号和其余字符
能够经过charCodeAt(i)获取每一个位置的Unicode编码判断是否为中文字符
function getBytes(str){ var len=str.length; var result=len; for (var i = 0; i < len; i++) { if (str.charCodeAt(i)>255) { result++; }; }; return result; }
获取url后面的参数并变为对象
function getSearchObj(){ var qs=location.search.length>0?location.search.subString(1):'', obj={}, items=qs.length>0?qs.split('&') : [], item=null; name='', value='', i=0; len=items.length; for (var i = 0; i < len; i++) { item=items[i].split('='); name=decodeURIComponent(item[0]); value=decodeURIComponent(item[1]); obj[key]=value? value : undefined; } return obj; }
三级菜单的实现,简单描述下你的实现过程;不用框架
<ul class="menu"> <li class="level1">一级菜单 <ul class="level2"> <li class="level2-2">二级菜单1 <ul class="level3"> <li>1-2-3</li> <li>1-2-3</li> <li>1-2-3</li> </ul> </li> <li class="level2-2">二级菜单1 <ul class="level3"> <li>2-2-3</li> <li>2-2-3</li> <li>2-2-3</li> </ul> </li> <li class="level2-2">二级菜单1 <ul class="level3"> <li>3-2-3</li> <li>3-2-3</li> <li>3-2-3</li> </ul> </li> </ul> </li> <li class="level1">一级菜单 <ul class="level2"> <li>二级菜单2</li> <li>二级菜单2</li> <li>二级菜单2</li> </ul> </li> <li class="level1">一级菜单 <ul class="level2"> <li>二级菜单3</li> <li>二级菜单3</li> <li>二级菜单3</li> </ul> </li> </ul>
使二级菜单level2和三级菜单level3的display设置为none;绝对定位,left设置为宽度的值;高度为32px;
在js里,
window.onload = function() { var level1 = document.getElementsByClassName("level1"); var level2 = document.getElementsByClassName("level2"); var level20Li = document.getElementsByClassName("level2-2"); var level30 = document.getElementsByClassName("level3"); for (var i = 0; i < level1.length; i++) { level1[i].onmouseover = (function(i) { return function() { level2[i].style.display = "block"; level2[i].style.top = (i * 32 + "px"); } })(i); level1[i].onmouseout = (function(i) { return function() { level2[i].style.display = "none"; } })(i); } for (var i = 0; i < level20Li.length; i++) { level20Li[i].onmouseover = (function(i) { return function() { console.log(i); level30[i].style.display = "block"; level30[i].style.top = (i * 32 + "px"); } })(i); level20Li[i].onmouseout = (function(i) { return function() { level30[i].style.display = "none"; } })(i); } }
(function() { var menu = document.getElementById("menu"); var level1 = menu.getElementsByClassName("level1"); var level2 = menu.getElementsByClassName("level2"); addEvent(level1); addEvent(level2); function addEvent(objects) { var len=objects.length; for (var i = 0; i < len; i++) { objects[i].onmouseover = function() { var children = this.childNodes; for (var j = 0; j < children.length; j++) { if (children[j].nodeName == "UL") { children[j].style.display = "block"; } } } objects[i].onmouseout = function() { var children = this.childNodes; for (var j = 0; j < children.length; j++) { if (children[j].nodeName == "UL") { children[j].style.display = "none"; } } } } } })();
一个table,点击按钮,实现某一列的刷新,不能采用框架,简单描述下实现过程
<body> <table id="tb" border="1" style="border-collapse: collapse;"> <thead> <tr> <th>name</th> <th onclick="update(this)">age</th> </tr> </thead> <tbody> <tr> <td>A</td> <td>12</td> </tr> <tr> <td>b</td> <td>18</td> </tr> <tr> <td>c</td> <td>30</td> </tr> </tbody> </table> <script type="text/javascript"> function update(btn) { var table = document.getElementById("tb"); var tbody=table.tBodies[0]; var getObj = function(table) { var arr = [], rows = table.tBodies[0].rows, len = rows.length; for (var i = 0; i < len; i++) { var key = rows[i].cells[0].innerHTML; var value=rows[i].cells[1].innerHTML; arr[i]={ name:key, age:value } } return arr; } var arr=getObj(table); arr.sort(function(a,b){ return b.age-a.age; }) tbody.innerHTML=""; for (var i = 0,len=arr.length; i < len; i++) { tbody.insertRow(i); tbody.rows[i].innerHTML="<td>"+arr[i].name+"</td><td>"+arr[i].age+"</td>"; } } </script> </body>
点击按钮后把数据存在数组里,数组元素是对象存放name和age,而后按照age排序,清空tbody后把内容逐次加到列表当中
window.onload = function() { var btn = document.getElementById('age');//获取要刷新那一行的按钮 var tbody = document.getElementsByTagName('tbody')[0]; var tr = tbody.getElementsByTagName('tr'); var age = [],//保存哪一行的数据 result = [];//保存刷新后的值 for (var i = 0; i < tr.length; i++) { var msg = parseInt(tr[i].getElementsByTagName('td')[2].innerHTML); var brr = [msg, i] age.push(brr);//将每一行的数据和对应的行数保存在二维数组中 }; flag = true;//只能点击一次 btn.onclick = function() { if (flag) { age = age.sort();//从小到大排序 for (var i = 0; i < age.length; i++) { var key = age[i][1]; result.push(tr[key]);//将排序后的tr保存起来 }; tbody.innerHTML = ""; for (var i = 0; i < result.length; i++) { tbody.appendChild(result[i]);//更新整个table }; flag = false; }; } }
实现一个可拖动的div(要考虑到浏览器兼容性)
/*盒子设置宽高,而且相对定位*/ #box { width: 100px; height: 100px; background-color: red; position: relative; }
//肯定窗口大小 var screenheight=document.body.clientHeight /*混杂模式*/ ||document.documentElement.clientHeight /*标准模式*/ ||window.innerHeight; /*移动设备*/ var screenwidth= document.body.clientWidth /*混杂模式*/ ||document.documentElement.clientWidth /*标准模式*/ ||window.innerWidth;
/* a) 给须要拖拽的节点绑定mousedown, mousemove, mouseup事件 b) mousedown事件触发后, 开始拖拽 c) mousemove时, 须要经过event.clientX和clientY获取拖拽位置, 并实时更新位置 d) mouseup时, 拖拽结束 e) 须要注意浏览器边界的状况*/
<body> <div id="div" style="width: 100px;height: 100px;background: red;position: absolute;"> </div> <script> var div = document.getElementById("div"); var pageWidth = document.documentElement.clientWidth || document.body.clientWidth || window.innerWidth; var pageHeight = document.documentElement.clientHeight || document.body.clientHeight || window.innerHeight; div.onmousedown = function(e) { var e = e || window.event; var a = e.clientX - div.offsetLeft; var b = e.clientY - div.offsetTop; div.onmousemove = function(e) { console.log(this.offsetHeight) var c = e.clientX - a; var d = e.clientY - b; if (c < 0) c = 0; if (d < 0) d = 0; if (c > pageWidth - this.offsetWidth) c = pageWidth - this.offsetWidth; if (d > pageHeight - this.offsetHeight) d = pageHeight - this.offsetHeight; this.style.left = c + 'px'; this.style.top = d + 'px'; } this.onmouseup = function() { div.onmousemove = null; } }
让写个从几个li中取下标的闭包代码
<body> <ul> <li>0</li> <li>1</li> <li>2</li> </ul> <script type="text/javascript"> window.onload=function(){ /*方法一:循环:闭包*/ /*var li=document.getElementsByTagName("li"); for (var i = 0; i < li.length; i++) { li[i].onclick=(function(i){ return function(){ alert(i); } })(i) };*/ //方法二:事件代理 var ul=document.getElementsByTagName("ul")[0]; ul.onclick=function(e){ console.log(e.target.innerHTML) } } </script> </body>
手写闭包,继承,
//闭包内的变量不会被垃圾回收机制回收 function fn(){ var n=0; return function(){ n++; console.log(n); } } var foo=fn(); foo();//1 foo();//2 foo();//3
手写事件绑定
var EventUtil={ addEvent:function(item,type,fn){ if (item.addEventListener) { item.addEventListener(type,fn,false); }else if (item.attachEvent) { item.attachEvent('on'+type,fn) //IE }else{ item['on'+type]=fn; } }, removeEvent:function(item,type,fn){ if (item.removeEventListener) { item.removeEventListener(type,fn,false); }else if (item.detachEvent) { item.detachEvent('ob'+type,fn) //IE }else{ item['on'+type]=null; } }, getEvent:function(e){ return e || window.event; }, getTarget: function(e) { var e = this.getEvent(e); var target = e.target || e.srcElement; if (target.nodeType === 3) {//空白节点 target = target.parentNode; } return target; } }
手写一个原生ajax
<body> <button id="btn" type="button">AJAX局部刷新</button> <div id="result"></div> <script type="text/javascript"> var btn=document.getElementById("btn"); var result=document.getElementById("result"); btn.onclick=function(){ var xhr=null; if (window.XMLHttpRequest) { xhr=new XMLHttpRequest(); }else{ xhr=new ActiveXObject("Microsoft.XMLHTTP") } xhr.open("GET","url",true); xhr.onreadystatechange=function(){//建立一个响应HTTP请求变化的函数 if (xhr.readyState===4 && xhr.status===200) { //使用JavaScript和DOM局部刷新页面 result.innerHTML=xhr.responseText; } } xhr.send(null); } </script>
手写实现jquery里面的insertAfter(结合nextSibling和insertBefore来实现)
<script type="text/javascript"> window.onload = function() { var one = document.getElementById("one"); var two = document.createElement("div"); two.innerHTML = "2"; function insertAfter(two, one) { var parent = one.parentNode; // 看子元素里有几个属性节点 var child = parent.childNodes; var count = 0; for (var i = 0; i < child.length; i++) { if (child[i].nodeType === 1) { count++; }; }; /*若是只有一个*/ if (count == 1) { parent.appendChild(two); } else { //判断下一个节点是元素节点,nodeType=1 var three = one.nextSibling; while (three.nodeType != 1) { three = three.nextSibling; }; parent.insertBefore(two, three); } } insertAfter(two, one); }
toggleClass实现
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>toggle</title> <style> #test { width: 400px; height: 300px; margin: 50px auto; } .red { border: 5px solid red; } .opacity { opacity: 0.2; } .yellow { background-color: yellow; } </style> </head> <body> <div id="test" class="yellow"></div> <br/> <div style="text-align:center;margin:0 auto"> <button type="button" onclick="toggleClass('red')">红色边框</button> <button type="button" onclick="toggleClass('opacity')">内填充</button> </div> <script type="text/javascript"> var ele = document.getElementById('test'); //获得元素 function toggleClass(newClass) { var currentClass = ele.className;//获取当前样式 var arr = []; var exist = false;//用变量来标识类是否存在 if (!currentClass) {//若是当前样式不存在,直接添加 ele.className = newClass; } else {//若是存在 arr = currentClass.split(' ');//将样式存放在数组里方便判断里面是否存在新的样式 for (var i = 0; i < arr.length; i++) { if (arr[i] == newClass) {//若是发现存在 exist = true;//标记为当前样式中存在新的样式 ele.className = currentClass.replace(newClass, '').trim();//经过字符串的replace方法去除样式,在赋值给元素的className break;//退出循环 } } if (!exist) {//若是当前样式中都不存在新的样式 ele.className=currentClass+' '+newClass;//将样式添加到当前样式当中 }; } } </script> </body> </html>
写一个通用的事件侦听器函数?
window.onload = function() { var Event = { /*视能力分别使用dom2||IE||dom0方式 来绑定事件*/ addEvent: function(ele, type, fn) { if (ele.addEventListener) { ele.addEventListener(type, fn, false); } else if (ele.attachEvent) { ele.attachEvent('on' + type, function() { fn.call(ele); }); } else { ele['on' + type] = fn; } }, removeEvent: function(ele, type, fn) { if (ele.removeEventListener) { ele.removeEventListener(type, fn, false); } else if (ele.detachEvent) { ele.detachEvent('on' + type, fn); } else { ele['on' + type] = null; } }, stopProrpgation: function(e) { e = this.getEvent(e); console.log(e); if (e.stopProrpgation) { e.stopProrpgation(); } else { e.cancleBubble = true; } }, preventDefault: function(e) { e = this.getEvent(e); if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } }, getEvent: function(e) { return e || window.event; }, getTarget: function(e) { var e = this.getEvent(e); var target = e.target || e.srcElement; if (target.nodeTypr === 3) { target = target.parentNode; } return target; } } var btn = document.getElementById('btn'); function handler() { /*alert(this.id);*/ Event.getEvent(); Event.stopProrpgation(); Event.preventDefault(); } Event.addEvent(btn, 'click', handler); /* Event.removeEvent(btn, 'click', handler);*/ }
如何获取UA
用来代表用户的浏览器名称和版本,操做系统等信息。在每一次HTTP请求中,响应头部都会包含UA字符串,用于浏览器识别和数据统计。在js中能够用navigator.userAgent属性来获取本浏览器的UA字符串。UA可让网页开发者可以根据不一样的浏览器发送不一样的显示内容,为了不浏览器不支持的功能,以得到更好的用户体验。例如“Mozilla/1.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101Firefox/4.0.1”,此字符串代表这是一个 Windows 版的使用 Gecko 引擎(火狐浏览器内核)的火狐浏览器。
<form name="Browser"> 浏览器名称:<input type="text" name="appCodeName" ><br> 完整的浏览器名称:<input type="text" name="appName" ><br> 浏览器版本:<input type="text" name="appVersion" ><br> 浏览器的用户代理字符串:<input type="text" name="userAgent" ><br> <button type="button" onclick="getUA()">点击获取浏览器信息</button> </form> <script> function getUA(){ document["Browser"][0].value=navigator.appCodeName; document["Browser"][1].value=navigator.appName; document["Browser"][2].value=navigator.appVersion; document["Browser"][3].value=navigator.userAgent; } </script>
字符串匹配,一个字符串子在另外一个字符串中出现的次数
function getStrNum(subStr,str){ //RegExp构造函数动态建立正则表达式,RegExp构造函数第一个参数是正则表达式主题部分, //第二个参数可选,是正则的修饰符,g表示全局搜索 var pattern=new RegExp(subStr,'g');//全局匹配的正则对象 // return str.match(pattern).length; }
将一篇文章的每一个单词首字母大写;不改变原有的格式
function tooUpperLetter(str) { return str.replace(/\b\w+\b/g, function(word) { return word.substring(0, 1).toUpperCase() + word.substring(1); }) }
快排实现的原理
function quickSort(arr){ if (arr.length<=1) return arr; var left=[],right=[]; var num=Math.floor(arr.length/2);//取得中间的数值,将它从数组中删除 var value=arr.splice(num,1); for (var i = 0; i < arr.length; i++) { if (arr[i]<value) { left.push(arr[i]); }else{ right.push(arr[i]); } } return arguments.callee(left).concat(numValue,arguments.callee(right)); }
请用Css写一个简单的幻灯片效果页面
百度搜索框
手机某一行均分为四个,不知道尺寸的状况下
如何本身实现一个alert
三个tab页面,实现代码
有没有写过插件,用js写过什么(而后就是具体描述怎么实现的)
给你一个url,判断是不是同一个域名(qq.com)下的
图片预加载
.js:写一个递归。就是每隔5秒调用一个自身,一共100次。
js轮播实现思路
使用js画一个抛物线,抛物线上有个小球随着抛物线运动,有两个按钮能使小球继续运动中止运动
实现两个大整数的相加,怎么实现两个大整数的相乘说下思路
说下选择排序,冒泡排序的实现思路
url去参数的题
手写一个盒子模型中,获取盒子内子节点的class样式
深度遍历DOM节点
复杂的酒店预订table
手写jsonp的实现
手写链表倒数第K个查找
手写一个jQuery插件
手写一个简单遍历算法
手写归并排
实现两个数组的排序合并,我一开始先合并再排序,他不乐意,而后我用了相似插入排序的方法
手写实现一个promise(不会)
手写实现requireJS模块实现(想了半天才想到createElement("script"),配合异步来加载,闭包导出)
JS配合DOM实现EChart柱状图
有移动端的经验么?
移动端适配问题
1) <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />
//width=device-width :强制让文档的宽度与设备的宽度保持1:1
// initial-scale=1.0:文档初始化缩放比例是1:
//user-scalable=0:不容许用户点击屏幕放大浏览,
//maximum-scale=1.0:容许用户缩放到的最大比例,
注意:content里多个属性的设置必定要用逗号+空格来隔开,若是不规范将不会起做用。
其余属性有:width;height; initial-scale; minimum-scale; maximum-scale; user-scalable;
2) <meta name="apple-mobile-web-app-capable" content="yes" />
//iPhone私有标签,它表示:容许全屏模式浏览
3) <meta name="apple-mobile-web-app-status-bar-style" content="black" />
//iPhone私有标签,它指定的iPhone中safari顶端的状态条的样式
4) <meta name="format-detection" content="telephone=no; email=no" /> //不识别邮件和不把数字识别为电话号码
你用了移动端的什么库类和框架?
移动端要注意哪些
适配有去考虑么,retina屏幕啊?
你以为哪些站点前端技术比较好的?或者说你平时怎么学前端的?看过哪些前端的书
你有什么规划?
你所了解的前端技术栈有哪些
你有什么问题要问的么?前端妹子的发展路线都有哪些?前端技术多而杂,好的学习方法?
移动端和pc差异
自学经历
解释平衡二叉树,以及在数据结构中的应用
平衡二叉树相关知识
图论最短路径算法
数组和链表的区别,空间和时间上的优劣,查找和删除的选择
快排的时间复杂度和空间复杂度。
常见排序算法的时间复杂度
数据集A、数据集B大小500GB,电脑内存很小,如何求得AB的差集。
数组和链表的区别
后序遍历的实现代码
排序算法总结
栈和队列
冒泡快排算法思路,复杂度
整型数组全排列问题
virtual dom的实现,diff算法
对模块化了解吗?说说有哪些模块化的库,有了解过模块化的发展的历史吗?(commonJS,RequireJS,SeaJS)
分别说说同步和异步模块化的应用场景,说下AMD异步模块化实现的原理?(看JS设计模式的时候看过同步模块模式,因此我只答了同步模块化的实现,可是AMD异步的不会)
如何将项目里面的全部的require的模块语法换成import的ES6的语法?
复习数据结构 排序算法从新写一遍,二分,链表的算法,BFS,DFS,图论最短路径等算法,之前基础不错写了大量博客, 因此看看本身的博客,复习起来很快
刷前端面经 bind,debounce,once,深浅拷贝等的ployfill
事件委托,JQ链式调用实现,原生ajax,函数式,柯里化
常见的跨域方式和原理(主要是jsonp和CORS,记得CORS必定要动手本身写后端才能理解深入)
前端安全之XSS和CSRF,以及如何防护
ES6部分,let暂时性死区,箭头函数(this指针,arguments的坑),generator/iterator,promise,阮一峰老师的那本电子书
模块化历史以及同步异步原理
webpack 2.0 慕课网上看一个大神的视频,讲的很好
360奇舞团瓜瓜老师的性能优化的视频,关键渲染路径,网页渲染过程,资源对渲染的阻塞
根据前几轮面试暴露的缺点,作了下面的实践
80行代码的类工厂,原型链继承面向对象的一个实践
100行简单实现AMD异步模块加载器(JS设计模式这本书上有样例代码)
看Vue文档练手,而后阅读Vue.js早期源码,简单实现MVVM双向绑定,数组监听,简单指令实现
看gayhub上的仓库的代码,模仿virtual-dom的实现,diff算法