html面试题(一)--html css js

前端面试题汇总

一、HTML和CSS

1、你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?

IE: trident内核

Firefox:gecko内核

Safari:webkit内核

Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核

Chrome:Blink(基于webkit,Google与Opera Software共同开发)

2、每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗?

<!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前。此标签可告知浏览器文档使用哪种 HTML 或 XHTML 规范。(重点:告诉浏览器按照何种规范解析页面)

4、div+css的布局较table布局有什么优点?

改版的时候更方便 只要改css文件。

页面加载速度更快、结构化清晰、页面显示简洁。

表现与结构相分离。

易于优化(seo)搜索引擎更友好,排名更容易靠前。

5、 img的alt与title有何异同? strong与em的异同?

a:alt(alt text):为不能显示图像、窗体或applets的用户代理(UA),alt属性用来指定替换文字。替换文字的语言由lang属性指定。(在IE浏览器下会在没有title时把alt当成 tool tip显示)

title(tool tip):该属性为设置该属性的元素提供建议性的信息。

strong:粗体强调标签,强调,表示内容的重要性

em:斜体强调标签,更强烈强调,表示内容的强调点

6、你能描述一下渐进增强和优雅降级之间的不同吗?

渐进增强 progressive enhancement:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

优雅降级 graceful degradation:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。

“优雅降级”观点

“优雅降级”观点认为应该针对那些最高级、最完善的浏览器来设计网站。而将那些被认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段,并把测试对象限定为主流浏览器(如 IE、Mozilla 等)的前一个版本。

在这种设计范例下,旧版的浏览器被认为仅能提供“简陋却无妨 (poor, but passable)” 的浏览体验。你可以做一些小的调整来适应某个特定的浏览器。但由于它们并非我们所关注的焦点,因此除了修复较大的错误之外,其它的差异将被直接忽略。

“渐进增强”观点

“渐进增强”观点则认为应关注于内容本身。

内容是我们建立网站的诱因。有的网站展示它,有的则收集它,有的寻求,有的操作,还有的网站甚至会包含以上的种种,但相同点是它们全都涉及到内容。这使得“渐进增强”成为一种更为合理的设计范例。这也是它立即被 Yahoo! 所采纳并用以构建其“分级式浏览器支持 (Graded Browser Support)”策略的原因所在。

那么问题来了。现在产品经理看到IE6,7,8网页效果相对高版本现代浏览器少了很多圆角,阴影(CSS3),要求兼容(使用图片背景,放弃CSS3),你会如何说服他?

7、为什么利用多个域名来存储网站资源会更有效?

CDN缓存更方便

突破浏览器并发限制

节约cookie带宽

节约主域名的连接数,优化页面响应速度

防止不必要的安全问题

8、请谈一下你对网页标准和标准制定机构重要性的理解。

网页标准和标准制定机构都是为了能让web发展的更‘健康’,开发者遵循统一的标准,降低开发难度,开发成本,SEO也会更好做,也不会因为滥用代码导致各种BUG、安全问题,最终提高网站易用性。

9、请描述一下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仅仅是为了在本地“存储”数据而生。

10、简述一下src与href的区别。

src用于替换当前元素,href用于在当前文档和引用资源之间确立联系。

src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。

<script src =”js.js”></script>

当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。

href是Hypertext Reference的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,如果我们在文档中添加

<link href=”common.css” rel=”stylesheet”/>

那么浏览器会识别该文档为css文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用link方式来加载css,而不是使用@import方式。

11、知道的网页制作会用到的图片格式有哪些?

png-8,png-24,jpeg,gif,svg。

但是上面的那些都不是面试官想要的最后答案。面试官希望听到是Webp。(是否有关注新技术,新鲜事物)

科普一下Webp:WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。Facebook Ebay等知名网站已经开始测试并使用WebP格式。

在质量相同的情况下,WebP格式图像的体积要比JPEG格式图像小40%

13、在css/js代码上线之后开发人员经常会优化性能,从用户刷新网页开始,一次js请求一般情况下有哪些地方会有缓存处理?

答案:dns缓存,cdn缓存,浏览器缓存,服务器缓存。

14、一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。

图片懒加载,在页面上的未可视区域可以添加一个滚动条事件,判断图片位置与浏览器顶端的距离与页面的距离,如果前者小于后者,优先加载。

如果为幻灯片、相册等,可以使用图片预加载技术,将当前展示图片的前一张和后一张优先下载。

如果图片为css图片,可以使用CSSsprite,SVGsprite,Iconfont、Base64等技术。

如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验。

如果图片展示区域小于图片的真实大小,则因在服务器端根据业务需要先行进行图片压缩,图片压缩后大小与展示一致。

15、你如何理解HTML结构的语义化? 

去掉或样式丢失的时候能让页面呈现清晰的结构:

html本身是没有表现的,我们看到例如<h1>是粗体,字体大小2em,加粗;<strong>是加粗的,不要认为这是html的表现,这些其实html默认的css样式在起作用,所以去掉或样式丢失的时候能让页面呈现清晰的结构不是语义化的HTML结构的优点,但是浏览器都有有默认样式,默认样式的目的也是为了更好的表达html的语义,可以说浏览器的默认样式和语义化的HTML结构是不可分割的。

屏幕阅读器(如果访客有视障)会完全根据你的标记来“读”你的网页.

例如,如果你使用的含语义的标记,屏幕阅读器就会“逐个拼出”你的单词,而不是试着去对它完整发音.

PDA、手机等设备可能无法像普通电脑的浏览器一样来渲染网页(通常是因为这些设备对CSS的支持较弱)

使用语义标记可以确保这些设备以一种有意义的方式来渲染网页.理想情况下,观看设备的任务是符合设备本身的条件来渲染网页.

语义标记为设备提供了所需的相关信息,就省去了你自己去考虑所有可能的显示情况(包括现有的或者将来新的设备).例如,一部手机可以选择使一段标记了标题的文字以粗体显示.而掌上电脑可能会以比较大的字体来显示.无论哪种方式一旦你对文本标记为标题,您就可以确信读取设备将根据其自身的条件来合适地显示页面.

搜索引擎的爬虫也依赖于标记来确定上下文和各个关键字的权重

过去你可能还没有考虑搜索引擎的爬虫也是网站的“访客”,但现在它们他们实际上是极其宝贵的用户.没有他们的话,搜索引擎将无法索引你的网站,然后一般用户将很难过来访问.

你的页面是否对爬虫容易理解非常重要,因为爬虫很大程度上会忽略用于表现的标记,而只注重语义标记.

因此,如果页面文件的标题被标记,而不是,那么这个页面在搜索结果的位置可能会比较靠后.除了提升易用性外,语义标记有利于正确使用CSS和JavaScript,因为其本身提供了许多“钩钩”来应用页面的样式与行为.

SEO主要还是靠你网站的内容和外部链接的。

便于团队开发和维护

W3C给我们定了一个很好的标准,在团队中大家都遵循这个标准,可以减少很多差异化的东西,方便开发和维护,提高开发效率,甚至实现模块化开发

17、有哪项方式可以对一个DOM设置它的CSS样式? 

外部样式表,引入一个外部css文件

内部样式表,将css代码放在 <head> 标签内部

内联样式,将css样式直接定义在 HTML 元素内部

18、CSS都有哪些选择器?

派生选择器(用HTML标签申明)

id选择器(用DOM的ID申明)

类选择器(用一个样式类名申明)

属性选择器(用DOM的属性申明,属于CSS2,IE6不支持,不常用,不知道就算了)

除了前3种基本选择器,还有一些扩展选择器,包括

后代选择器(利用空格间隔,比如div .a{  })

群组选择器(利用逗号间隔,比如p,div,#a{  })

那么问题来了,CSS选择器的优先级是怎么样定义的?

基本原则:

一般而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。

复杂的计算方法:

用1表示派生选择器的优先级

用10表示类选择器的优先级

用100标示ID选择器的优先级

div.test1 .span var 优先级 1+10 +10 +1

span#xxx .songs li 优先级1+100 + 10 + 1

#xxx li 优先级 100 +1

那么问题来了,看下列代码,<p>标签内的文字是什么颜色的?

<style>

.classA{ color:blue;}

.classB{ color:red;}

</style>

<body>

<p class='classB classA'> 123</p>

</body>

答案:red。与样式定义在文件中的先后顺序有关,即是后面的覆盖前面的,与在<p class=’classB classA’>中的先后关系无关。

19、CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?

最基本的:

设置display属性为none,或者设置visibility属性为hidden

技巧性:

设置宽高为0,设置透明度为0,设置z-index位置在-1000

20、超链接访问过后hover样式就不出现的问题是什么?如何解决?

答案:被点击访问过的超链接样式不在具有hover和active了,解决方法是改变CSS属性的排列顺序: L-V-H-A(link,visited,hover,active)

21、什么是Css Hack?ie6,7,8的hack分别是什么?

答案:针对不同的浏览器写不同的CSS code的过程,就是CSS hack。

示例如下:

1

2

3

4

5

6

7

8

9

10

11

12

#test       {  

        width:300px;  

        height:300px;  

        background-color:blue;      /*firefox*/

        background-color:red\9;      /*all ie*/

        background-color:yellow;    /*ie8*/

        +background-color:pink;        /*ie7*/

        _background-color:orange;       /*ie6*/    } 

        :root #test { background-color:purple\9; }  /*ie9*/

    @media all and (min-width:0px){ #test {background-color:black;} }  /*opera*/

    @media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} }       /*chrome and safari*/

24、行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗?

块级元素(block)特性:

总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示;

宽度(width)、高度(height)、内边距(padding)和外边距(margin)都可控制;

内联元素(inline)特性:

和相邻的内联元素在同一行;

宽度(width)、高度(height)、内边距的top/bottom(padding-top/padding-bottom)和外边距的top/bottom(margin-top/margin-bottom)都不可改变(也就是padding和margin的left和right是可以设置的),就是里面文字或图片的大小。

那么问题来了,浏览器还有默认的天生inline-block元素(拥有内在尺寸,可设置高宽,但不会自动换行),有哪些?

答案:<input> 、<img>、<button> 、<texterea>、<label>。

25、什么是外边距重叠?重叠的结果是什么?

外边距重叠就是margin-collapse。

在CSS当中,相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的外边距可以结合成一个单独的外边距。这种合并外边距的方式被称为折叠,并且因而所结合成的外边距称为折叠外边距。

折叠结果遵循下列计算规则:

两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。

两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。

两个外边距一正一负时,折叠结果是两者的相加的和。

26、rgba()和opacity的透明效果有什么不同?

rgba()和opacity都能实现透明效果,但最大的不同是opacity作用于元素,以及元素内的所有内容的透明度,

而rgba()只作用于元素的颜色或其背景色。(设置rgba透明的元素的子元素不会继承透明效果!)

27、css中可以让文字在垂直和水平方向上重叠的两个属性是什么?

垂直方向:line-height

水平方向:letter-spacing

那么问题来了,关于letter-spacing的妙用知道有哪些么?

答案:可以用于消除inline-block元素间的换行符空格间隙问题。

28、如何垂直居中一个浮动元素?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// 方法一:已知元素的高宽

#div1{

    background-color:#6699FF;

    width:200px;

    height:200px;

    position: absolute;        //父元素需要相对定位

    top: 50%;

    left: 50%;

    margin-top:-100px ;   //二分之一的height,width

    margin-left: -100px;

    }

//方法二:未知元素的高宽

  #div1{

    width: 200px;

    height: 200px;

    background-color: #6699FF;

    margin:auto;

    position: absolute;        //父元素需要相对定位

    left: 0;

    top: 0;

    right: 0;

    bottom: 0;

    }

那么问题来了,如何垂直居中一个<img>?(用更简便的方法。)

1

2

3

4

5

6

#container     //<img>的容器设置如下

{

    display:table-cell;

    text-align:center;

    vertical-align:middle;

}

29、px和em的区别。

px和em都是长度单位,区别是,px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,并且em会继承父级元素的字体大小。

浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。

30、描述一个”reset”的CSS文件并如何使用它。知道normalize.css吗?你了解他们的不同之处?

重置样式非常多,凡是一个前端开发人员肯定有一个常用的重置CSS文件并知道如何使用它们。他们是盲目的在做还是知道为什么这么做呢?原因是不同的浏览器对一些元素有不同的默认样式,如果你不处理,在不同的浏览器下会存在必要的风险,或者更有戏剧性的性发生。

你可能会用Normalize来代替你的重置样式文件。它没有重置所有的样式风格,但仅提供了一套合理的默认样式值。既能让众多浏览器达到一致和合理,但又不扰乱其他的东西(如粗体的标题)。

在这一方面,无法做每一个复位重置。它也确实有些超过一个重置,它处理了你永远都不用考虑的怪癖,像HTML的audio元素不一致或line-height不一致。

31、Sass、LESS是什么?大家为什么要使用他们?

他们是CSS预处理器。他是CSS上的一种抽象层。他们是一种特殊的语法/语言编译成CSS。

例如Less是一种动态样式语言. 将CSS赋予了动态语言的特性,如变量,继承,运算, 函数. LESS 既可以在客户端上运行 (支持IE 6+, Webkit, Firefox),也可一在服务端运行 (借助 Node.js)。

为什么要使用它们?

结构清晰,便于扩展。

可以方便地屏蔽浏览器私有语法差异。这个不用多说,封装对浏览器语法差异的重复处理,减少无意义的机械劳动。

可以轻松实现多重继承。

完全兼容 CSS 代码,可以方便地应用到老项目中。LESS 只是在 CSS 语法上做了扩展,所以老的 CSS 代码也可以与 LESS 代码一同编译。

32、display:none与visibility:hidden的区别是什么?

display : 隐藏对应的元素但不挤占该元素原来的空间。

visibility: 隐藏对应的元素并且挤占该元素原来的空间。

即是,使用CSS display:none属性后,HTML元素(对象)的宽度、高度等各种属性值都将“丢失”;而使用visibility:hidden属性后,HTML元素(对象)仅仅是在视觉上看不见(完全透明),而它所占据的空间位置仍然存在。

34、CSS中link和@import的区别是:

Link属于html标签,而@import是CSS中提供的

在页面加载的时候,link会同时被加载,而@import引用的CSS会在页面加载完成后才会加载引用的CSS

@import只有在ie5以上才可以被识别,而link是html标签,不存在浏览器兼容性问题

Link引入样式的权重大于@import的引用(@import是将引用的样式导入到当前的页面中)

35、简介盒子模型:

CSS的盒子模型有两种:IE盒子模型、标准的W3C盒子模型模型

盒模型:内容、内边距、外边距(一般不计入盒子实际宽度)、边框

36、为什么要初始化样式?

由于浏览器兼容的问题,不同的浏览器对标签的默认样式值不同,若不初始化会造成不同浏览器之间的显示差异

但是初始化CSS会对搜索引擎优化造成小影响

37、BFC是什么?

BFC(块级格式化上下文),一个创建了新的BFC的盒子是独立布局的,盒子内元素的布局不会影响盒子外面的元素。在同一个BFC中的两个相邻的盒子在垂直方向发生margin重叠的问题

BFC是指浏览器中创建了一个独立的渲染区域,该区域内所有元素的布局不会影响到区域外元素的布局,这个渲染区域只对块级元素起作用

38、html语义化是什么?

当页面样式加载失败的时候能够让页面呈现出清晰的结构

有利于seo优化,利于被搜索引擎收录(更便于搜索引擎的爬虫程序来识别)

便于项目的开发及维护,使html代码更具有可读性,便于其他设备解析。

39、Doctype的作用?严格模式与混杂模式的区别?

<!DOCTYPE>用于告知浏览器该以何种模式来渲染文档

严格模式下:页面排版及JS解析是以该浏览器支持的最高标准来执行

混杂模式:不严格按照标准执行,主要用来兼容旧的浏览器,向后兼容

40、IE的双边距BUG:块级元素float后设置横向margin,ie6显示的margin比设置的较大。解决:加入_display:inline

41、HTML与XHTML——二者有什么区别?

1. 所有的标记都必须要有一个相应的结束标记

2. 所有标签的元素和属性的名字都必须使用小写

3. 所有的 XML 标记都必须合理嵌套

4. 所有的属性必须用引号"" 括起来

5. 把所有 < 和 & 特殊符号用编码表示

6. 给所有属性赋一个值

7. 不要在注释内容中使用"--"

8. 图片必须有说明文字

42、html常见兼容性问题?

1.双边距BUG float引起的  使用display

2.3像素问题 使用float引起的使用dislpay:inline -3px 

3.超链接hover 点击后失效  使用正确的书写顺序 link visited hover active

4.Ie z-index问题 给父级添加position:relative

5.Png 透明 使用js代码改

6.Min-height 最小高度 !Important解决’

7.select 在ie6下遮盖使用iframe嵌套

8.为什么没有办法定义1px左右的宽度容器(IE6默认的行高造成的,使用over:hidden,zoom:0.08line-height:1px)

9.IE5-8不支持opacity,解决办法:

.opacity {

   opacity: 0.4

   filter: alpha(opacity=60); /* for IE5-7 */

   -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; /* for IE 8*/

}

10. IE6不支持PNG透明背景,解决办法: IE6下使用gif图片

43、对WEB标准以及W3C的理解与认识

答:标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、使用外链css和js脚本、结构行为表现的分离、文件下载与页面速度更快、内容能被更多的用户所访问、内容能被更广泛的设备所访问、更少的代码和组件,容易维护、改版方便,不需要变动页面内容、提供打印版本而不需要复制内容、提高网站易用性。

44、行内元素有哪些?块级元素有哪些?CSS的盒模型?

答:块级元素:div ph1 h2 h3 h4 form ul
行内元素: a b br i spaninput select
Css盒模型:内容,border ,margin,padding

45、前端页面有哪三层构成,分别是什么?作用是什么?

答:结构层 Html 表示层 CSS 行为层 js。

46、Doctype作用? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?

    (1)、<!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前。告知浏览器的解析器,用什么文档类型 规范来解析这个文档。

    (2)、严格模式的排版和 JS 运作模式是  以该浏览器支持的最高标准运行。

    (3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。

    (4)、DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。

47、行内元素有哪些?块级元素有哪些?空(void)元素有那些?

(1)CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,比如div默认display属性值为“block”,成为“块级”元素;span默认display属性值为“inline”,是“行内”元素。 

(2)行内元素有:a b spanimg input select strong(强调的语气) 块级元素有:div ul ol li dl dtdd h1 h2 h3 h4…p 

(3)知名的空元素:     

<br><hr><img><input><link><meta>鲜为人知的是: <area><base><col><command>

<embed><keygen><param><source><track><wbr>

48、CSS的盒子模型?

(1)两种, IE 盒子模型、标准 W3C 盒子模型;IE 的content部分包含了 border 和 pading;

(2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border).

49、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)

   *   可继承:font-size font-family color, UL LI DL DD DT;

   *   不可继承 :borderpadding margin width height ;

   *   优先级就近原则,样式定义最近者为准;

   *   载入样式以最后载入的定位为准;

优先级为:

      !important >  id > class> tag 

      important 比 内联优先级高

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,单选框或复选框被选中。

50、如何居中div,如何居中一个浮动元素?

给div设置一个宽度,然后添加margin:0auto属性

   div{

       width:200px;

       margin:0 auto;

    } 

居中一个浮动元素

     确定容器的宽高 宽500 高 300 的层

     设置层的外边距

    .div {

     Width:500px ; height:300px;//高度可以不设

     Margin: -150px 0 0 -250px;

     position:relative;相对定位

     background-color:pink;//方便看效果

     left:50%;

     top:50%;

    }

51、浏览器的内核分别是什么?经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧?

    *IE浏览器的内核Trident、 Mozilla的Gecko、google的WebKit、Opera内核Presto;

    *png24为的图片在iE6浏览器上出现背景,解决方案是做成PNG8.

    *浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。

    *IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。

     浮动ie产生的双倍距离 #box{float:left; width:10px; margin:0 0 0 100px;}

     这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入——_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)

     渐进识别的方式,从总体中逐渐排除局部。

     首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。

     接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。

     css

         .bb{

          background-color:#f1ee18;/*所有识别*/

         .background-color:#00deff\9; /*IE6、7、8识别*/

         +background-color:#a200ff;/*IE6、7识别*/

         _background-color:#1e0bd1;/*IE6识别*/

         }

   *  IE下,可以使用获取常规属性的方法来获取自定义属性,

      也可以使用getAttribute()获取自定义属性;

      Firefox下,只能使用getAttribute()获取自定义属性.

      解决方法:统一通过getAttribute()获取自定义属性.

   *  IE下,even对象有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 {}

52、列出display的值,说明他们的作用。position的值, relative和absolute定位原点是?

  1.block 象块类型元素一样显示。

 none 缺省值。向行内元素类型一样显示。

 inline-block 象行内元素一样显示,但其内容象块类型元素一样显示。

 list-item 象块类型元素一样显示,并添加样式列表标记。

  2.position的值

 *absolute

       生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。

 *fixed (老IE不支持)

       生成绝对定位的元素,相对于浏览器窗口进行定位。

  *relative

       生成相对定位的元素,相对于其正常位置进行定位。

 * static  默认值。没有定位,元素出现在正常的流中

 *(忽略 top, bottom, left, right z-index 声明)。

 * inherit 规定从父元素继承 position 属性的值。

55、对WEB标准以及W3C的理解与认识

标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、使用外 链css和js脚本、结构行为表现的分离、文件下载与页面速度更快、内容能被更多的用户所访问、内容能被更广泛的设备所访问、更少的代码和组件,容易维护、改版方便,不需要变动页面内容、提供打印版本而不需要复制内容、提高网站易用性;

56、css的基本语句构成是?

选择器{属性1:值1;属性2:值2;……}

57、浏览器标准模式和怪异模式之间的区别是什么?

盒子模型 渲染模式的不同

使用 window.top.document.compatMode 可显示为什么模式

59超链接访问过后hover样式就不出现的问题是什么?如何解决?

  答案:被点击访问过的超链接样式不在具有hover和active了,解决方法是改变CSS属性的排列顺序: L-V-H-A(link,visited,hover,active)

60、什么是Css Hack?ie6,7,8的hack分别是什么?

  答案:针对不同的浏览器写不同的CSS code的过程,就是CSS hack。

  示例如下:

#test      {  

       width:300px;  

       height:300px;  

 background-color:blue;      /*firefox*/

       background-color:red\9;      /*allie*/

       background-color:yellow\0;   /*ie8*/

       +background-color:pink;       /*ie7*/

       _background-color:orange;      /*ie6*/    } 

       :root #test { background-color:purple\9; }  /*ie9*/

   @media all and (min-width:0px){ #test {background-color:black\0;} }  /*opera*/

   @media screen and (-webkit-min-device-pixel-ratio:0){ #test{background-color:gray;} }       /*chromeand safari*/

62、请用Css写一个简单的幻灯片效果页面

  答案:知道是要用css3。使用animation动画实现一个简单的幻灯片效果。

/**HTML**/

       div.ani

       /**css**/

       .ani{

         width:480px;

         height:320px;

         margin:50px auto;

         overflow: hidden;

         box-shadow:0 0 5px rgba(0,0,0,1);

         background-size: cover;

         background-position: center;

         -webkit-animation-name: "loops";

         -webkit-animation-duration: 20s;

         -webkit-animation-iteration-count: infinite;

       }

       @-webkit-keyframes "loops" {

           0% { background:url(照片1) no-repeat;            

           }

           25% {

                background:url(照片2) no-repeat;

           }

           50% {

                background:url(照片2) no-repeat;

           }

           75% {

                background:url(照片2) no-repeat;

           }

           100% {

                background:url(照片2) no-repeat;

           }

       }

72、b标签和strong标签,i标签和em标签的区别?

后者有语义,前者则无。

74、有哪些选择符,优先级的计算公式是什么?行内样式和!important哪个优先级高?

#ID > .class > 标签选择符  !important优先级高

77、.说说display属性有哪些?可以做什么?

 display:block行内元素转换为块级元素

 display:inline块级元素转换为行内元素

 display:inline-block转为内联元素

78、哪些css属性可以继承?

  可继承: font-size font-family color, ul li dl dd dt;

  不可继承:border padding margin width height ;

79、css优先级算法如何计算?

 !important >  id > class> 标签

 !important 比 内联优先级高

  * 优先级就近原则,样式定义最近者为准;

  * 以最后载入的样式为准;

80、text-align:center和line-height有什么区别?

 text-align是水平对齐,line-height是行间。

二、JS基础

1、javascript的typeof返回哪些数据类型

object number function boolean underfind string

2、例举3种强制类型转换和2种隐式类型转换?

强制(parseInt,parseFloat,Number())

隐式(== – ===)

1==”1”//true

null==undefined//true

3、split() join() 的区别

前者是切割成数组的形式,

后者是将数组转换成字符串

4、数组方法pop() push() unshift() shift()

Push()尾部添加 pop()尾部删除

Unshift()头部添加 shift()头部删除

5、事件绑定和普通事件有什么区别

传统事件绑定和符合W3C标准的事件绑定有什么区别?

div1.οnclick=function(){};

<button οnmοuseοver=””></button>

1、如果说给同一个元素绑定了两次或者多次相同类型的事件,那么后面的绑定会覆盖前面的绑定

2、不支持DOM事件流 事件捕获阶段è目标元素阶段=>事件冒泡阶段

addEventListener

如果说给同一个元素绑定了两次或者多次相同类型的事件,所以的绑定将会依次触发

支持DOM事件流的

进行事件绑定传参不需要on前端

addEventListener(“click”,function(){},true);//此时的事件就是在事件冒泡阶段执行

ie9开始,ie11 edge:addEventListener

ie9以前:attachEvent/detachEvent

进行事件类型传参需要带上on前缀

这种方式只支持事件冒泡,不支持事件捕获

事件绑定是指把事件注册到具体的元素之上,普通事件指的是可以用来注册的事件

6、IE和DOM事件流的区别

1.执行顺序不一样、

2.参数不一样

3.事件加不加on

4.this指向问题

IE9以前attachEvent(“onclick”)、detachEvent(“onclick”)

IE9开始跟DOM事件流是一样的,都是addEventListener

7、IE和标准下有哪些兼容性的写法

var ev = ev || window.event

document.documentElement.clientWidth || document.body.clientWidth

var target = ev.srcElement||ev.target

8、call和apply的区别

call和apply相同点:

都是为了用一个本不属于一个对象的方法,让这个对象去执行

toString.call([],1,2,3)

toString.apply([],[1,2,3])

Object.call(this,obj1,obj2,obj3)

Object.apply(this,arguments)

9、b继承a的方法

考点:继承的多种方式

function b(){}

b.protoototype=new a;

10、JavaScript this指针、闭包、作用域

this:指向调用上下文

闭包:内层作用域可以访问外层作用域的变量

作用域:定义一个函数就开辟了一个局部作用域,整个js执行环境有一个全局作用域

11、事件委托是什么

符合W3C标准的事件绑定addEventLisntener/attachEvent

让利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!

12、闭包是什么,有什么特性,对页面有什么影响

闭包就是能够读取其他函数内部变量的函数。

闭包的缺点:滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数

13、如何阻止事件冒泡和默认事件

e. stopPropagation();//标准浏览器

event.canceBubble=true;//ie9之前

阻止默认事件:

为了不让a点击之后跳转,我们就要给他的点击事件进行阻止

return false

e.preventDefault();

14、添加删除 替换 插入到某个接点的方法

obj.appendChild()

obj.insertBefore() //原生的js中不提供insertAfter();

obj.replaceChild()//替换

obj.removeChild()//删除

16、document load 和document ready的区别

Document.onload 是在结构和样式加载完才执行js

window.onload:不仅仅要在结构和样式加载完,还要执行完所有的样式、图片这些资源文件,全部加载完才会触发window.onload事件

Document.ready原生种没有这个方法,jquery中有 $().ready(function)

17、”==”和“===”的不同

前者会自动转换类型

后者不会

1==”1”

null==undefined

===先判断左右两边的数据类型,如果数据类型不一致,直接返回false

   之后才会进行两边值的判断

18、javascript的同源策略

一段脚本只能读取来自于同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合

http,ftp:协议

主机名;localhost

端口名:80:http协议的默认端口

https:默认端口是8083

同源策略带来的麻烦:ajax在不同域名下的请求无法实现,

如果说想要请求其他来源的js文件,或者json数据,那么可以通过jsonp来解决

21、JavaScript的数据类型都有什么?

基本数据类型:String,Boolean,number,undefined,object,Null

引用数据类型:Object(Array,Date,RegExp,Function)

那么问题来了,如何判断某变量是否为数组数据类型?

方法一.判断其是否具有“数组性质”,如slice()方法。可自己给该变量定义slice方法,故有时会失效

方法二.obj instanceof Array 在某些IE版本中不正确

方法三.方法一二皆有漏洞,在ECMAScript5中定义了新方法Array.isArray(), 保证其兼容性,最好的方法如下:

toString.call(18);//”[object Number]”

toString.call(“”);//”[object String]”

解析这种简单的数据类型直接通过typeof就可以直接判断

toString.call常用于判断数组、正则这些复杂类型

22、已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(不使用第三方框架)

document.getElementById(“ID”).value

23、希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)

var domList = document.getElementsByTagName(‘input’)

var checkBoxList = [];//返回的所有的checkbox

var len = domList.length;  //缓存到局部变量

while (len--) {  //使用while的效率会比for循环更高

  if (domList[len].type == ‘checkbox’) {

      checkBoxList.push(domList[len]);

  }

}

24、设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色(不使用第三方框架)

var dom = document.getElementById(“ID”);

dom.innerHTML = “xxxx”

dom.style.color = “#000”

25、当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?

直接在DOM里绑定事件:<div οnclick=”test()”></div>

在JS里通过onclick绑定:xxx.onclick = test

通过事件添加进行绑定:addEventListener(xxx, ‘click’, test)

那么问题来了,Javascript的事件流模型都有什么?

“事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播

“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的

“DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡

26、undefined会在以下三种情况下产生:

一个变量定义了却没有被赋值

想要获取一个对象上不存在的属性或者方法:

一个数组中没有被赋值的元素

注意区分undefined跟notdefnied(语法错误)是不一样的

37、用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。

var iArray = [];

funtion getRandom(istart, iend){

        var iChoice = istart - iend +1;

        return Math.floor(Math.random() * iChoice + istart;

}

Math.random()就是获取0-1之间的随机数(永远获取不到1)

for(var i=0; i<10; i++){

var result= getRandom(10,100);

        iArray.push(result);

}

iArray.sort();

38、把两个数组合并,并删除第二个元素。

var array1 = ['a','b','c'];

var bArray = ['d','e','f'];

var cArray = array1.concat(bArray);

cArray.splice(1,1);

39、怎样添加、移除、移动、复制、创建和查找节点(原生JS,实在基础,没细写每一步)

1)创建新节点

createDocumentFragment()    //创建一个DOM片段

createElement()   //创建一个具体的元素

createTextNode()   //创建一个文本节点

2)添加、移除、替换、插入

appendChild()      //添加

removeChild()      //移除

replaceChild()      //替换

insertBefore()      //插入

3)查找

getElementsByTagName()    //通过标签名称

getElementsByName()     //通过元素的Name属性的值

getElementById()        //通过元素Id,唯一性

65、简述列举文档对象模型DOM里document的常用的查找访问节点的方法并做简单说明

Document.getElementById 根据元素id查找元素

Document.getElementByName 根据元素name查找元素

Document.getElementTagName 根据指定的元素名查找元素

68、javascript中有哪几种数据类型,分别写出中文和英文。

string boolean number null undefined object

字符串 布尔 数值 空值 未定义 对象

69、javascript中==和===的区别是什么?举例说明。

===会自动进行类型转换,==不会

70、简述创建函数的几种方式

第一种(函数声明):

function sum1(num1,num2){

  return num1+num2;

}

第二种(函数表达式):

var sum2 = function(num1,num2){

  return num1+num2;

}

匿名函数:

function(){}:只能自己执行自己

第三种(函数对象方式):

var sum3 = newFunction("num1","num2","return num1+num2");

71、Javascript如何实现继承?

原型链继承,借用构造函数继承,组合继承,寄生式继承,寄生组合继承

72、Javascript创建对象的几种方式?

工厂方式,构造函数方式,原型模式,混合构造函数原型模式,动态原型方式

73、把 Script 标签 放在页面的最底部的body封闭之前 和封闭之后有什么区别?浏览器会如何解析它们?

如果说放在body的封闭之前,将会阻塞其他资源的加载

如果放在body封闭之后,不会影响body内元素的加载

74、iframe的优缺点?

优点:

1. 解决加载缓慢的第三方内容如图标和广告等的加载问题

2. Security sandbox

3. 并行加载脚本

缺点:

1. iframe会阻塞主页面的Onload事件

2. 即时内容为空,加载也需要时间

3. 没有语意

75、请你谈谈Cookie的弊端?

缺点:

1.`Cookie`数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。

2.安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。

3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。

77、js延迟加载的方式有哪些?

1. defer和async

2. 动态创建DOM方式(创建script,插入到DOM中,加载完毕后callBack)

3. 按需异步载入js

78、documen.write和 innerHTML 的区别?

document.write 只能重绘整个页面

innerHTML 可以重绘页面的一部分

79、哪些操作会造成内存泄漏?

内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。

垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。

1. setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。

2. 闭包

3. 控制台日志

4. 循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

81、split()join() 的区别

答:前者是切割成数组的形式,后者是将数组转换成字符串

86、split() join() 的区别

前者是切割成数组的形式,后者是将数组转换成字符串

89、IE和DOM事件流的区别

1.执行顺序不一样、

2.参数不一样

3.事件加不加on

4.this指向问题

90、IE和标准下有哪些兼容性的写法

Var ev = ev || window.event

document.documentElement.clientWidth|| document.body.clientWidth

Vartarget = ev.srcElement||ev.target

91、call和apply的区别

Object.call(this,obj1,obj2,obj3)

Object.apply(this,arguments)

96、解释jsonp的原理,以及为什么不是真正的ajax

动态创建script标签,回调函数

Ajax是页面无刷新请求数据操作

99、字符串反转,如将 '12345678' 变成 '87654321'

//大牛做法;

//思路:先将字符串转换为数组 split(),利用数组的反序函数 reverse()颠倒数组,再利用 jion() 转换为字符串

var str = '12345678';

str = str.split('').reverse().join('');

100、将数字 12345678 转化成 RMB形式 如: 12,345,678 

//个人方法;

//思路:先将数字转为字符, str= str + '' ;

//利用反转函数,每三位字符加一个 ','最后一位不加; re()是自定义的反转函数,最后再反转回去!

for(var i = 1; i <= re(str).length; i++){

    tmp += re(str)[i - 1];

    if(i % 3 == 0 && i != re(str).length){

        tmp += ',';

    }

}

101、生成5个不同的随机数;

//思路:5个不同的数,每生成一次就和前面的所有数字相比较,如果有相同的,则放弃当前生成的数字!

var num1 = [];

for(var i = 0; i < 5; i++){

    num1[i] = Math.floor(Math.random()*10) + 1; //范围是 [1, 10]

    for(var j = 0; j < i; j++){

        if(num1[i] == num1[j]){

            i--;

        }

    }

}

102、去掉数组中重复的数字方法一;

//思路:每遍历一次就和之前的所有做比较,不相等则放入新的数组中!

//这里用的原型 个人做法;

Array.prototype.unique = function(){

    var len = this.length,

        newArr = [],

        flag = 1;

    for(var i = 0; i < len; i++, flag = 1){

        for(var j = 0; j < i; j++){

            if(this[i] == this[j]){

                flag = 0;        //找到相同的数字后,不执行添加数据

            }

        }

        flag ? newArr.push(this[i]) : '';

    }

    return newArr;

}

    方法二:

(function(arr){

    var len = arr.length,

        newArr = [], 

        flag;

    for(var i = 0; i < len; i+=1, flag = 1){

        for(var j = 0; j < i; j++){

            if(arr[i] == arr[j]){

                flag = 0;

            }  

        }

        flag?newArr.push(arr[i]):'';

    }

    alert(newArr);

})([1, 1, 22, 3, 4, 55, 66]);

 

106、window.location.reload() 作用?

    答:刷新当前页面。

107、阻止冒泡函数

function stopPropagation(e) {  

    e = e || window.event;  

    if(e.stopPropagation) { //W3C阻止冒泡方法  

        e.stopPropagation();  

    } else {  

        e.cancelBubble = true; //IE阻止冒泡方法  

    }  

}  

document.getElementById('need_hide').onclick = function(e) {  

    stopPropagation(e);  

}

108、什么是闭包?写一个简单的闭包?;

    答:我的理解是,闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

function outer(){

    var num = 1;

    function inner(){

        var n = 2;

        alert(n + num);

    }

    return inner;

}

outer()();

109、javascript 中的垃圾回收机制?

    答:在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再 被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么  函数a执行后不会被回收的原因。

142、原生JS的window.onload与Jquery的$(document).ready(function(){})有什么不同?

  window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行。

$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。 

143、你如何优化自己的代码?

代码重用

避免全局变量(命名空间,封闭空间,模块化mvc..)

拆分函数避免函数过于臃肿:单一职责原则

适当的注释,尤其是一些复杂的业务逻辑或者是计算逻辑,都应该写出这个业务逻辑的具体过程

内存管理,尤其是闭包中的变量释放

152、请简要描述web前端性能需要考虑哪方面,你的优化思路是什么?

//参见雅虎14web优化规则

//减少http请求:

//1、小图弄成大图,2、合理的设置缓存

//3、资源合并、压缩

//将外部的js文件置底

156、写出3个使用this的典型应用

构造函数中使用this,原型中使用this,对象字面量使用this

157、请尽可能详尽的解释ajax的工作原理

思路:先解释异步,再解释ajax如何使用

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。

 XMLHttpRequest是ajax的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术。简单的说,也就是javascript可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。

158、为什么扩展javascript内置对象不是好的做法?

因为扩展内置对象会影响整个程序中所使用到的该内置对象的原型属性

159、请解释一下javascript的同源策略

域名、协议、端口相同

162、如果设计中使用了非标准的字体,你该如何去实现?

先通过font-face定义字体,再引用

@font-face

{

font-family: myFirstFont;

src: url('Sansation_Light.ttf'),

     url('Sansation_Light.eot'); /* IE9+ */

}

164、module(12,5)//2  实现满足这个结果的modulo函数

function modulo(a,b){
   
returna%b;//return a/b;
}

165、HTTP协议中,GET和POST有什么区别?分别适用什么场景?

get传送的数据长度有限制,post没有

get通过url传递,在浏览器地址栏可见,post是在报文中传递

适用场景:

post一般用于表单提交

get一般用于简单的数据查询,严格要求不是那么高的场景

166、HTTP状态消息200 302 304 403 404 500分别表示什么

200:请求已成功,请求所希望的响应头或数据体将随此响应返回。

302:请求的资源临时从不同的 URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的

304:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。

403:服务器已经理解请求,但是拒绝执行它。

404:请求失败,请求所希望得到的资源未被在服务器上发现。

500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。

167、HTTP协议中,header信息里面,怎么控制页面失效时间(last-modified,cache-control,Expires分别代表什么)

Last-Modified

文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档 才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。

Expires

应该在什么时候认为文档已经过期,从而不再缓存它?

168、HTTP协议目前常用的有哪几个?KEEPALIVE从哪个版本开始出现的?

http1.0

http1.1 keeplive

170、列举常用的web页面开发,调试以及优化工具

sublime vscode webstorm hbuilder dw

1、Chrome的开发者工具

2、firefox插件Firebug

3、IE的开发者工具

4、IETest,IE浏览器版本切换工具

5、Emmet

6、JSON格式校验工具

7、JS压缩和解压缩工具

173、请列举js数组类型中的常用方法

方法

描述

concat()

连接两个或更多的数组,并返回结果。

join()

把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。

pop()

删除并返回数组的最后一个元素

push()

向数组的末尾添加一个或更多元素,并返回新的长度。

reverse()

颠倒数组中元素的顺序。

shift()

删除并返回数组的第一个元素

slice()

从某个已有的数组返回选定的元素

sort()

对数组的元素进行排序

splice()

删除元素,并向数组添加新元素。

toSource()

返回该对象的源代码。

toString()

把数组转换为字符串,并返回结果。

toLocaleString()

把数组转换为本地数组,并返回结果。

unshift()

向数组的开头添加一个或更多元素,并返回新的长度。

valueOf()

返回数组对象的原始值

175、列举常用的js框架以及分别适用的领域

jquery:简化了js的一些操作,并且提供了一些非常好用的API

jquery ui、jquery-easyui:在jqeury的基础上提供了一些常用的组件 日期,下拉框,表格这些组件

require.js、sea.js(阿里的玉帛)+》模块化开发使用的

zepto:精简版的jquery,常用于手机web前端开发 提供了一些手机页面实用功能,touch

ext.js:跟jquery差不多,但是不开源,也没有jquery轻量

angular、knockoutjs、avalon(去哪儿前端总监):MV*框架,适合用于单页应用开发(SPA)

200、jQuery框架中$.ajax()的常用参数有哪些?

type

类型:String

默认值:"GET")。请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和DELETE 也可以使用,但仅部分浏览器支持。

url

类型:String

默认值: 当前页地址。发送请求的地址。

success

类型:Function

请求成功后的回调函数。

参数:由服务器返回,并根据dataType 参数进行处理后的数据;描述状态的字符串。

这是一个 Ajax 事件。

options

类型:Object

可选。AJAX 请求设置。所有选项都是可选的。

async

类型:Boolean

默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。

注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。

beforeSend(XHR)

类型:Function

发送请求前可修改XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。

XMLHttpRequest 对象是唯一的参数。

这是一个 Ajax 事件。如果返回 false 可以取消本次 ajax 请求。

cache

类型:Boolean

默认值: true,dataType 为 script 和jsonp 时默认为 false。设置为 false 将不缓存此页面。

jQuery 1.2 新功能。

contentType

类型:String

默认值:"application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。

默认值适合大多数情况。如果你明确地传递了一个 content-type 给 $.ajax() 那么它必定会发送给服务器(即使没有数据要发送)。

data

类型:String

发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如{foo:["bar1", "bar2"]} 转换为'&foo=bar1&foo=bar2'。

dataFilter

类型:Function

给 Ajax 返回的原始数据的进行预处理的函数。提供 data 和 type 两个参数:data是 Ajax 返回的原始数据,type 是调用 jQuery.ajax 时提供的 dataType 参数。函数返回的值将由 jQuery 进一步处理。

dataType

类型:String

预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:

"xml": 返回 XML 文档,可用jQuery 处理。

"html": 返回纯文本 HTML 信息;包含的script 标签会在插入 dom 时执行。

"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET请求。(因为将使用 DOM 的 script标签来加载)

"json": 返回 JSON 数据 。

"jsonp":JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ?为正确的函数名,以执行回调函数。

"text": 返回纯文本字符串

error

类型:Function

默认值: 自动判断 (xml 或 html)。请求失败时调用此函数。

有以下三个参数:XMLHttpRequest对象、错误信息、(可选)捕获的异常对象。

如果发生了错误,错误信息(第二个参数)除了得到 null 之外,还可能是 "timeout","error", "notmodified" 和"parsererror"。

这是一个 Ajax 事件。

201、JavaScript数组元素添加、删除、排序等方法有哪些?

Array.concat( ) 连接数组

Array.join( ) 将数组元素连接起来以构建一个字符串

Array.length 数组的大小

Array.pop( ) 删除并返回数组的最后一个元素

Array.push( ) 给数组添加元素

Array.reverse( ) 颠倒数组中元素的顺序

Array.shift( ) 将元素移出数组

Array.slice( ) 返回数组的一部分

Array.sort( ) 对数组元素进行排序

Array.splice( ) 插入、删除或替换数组的元素

Array.toLocaleString( ) 把数组转换成局部字符串

Array.toString( ) 将数组转换成一个字符串

Array.unshift( ) 在数组头部插入一个元素

202、如何添加html元素的事件,有几种方法?请列举

a、直接在标签里添加:<divοnclick=”alert(你好)”>这是一个层</div>

b、在元素上通过js添加:

c、使用事件注册函数添加

203、JavaScript的循环语句有哪些?

while for  do while  for…in

204、作用域-编译期执行期以及全局局部作用域问题

理解js执行主要的两个阶段:预解析和执行期

205、闭包:下面这个ul,如何点击每一列的时候alert其index?

<ul id="test">

<li>这是第一条</li>

<li>这是第二条</li>

<li>这是第三条</li>

</ul>

//非闭包实现

var lis=document.querySelectorAll('li');
document.querySelector('#test').οnclick=function(e){
    for (var i = 0; i < lis.length;i++) {
        var li = lis[i];
        if(li==e.target){
            alert(i);
        }
    }
};

//闭包实现

var lis=document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
    var li = lis[i];
    li.οnclick=(function(index){
        return function(e){
            alert(index);
        };
    })(i);
}

207、列举可以哪些方面对前端开发进行优化

代码压缩、合并减少http请求,图片制作精灵图、代码优化

212、列举浏览器对象模型BOM里常用的至少4个对象,并列举window对象的常用方法至少5个 (10分)

对象:window document location screen historynavigator

方法:alert() confirm() prompt() open()close() setInterval() setTimeout() clearInterval() clearTimeout()

(详细参见:J:\代码,PPT,笔记,电子书\面试题\window对象方法.png)

213、Javascript中callee和caller的作用?

caller是返回一个对函数的引用,该函数调用了当前函数;

用法:fn.caller

callee是返回正在被执行的function函数,也就是所指定的function对象的正文。

用法:arguments.callee

217、事件代理怎么实现?

在元素的父节点注册事件,通过事件冒泡,在父节点捕获事件

四、HTML5 CSS3

1、CSS3有哪些新特性?

1. CSS3实现圆角(border-radius),阴影(box-shadow),

2. 对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)

3.transform:rotate(9deg) scale(0.85,0.90)translate(0px,-30px) skew(-9deg,0deg);// 旋转,缩放,定位,倾斜

4. 增加了更多的CSS选择器  多背景rgba

5. 在CSS3中唯一引入的伪元素是 ::selection.

6. 媒体查询,多栏布局

7. border-image

2、html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

新特性:

1. 拖拽释放(Drag anddrop) API

2. 语义化更好的内容标签(header,nav,footer,aside,article,section)

3. 音频、视频API(audio,video)

4. 画布(Canvas) API

5. 地理(Geolocation)API

6. 本地离线存储localStorage 长期存储数据,浏览器关闭后数据不丢失;

7. sessionStorage 的数据在浏览器关闭后自动删除

8. 表单控件,calendar、date、time、email、url、search 

9. 新的技术webworker,websocket, Geolocation

移除的元素:

1. 纯表现的元素:basefont,big,center,font, s,strike,tt,u;

2. 对可用性产生负面影响的元素:frame,frameset,noframes;

支持HTML5新标签:

1. IE8/IE7/IE6支持通过document.createElement 方法产生的标签,可以利用这一特性让这些浏览器支持 HTML5 新标签,浏览器支持新标签后,还需要添加标签默认的样式(当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架):

<!--[if lt IE 9]>

<script>src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>

<![endif]-->

如何区分:

DOCTYPE声明新增的结构元素、功能元素

3、本地存储(Local Storage )和cookies(储存在用户本地终端上的数据)之间的区别是什么?

Cookies:服务器和客户端都可以访问;大小只有4KB左右;有有效期,过期后将会删除;

本地存储:只有本地浏览器端可访问数据,服务器不能访问本地存储直到故意通过POST或者GET的通道发送到服务器;每个域5MB;没有过期数据,它将保留知道用户从浏览器清除或者使用Javascript代码移除

4、如何实现浏览器内多个标签页之间的通信?

调用 localstorge、cookies等本地存储方式

5、你如何对网站的文件和资源进行优化?

文件合并

文件最小化/文件压缩

使用CDN托管

缓存的使用

6、什么是响应式设计?

它是关于网页制作的过程中让不同的设备有不同的尺寸和不同的功能。响应式设计是让所有的人能在这些设备上让网站运行正常     

7、新的 HTML5 文档类型和字符集是?

答:HTML5文档类型:<!doctype html>

    HTML5使用的编码<meta charset=”UTF-8”>

8、HTML5 Canvas 元素有什么用?

答:Canvas 元素用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML 上进行图形操作。

9、HTML5 存储类型有什么区别?

答:Media API、Text Track API、Application Cache API、User Interaction、Data Transfer API、Command API、Constraint Validation API、History API

11、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,单选框或复选框被选中。

14、html5\CSS3有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,地理定位等功能的增加。

* 绘画 canvas 元素

  用于媒介回放的 video 和 audio 元素

  本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;

 sessionStorage 的数据在浏览器关闭后自动删除

  语意化更好的内容元素,比如article、footer、header、nav、section

  表单控件,calendar、date、time、email、url、search

 CSS3实现圆角,阴影,对文字加特效,增加了更多的CSS选择器  多背景rgba

  新的技术webworker, websockt, Geolocation

移除的元素

纯表现的元素:basefont,big,center,font, s,strike,tt,u;

对可用性产生负面影响的元素:frame,frameset,noframes;

* 是IE8/IE7/IE6支持通过document.createElement方法产生的标签,

  可以利用这一特性让这些浏览器支持HTML5新标签,

  浏览器支持新标签后,还需要添加标签默认的样式:

* 当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架

<!--[if lt IE 9]>

<script>src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>

<![endif]-->

15、你怎么来实现页面设计图,你认为前端应该如何高质量完成工作? 一个满屏 品 字布局 如何设计?

* 首先划分成头部、body、脚部;。。。。。

* 实现效果图是最基本的工作,精确到2px;

  与设计师,产品经理的沟通和项目的参与

  做好的页面结构,页面重构和用户体验

  处理hack,兼容、写出优美的代码格式

  针对服务器的优化、拥抱 HTML5。

18请谈一下你对网页标准和标准制定机构重要性的理解。

  (无标准答案)网页标准和标准制定机构都是为了能让web发展的更‘健康’,开发者遵循统一的标准,降低开发难度,开发成本,SEO也会更好做,也不会因为滥用代码导致各种BUG、安全问题,最终提高网站易用性。

20、知道css有个content属性吗?有什么作用?有什么应用?

知道。css的content属性专门应用在 before/after 伪元素上,用来插入生成内容。最常见的应用是利用伪类清除浮动。

//一种常见利用伪类清除浮动的代码

.clearfix:after {

    content:"."; //这里利用到了content属性

    display:block;

    height:0;

    visibility:hidden;

    clear:both; }

.clearfix {

    *zoom:1;

}

after伪元素通过 content 在元素的后面生成了内容为一个点的块级素,再利用clear:both清除浮动。

  那么问题继续还有,知道css计数器(序列数字字符自动递增)吗?如何通过css content属性实现css计数器?

答案:css计数器是通过设置counter-reset 、counter-increment 两个属性、及 counter()/counters()一个方法配合after /before 伪类实现。 

21、如何在 HTML5 页面中嵌入音频?

HTML 5 包含嵌入音频文件的标准方式,支持的格式包括 MP3、Wav 和 Ogg:

<audio controls> 

  <source src="jamshed.mp3" type="audio/mpeg"> 

   Your browser does'nt support audio embedding feature. 

</audio>

22、如何在 HTML5 页面中嵌入视频?

和音频一样,HTML5 定义了嵌入视频的标准方法,支持的格式包括:MP4、WebM 和 Ogg:

<video width="450" height="340" controls> 

  <source src="jamshed.mp4" type="video/mp4"> 

   Your browser does'nt support video embedding feature. 

</video> 

23、HTML5 引入什么新的表单属性?

Datalist  datetime   output   keygen date  month  week time  number   range  emailurl

24、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,单选框或复选框被选中。

26.cookie在浏览器和服务器间来回传递。 sessionStorage和localStorage区别

sessionStorage和localStorage的存储空间更大;

sessionStorage和localStorage有更多丰富易用的接口;

sessionStorage和localStorage各自独立的存储空间;

29、语义化的理解?

用正确的标签做正确的事情!

html语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;

在没有样式CCS情况下也以一种文档格式显示,并且是容易阅读的。

搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于 SEO。

使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。

30、HTML5的离线储存?

localStorage    长期存储数据,浏览器关闭后数据不丢失;

sessionStorage  数据在浏览器关闭后自动删除。

31、写出HTML5的文档声明方式

 <DOCYPE html>

32、HTML5和CSS3的新标签    

HTML5: nav, footer, header, section, hgroup, video, time, canvas, audio...

CSS3: RGBA, opacity, text-shadow, box-shadow, border-radius, border-image, 

border-color, transform...;

33、自己对标签语义化的理解

    在我看来,语义化就是比如说一个段落, 那么我们就应该用 <p>标签来修饰,标题就应该用 <h?>标签等。符合文档语义的标签。

五、移动web开发

1、移动端常用类库及优缺点

知识面宽度,多多益善

2、Zepto库和JQ区别

Zepto相对jQuery更加轻量,主要用在移动端,jQuery也有对应的jQuerymobile移动端框架d

六、Ajax

1、Ajax 是什么? 如何创建一个Ajax?

Ajax并不算是一种新的技术,全称是asynchronousjavascript and xml,可以说是已有技术的组合,主要用来实现客户端与服务器端的异步通信效果,实现页面的局部刷新,早期的浏览器并不能原生支持ajax,可以使用隐藏帧(iframe)方式变相实现异步效果,后来的浏览器提供了对ajax的原生支持

使用ajax原生方式发送请求主要通过XMLHttpRequest(标准浏览器)、ActiveXObject(IE浏览器)对象实现异步通信效果

基本步骤:

var xhr =null;//创建对象

if(window.XMLHttpRequest){

       xhr= new XMLHttpRequest();

}else{

       xhr= new ActiveXObject("Microsoft.XMLHTTP");

}

    xhr.open(“方式”,”地址”,”标志位”);//初始化请求

    xhr.setRequestHeader(“”,””);//设置http头信息

    xhr.onreadystatechange =function(){}//指定回调函数

    xhr.send();//发送请求

js框架(jQuery/EXTJS等)提供的ajax  API对原生的ajax进行了封装,熟悉了基础理论,再学习别的框架就会得心应手,好多都是换汤不换药的内容

2、同步和异步的区别?

同步:阻塞的

-张三叫李四去吃饭,李四一直忙得不停,张三一直等着,直到李四忙完两个人一块去吃饭

=浏览器向服务器请求数据,服务器比较忙,浏览器一直等着(页面白屏),直到服务器返回数据,浏览器才能显示页面

异步:非阻塞的

-张三叫李四去吃饭,李四在忙,张三说了一声然后自己就去吃饭了,李四忙完后自己去吃

=浏览器向服务器请求数据,服务器比较忙,浏览器可以自如的干原来的事情(显示页面),服务器返回数据的时候通知浏览器一声,浏览器把返回的数据再渲染到页面,局部更新

3、如何解决跨域问题?

理解跨域的概念:协议、域名、端口都相同才同域,否则都是跨域

出于安全考虑,服务器不允许ajax跨域获取数据,但是可以跨域获取文件内容,所以基于这一点,可以动态创建script标签,使用标签的src属性访问js文件的形式获取js脚本,并且这个js脚本中的内容是函数调用,该函数调用的参数是服务器返回的数据,为了获取这里的参数数据,需要事先在页面中定义回调函数,在回调函数中处理服务器返回的数据,这就是解决跨域问题的主流解决方案

4、页面编码和被请求的资源编码如果不一致如何处理?

对于ajax请求传递的参数,如果是get请求方式,参数如果传递中文,在有些浏览器会乱码,不同的浏览器对参数编码的处理方式不同,所以对于get请求的参数需要使用 encodeURIComponent函数对参数进行编码处理,后台开发语言都有相应的解码api。对于post请求不需要进行编码

5、简述ajax 的过程。

1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象

2. 创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息

3. 设置响应HTTP请求状态变化的函数

4. 发送HTTP请求

5. 获取异步调用返回的数据

6. 使用JavaScript和DOM实现局部刷新

6、阐述一下异步加载。

1. 异步加载的方案: 动态插入 script标签

2. 通过 ajax 去获取 js 代码,然后通过 eval 执行

3. script 标签上添加defer 或者 async 属性

4. 创建并插入 iframe,让它异步执行 js

7、请解释一下 JavaScript 的同源策略。

同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。所谓同源指的是:协议,域名,端口相同,同源策略是一种安全协议,指一段脚本只能读取来自同一来源的窗口和文档的属性。

8、GET和POST的区别,何时使用POST?

GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符,有的浏览器是8000个字符

POST:一般用于修改服务器上的资源,对所发送的信息没有限制

在以下情况中,请使用 POST 请求:

1. 无法使用缓存文件(更新服务器上的文件或数据库)

2. 向服务器发送大量数据(POST 没有数据量限制)

3. 发送包含未知字符的用户输入时,POST比 GET 更稳定也更可靠

9、ajax 是什么?ajax 的交互模型?同步和异步的区别?如何解决跨域问题?

 1. 通过异步模式,提升了用户体验

 2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用

3. Ajax在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载。

10、 Ajax的最大的特点是什么。

   Ajax可以实现异步通信效果,实现页面局部刷新,带来更好的用户体验;按需获取数据,节约带宽资源;

11、ajax的缺点

 1、ajax不支持浏览器back按钮。

 2、安全问题 AJAX暴露了与服务器交互的细节。

 3、对搜索引擎的支持比较弱。

 4、破坏了程序的异常机制。

13、解释jsonp的原理,以及为什么不是真正的ajax

  Jsonp并不是一种数据格式,而json是一种数据格式,jsonp是用来解决跨域获取数据的一种解决方案,具体是通过动态创建script标签,然后通过标签的src属性获取js文件中的js脚本,该脚本的内容是一个函数调用,参数就是服务器返回的数据,为了处理这些返回的数据,需要事先在页面定义好回调函数,本质上使用的并不是ajax技术

14、什么是Ajax和JSON,它们的优缺点。

Ajax是全称是asynchronousJavaScript andXML,即异步JavaScript和xml,用于在Web页面中实现异步数据交互,实现页面局部刷新。

优点:可以使得页面不重载全部内容的情况下加载局部内容,降低数据传输量,避免用户不断刷新或者跳转页面,提高用户体验

缺点:对搜索引擎不友好;要实现ajax下的前后退功能成本较大;可能造成请求数的增加跨域问题限制;

JSON是一种轻量级的数据交换格式,ECMA的一个子集

优点:轻量级、易于人的阅读和编写,便于机器(JavaScript)解析,支持复合数据类型(数组、对象、字符串、数字)

15、http常见的状态码有那些?分别代表是什么意思?

200 - 请求成功

301 - 资源(网页等)被永久转移到其它URL

404 - 请求的资源(网页等)不存在

500 - 内部服务器错误

16、一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

分为4个步骤:

1. 当发送一个 URL 请求时,不管这个 URL 是 Web 页面的 URL 还是 Web 页面上每个资源的 URL,浏览器都会开启一个线程来处理这个请求,同时在远程 DNS 服务器上启动一个 DNS 查询。这能使浏览器获得请求对应的 IP 地址。

2. 浏览器与远程 Web 服务器通过 TCP 三次握手协商来建立一个 TCP/IP 连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。

3. 一旦 TCP/IP 连接建立,浏览器会通过该连接向远程服务器发送 HTTP 的 GET 请求。远程服务器找到资源并使用 HTTP 响应返回该资源,值为 200 的 HTTP 响应状态表示一个正确的响应。

4. 此时,Web 服务器提供资源服务,客户端开始下载资源。

17、ajax请求的时候get 和post方式的区别

get一般用来进行查询操作,url地址有长度限制,请求的参数都暴露在url地址当中,如果传递中文参数,需要自己进行编码操作,安全性较低。

post请求方式主要用来提交数据,没有数据长度的限制,提交的数据内容存在于http请求体中,数据不会暴漏在url地址中。

18、ajax请求时,如何解释json数据

使用eval() 或者JSON.parse() 鉴于安全性考虑,推荐使用JSON.parse()更靠谱,对数据的安全性更好。

19、.javascript的本地对象,内置对象和宿主对象

本地对象为独立于宿主环境的ECMAScript提供的对象,包括Array Object RegExp等可以new实例化的对象

内置对象为Gload,Math 等不可以实例化的(他们也是本地对象,内置对象是本地对象的一个子集)

宿主对象为所有的非本地对象,所有的BOM和DOM对象都是宿主对象,如浏览器自带的document,window 等对象

21、请说出三种减低页面加载时间的方法

1、压缩css、js文件
2、合并js、css文件,减少http请求
3、外部js、css文件放在最底下
4、减少dom操作,尽可能用变量替代不必要的dom操作

22、HTTP状态码都有那些。

200 OK     //客户端请求成功

400 Bad Request  //客户端请求有语法错误,不能被服务器所理解

403 Forbidden  //服务器收到请求,但是拒绝提供服务

404 Not Found  //请求资源不存在,输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

七、JS高级

1、 JQuery一个对象可以同时绑定多个事件,这是如何实现的?

jQuery可以给一个对象同时绑定多个事件,低层实现方式是使用addEventListner或attachEvent兼容不同的浏览器实现事件的绑定,这样可以给同一个对象注册多个事件。

2、 知道什么是webkit么? 知道怎么用浏览器的各种工具来调试和debug代码么?

Webkit是浏览器引擎,包括html渲染和js解析功能,手机浏览器的主流内核,与之相对应的引擎有Gecko(Mozilla Firefox 等使用)和Trident(也称MSHTML,IE 使用)。

对于浏览器的调试工具要熟练使用,主要是页面结构分析,后台请求信息查看,js调试工具使用,熟练使用这些工具可以快速提高解决问题的效率

24、 Javascript作用域链?

理解变量和函数的访问范围和生命周期,全局作用域与局部作用域的区别,JavaScript中没有块作用域,函数的嵌套形成不同层次的作用域,嵌套的层次形成链式形式,通过作用域链查找属性的规则需要深入理解。

25、 谈谈this对象的理解。

理解不同形式的函数调用方式下的this指向,理解事件函数、定时函数中的this指向,函数的调用形式决定了this的指向。

26、 eval是做什么的?

它的功能是把对应的字符串解析成JS代码并运行;应该避免使用eval,不安全,非常耗性能(2个步骤,一次解析成js语句,一次执行)

27、 关于事件,IE与火狐的事件机制有什么区别?如何阻止冒泡?

[1].在IE中,事件对象是作为一个全局变量来保存和维护的.所有的浏览器事件,不管是用户触发的,还是其他事件,都会更新window.event对象.所以在代码中,只要调用window.event就可以获取事件对象, 再event.srcElement就可以取得触发事件的元素进行进一步处理.

[2].在FireFox中,事件对象却不是全局对象,一般情况下,是现场发生,现场使用,FireFox把事件对象自动传给事件处理程序.

关于事件的兼容性处理要熟练掌握,事件对象具体哪些属性存在兼容性问题,IE与标准事件模型事件冒泡与事件捕获的支持要理解

28、 什么是闭包(closure),为什么要用它?

简单的理解是函数的嵌套形成闭包,闭包包括函数本身已经它的外部作用域

使用闭包可以形成独立的空间,延长变量的生命周期,报存中间状态值

31、new操作符具体干了什么呢?

1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。

 2、属性和方法被加入到 this 引用的对象中。

 3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。

33、Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?

HasOwnProperty

34、对JSON的了解?

轻量级数据交互格式,可以形成复杂的嵌套格式,解析非常方便

35、js延迟加载的方式有哪些?

方案一:<script>标签的async="async"属性(详细参见:script标签的async属性)

方案二:<script>标签的defer="defer"属性

方案三:动态创建<script>标签

方案四:AJAX eval(使用AJAX得到脚本内容,然后通过eval_r(xmlhttp.responseText)来运行脚本)

方案五:iframe方式

36、模块化开发怎么做?

理解模块化开发模式:浏览器端requirejs,seajs;服务器端nodejs;ES6模块化;fis、webpack等前端整体模块化解决方案;grunt、gulp等前端工作流的使用

37、AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?

理解这两种规范的差异,主要通过requirejs与seajs的对比,理解模块的定义与引用方式

的差异以及这两种规范的设计原则

参考链接1:AMD 和 CMD 的区别有哪些? - 知乎

参考链接2:https://github.com/seajs/seajs/issues/277

1、对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.

2、CMD 推崇依赖就近,AMD 推崇依赖前置。

3. AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹。

38、requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何 缓存的?)

核心是js的加载模块,通过正则匹配模块以及模块的依赖关系,保证文件加载的先后顺序,根据文件的路径对加载过的文件做了缓存

39、让你自己设计实现一个requireJS,你会怎么做?

核心是实现js的加载模块,维护js的依赖关系,控制好文件加载的先后顺序

42、异步加载的方式有哪些?

方案一:<script>标签的async="async"属性(详细参见:script标签的async属性)

方案二:<script>标签的defer="defer"属性

方案三:动态创建<script>标签

方案四:AJAX eval(使用AJAX得到脚本内容,然后通过eval_r(xmlhttp.responseText)来运行脚本)

方案五:iframe方式

43、documen.write和 innerHTML的区别?

document.write是重写整个document,写入内容是字符串的html

innerHTML是HTMLElement的属性,是一个元素的内部html内容

45、call() 和 apply() 的含义和区别?

apply的参数是数组形式,call的参数是单个的值,除此之外在使用上没有差别,重点理解这两个函数调用的this改变

46、数组和对象有哪些原生方法,列举一下?

Array.concat( ) 连接数组

Array.join() 将数组元素连接起来以构建一个字符串

Array.length数组的大小

Array.pop() 删除并返回数组的最后一个元素

Array.push() 给数组添加元素

Array.reverse() 颠倒数组中元素的顺序

Array.shift() 将元素移出数组

Array.slice() 返回数组的一部分

Array.sort() 对数组元素进行排序

Array.splice() 插入、删除或替换数组的元素

Array.toLocaleString() 把数组转换成局部字符串

Array.toString() 将数组转换成一个字符串

Array.unshift() 在数组头部插入一个元素

Object对象的常用方法

Object.hasOwnProperty( ) 检查属性是否被继承

Object.isPrototypeOf() 一个对象是否是另一个对象的原型

Object.propertyIsEnumerable() 是否可以通过for/in循环看到属性

Object.toLocaleString() 返回对象的本地字符串表示

Object.toString() 定义一个对象的字符串表示

Object.valueOf() 指定对象的原始值

49、如何编写高性能的Javascript?

使用 DocumentFragment 优化多次 append

通过模板元素 clone ,替代createElement

使用一次 innerHTML 赋值代替构建 dom 元素

使用 firstChild 和nextSibling 代替 childNodes 遍历dom 元素

使用 Array 做为StringBuffer ,代替字符串拼接的操作

将循环控制量保存到局部变量

顺序无关的遍历时,用 while 替代for

将条件分支,按可能性顺序从高到低排列

在同一条件子的多( >2 )条件分支时,使用 switch 优于 if

使用三目运算符替代条件分支

需要不断执行的时候,优先考虑使用 setInterval

50、那些操作会造成内存泄漏?

闭包,死循环

5. 寄生式继承

6. 寄生组合式继承

53、eval是做什么的?

1. 它的功能是把对应的字符串解析成JS代码并运行

2. 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)

54、JavaScript 原型,原型链 ? 有什么特点?

1. 原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为null 的话,我们就称之为原型链

2. 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链

55、事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡?

1. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为

2. 事件处理机制:IE是事件冒泡、firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件

3. ev.stopPropagation();

注意旧ie的方法:ev.cancelBubble= true;

56、简述一下Sass、Less,且说明区别?

他们是动态的样式语言,是CSS预处理器,CSS上的一种抽象层。他们是一种特殊的语法/语言而编译成CSS。

变量符不一样,less是@,而Sass是$;

Sass支持条件语句,可以使用if{}else{},for{}循环等等。而Less不支持;

Sass是基于Ruby的,是在服务端处理的,而Less是需要引入less.js来处理Less代码输出Css到浏览器

57、关于javascript中apply()和call()方法的区别?

相同点:两个方法产生的作用是完全一样的

不同点:方法传递的参数不同

Object.call(this,obj1,obj2,obj3)

Object.apply(this,arguments)

apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。

call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。

58、简述一下JS中的闭包?

闭包用的多的两个作用:读取函数内部的变量值;让这些变量值始终保存着(在内存中)。

同时需要注意的是:闭包慎用,不滥用,不乱用,由于函数内部的变量都被保存在内存中,会导致内存消耗大。

59、说说你对this的理解?

在JavaScript中,this通常指向的是我们正在执行的函数本身,或者是,指向该函数所属的对象。

全局的this → 指向的是Window

函数中的this → 指向的是函数所在的对象 错误答案

对象中的this → 指向其本身

事件中this → 指向事件对象

60、分别阐述split(),slice(),splice(),join()?

join()用于把数组中的所有元素拼接起来放入一个字符串。所带的参数为分割字符串的分隔符,默认是以逗号分开。归属于Array

split()即把字符串分离开,以数组方式存储。归属于Stringstring

slice() 方法可从已有的数组中返回选定的元素。该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。返回的是含有被删除的元素的数组。

61、事件委托是什么?

让利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!

62、如何阻止事件冒泡和默认事件?

阻止浏览器的默认行为

window.event?window.event.returnValue=false:e.preventDefault();

停止事件冒泡

window.event?window.event.cancelBubble=true:e.stopPropagation();

原生JavaScript中,return false;只阻止默认行为,不阻止冒泡,jQuery中的return false;既阻止默认行为,又阻止冒泡

63、添加 删除替换 插入到某个接点的方法?

obj.appendChidl()

obj.removeChild()

obj.replaceChild()

obj.innersetBefore()

64、你用过require.js吗?它有什么特性?

(1)实现js文件的异步加载,避免网页失去响应;

(2)管理模块之间的依赖性,便于代码的编写和维护。

65、谈一下JS中的递归函数,并且用递归简单实现阶乘?

递归即是程序在执行过程中不断调用自身的编程技巧,当然也必须要有一个明确的结束条件,不然就会陷入死循环。

66、请用正则表达式写一个简单的邮箱验证。

/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;

67、简述一下你对web性能优化的方案?

1、尽量减少 HTTP 请求

2、使用浏览器缓存

3、使用压缩组件

4、图片、JS的预载入

5、将脚本放在底部

6、将样式文件放在页面顶部

7、使用外部的JS和CSS

8、精简代码

68、在JS中有哪些会被隐式转换为false

Undefined、null、布尔值false、NaN、零、空字符串

69、定时器setInterval有一个有名函数fn1,setInterval(fn1,500)与setInterval(fn1(),500)有什么区别?

第一个是重复执行每500毫秒执行一次,后面一个只执行一次。

70、外部JS文件出现中文字符,会出现什么问题,怎么解决?

会出现乱码,加charset=”GB2312”;

另一种解决方式:网页文件和外部JS文件都是UTF8编码

71、谈谈浏览器的内核,并且说一下什么是内核?

Trident (['traɪd(ə)nt])--IE,Gecko(['gekəʊ])--Firefox, Presto (['prestəʊ])--opera,webkit—谷歌和Safari

浏览器内核又可以分成两部分:渲染引擎和 JS 引擎。它负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机。JS 引擎则是解析 Javascript 语言,执行 javascript 语言来实现网页的动态效果。

72、JavaScript原型,原型链 ? 有什么特点?

*  原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链。

*  原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链。

* JavaScript的数据对象有那些属性值?

  writable:这个属性的值是否可以改。

  configurable:这个属性的配置是否可以删除,修改。

  enumerable:这个属性是否能在for…in循环中遍历出来或在Object.keys中列举出来。

  value:属性值。

* 当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性,如果没有的话,就会查找他的Prototype对象是否有这个属性。

 function clone(proto) {

  function Dummy() { }

  Dummy.prototype = proto;

  Dummy.prototype.constructor = Dummy;

  return new Dummy(); //等价于Object.create(Person);

 }

       function object(old) {

        function F() {};

        F.prototype = old;

        return new F();

       }

   var newObj = object(oldObject);

74、事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡?

 1. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。 

 2. 事件处理机制:IE是事件冒泡、火狐是 事件捕获;

 3. ev.stopPropagation();

78、JSON 的了解

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小

{'age':'12', 'name':'back'}

79、js延迟加载的方式有哪些

defer和async、动态创建DOM方式(用得最多)、按需异步载入js

83、JS中的call()和apply()方法的区别?

例子中用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);

注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

function add(a,b){

   alert(a+b);

}

function sub(a,b){

   alert(a-b);

}

add.call(sub,3,1); 

84、Jquery与jQuery UI 有啥区别?

*jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。

*jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。

提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等

85、jquery 中如何将数组转化为json字符串,然后再转化回来?

jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:

   $.fn.stringifyArray = function(array) {

       return JSON.stringify(array)

    }

   $.fn.parseArray = function(array) {

       return JSON.parse(array)

    }

    然后调用:

   $("").stringifyArray(array)

86、JavaScript中的作用域与变量声明提升?

其他部分

(HTTP、正则、优化、重构、响应式、移动端、团队协作、SEO、UED、职业生涯)

    *基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。

    *频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。

     比如:var str=$("a").attr("href");

   *for (var i = size; i < arr.length; i++) {}

    for 循环每一次循环都查找了数组 (arr) 的.length 属性,在开始循环的时候设置一个变量来存储这个数字,可以让循环跑得更快:

    for (var i = size, length = arr.length; i < length; i++) {}

87、前端开发的优化问题(看雅虎14条性能优化原则)。

参考资料:J:\代码,PPT,笔记,电子书\面试题\雅虎14条优化规则.docx

  (1) 减少http请求次数:CSSSprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。

  (2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数

  (3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。

  (4) 当需要设置的样式很多时设置className而不是直接操作style。

  (5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。

  (6) 避免使用CSS Expression(css表达式)又称Dynamicproperties(动态属性)。

  (7) 图片预加载,将样式表放在顶部,将脚本放在底部  加上时间戳。

  (8) 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。

88、http状态码有那些?分别代表是什么意思?

   100-199 用于指定客户端应相应的某些动作。

   200-299 用于表示请求成功。

   300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。

400-499 用于指出客户端的错误。

400  语义有误,当前请求无法被服务器理解。

401  当前请求需要用户验证

403  服务器已经理解请求,但是拒绝执行它。

500-599 用于支持服务器错误。

503 – 服务不可用

89、一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)

    要熟悉前后端的通信流程,最好把动态网站的背后细节也介绍一遍

2、jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?

this执行init构造函数自身,其实就是jQuery实例对象,返回this是为了实现jQuery的链式操作

3、 jquery中如何将数组转化为json字符串,然后再转化回来?

$.parseJSON('{"name":"John"}');

JSON.stringify

4、 jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

递归赋值

5、 jquery.extend 与 jquery.fn.extend的区别?

Jquery.extend用来扩展jQuery对象本身;jquery.fn.extend用来扩展jQuery实例

6、谈一下Jquery中的bind(),live(),delegate(),on()的区别?

jquery1.7以后就推荐使用on的方式来进行事件绑定了

7、JQuery一个对象可以同时绑定多个事件,这是如何实现的?

可以同时绑定多个事件,低层实现原理是使用addEventListner与attachEvent兼容处理做事件注册

3、 Jquery与jQuery UI有啥区别?

jQuery是操作dom的框架,jQueryUI是基于jQuery做的一个UI组件库

4、 jQuery和Zepto的区别?各自的使用场景?

jQuery主要用于pc端,当然有对应的jQuerymobile用于移动端,zepto比jQuery更加小巧,主要用于移动端

jquer mobile相对于zepto功能强大,但是体积也很庞大,zepto非常的轻量

5、 针对 jQuery 的优化方法?

a、优先使用ID选择器

b、jquery获取到的DOM元素如果需要多次使用,建议使用一个变量将其保存起来,因为操作DOM的过程是非常耗费性能的

c、在class前使用tag(标签名)

d、给选择器一个上下文

e、慎用 .live()方法(应该说尽量不要使用)

f、使用data()方法存储临时变量

7、Zepto的点透问题如何解决?

点透主要是由于两个div重合,例如:一个div调用show(),一个div调用hide();这个时候当点击上面的div的时候就会影响到下面的那个div;

解决办法主要有2种:

1.github上有一个叫做fastclick的库,它也能规避移动设备上click事件的延迟响应,https://github.com/ftlabs/fastclick

将它用script标签引入页面(该库支持AMD,于是你也可以按照AMD规范,用诸如require.js的模块加载器引入),并且在dom ready时初始化在body上,

2.根据分析,如果不引入其它类库,也不想自己按照上述fastclcik的思路再开发一套东西,需要1.一个优先于下面的“divClickUnder”捕获的事件;2.并且通过这个事件阻止掉默认行为(下面的“divClickUnder”对click事件的捕获,在ios的safari,click的捕获被认为和滚屏、点击输入框弹起键盘等一样,是一种浏览器默认行为,即可以被event.preventDefault()阻止的行为)。

12、知道各种JS框架(Angular, Backbone, Ember, React,Meteor, Knockout...)么? 能讲出他们各自的优点和缺点么?

知识面的宽度,流行框架要多多熟悉

angular、backbone、knockout都是完整的MV*框架

angular是双向数据绑定的,backbone、knockout是单向数据绑定的

React只是单纯地View层

13、Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法?

Underscore的熟悉程度

14、使用过angular吗?angular中的过滤器是干什么用的

在表达式中转换数据<p>姓名为 {{ lastName | uppercase }}</p>

currency,是什么过滤器——格式化数字为货币格式,单位是$符。

九、移动APP开发

1、移动端最小触控区域是多大?

移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时?(click 有 300ms 延迟,为了实现safari的双击事件的设计,浏览器要知道你是不是要双击操作。)

十、NodeJs

1、对Node的优点和缺点提出了自己的看法:

*(优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,

因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。

此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,

因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。

*(缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,

而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。

3、Node.js的适用场景?

1)、实时应用:如在线聊天,实时通知推送等等(如socket.io)

2)、分布式应用:通过高效的并行I/O使用已有的数据

3)、工具类应用:海量的工具,小到前端压缩部署(如grunt),大到桌面图形界面应用程序

4)、游戏类应用:游戏领域对实时和并发有很高的要求(如网易的pomelo框架)

5)、利用稳定接口提升Web渲染能力

6)、前后端编程语言环境统一:前端开发人员可以非常快速地切入到服务器端的开发(如著名的纯Javascript全栈式MEAN架构)

6、什么是“前端路由”?什么时候适合使用“前端路由”? “前端路由”有哪些优点和缺点?

熟悉前后端通信相关知识

前端路由就是在不进行后端请求的情况下对页面进行跳转

7、对Node的优点和缺点提出了自己的看法?

优点:

1. 因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。

2. 与Node代理服务器交互的客户端代码是由javascript语言编写的,因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。

缺点:

1. Node是一个相对新的开源项目,所以不太稳定,它总是一直在变。

2. 缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子(第三方库现在已经很丰富了,所以这个缺点可以说不存在了)。

十一、前端概括性问题

1、常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?

使用率较高的框架有jQuery、YUI、Prototype、Dojo、Ext.js、Mootools等。尤其是jQuery,超过91%。

轻量级框架有Modernizr、underscore.js、backbone.js、Raphael.js等。(理解这些框架的功能、性能、设计原理)

前端开发工具:Sublime Text 、Eclipse、Notepad、Firebug、HttpWatch、Yslow。

开发过的插件:城市选择插件,汽车型号选择插件、幻灯片插件。弹出层。(写过开源程序,加载器,js引擎更好)

6、 对BFC规范的理解?

Formatting Context:指页面中的一个渲染区域,并且拥有一套渲染规则,他决定了其子元素如何定位,以及与其他元素的相互关系和作用。

3、99%的网站都需要被重构是那本书上写的?

网站重构:应用web标准进行设计(第2版)

4、WEB应用从服务器主动推送Data到客户端有那些方式?

   html5 websoket

   WebSocket通过Flash

   XHR长时间连接

   XHR Multipart Streaming

    不可见的Iframe

<script>标签的长时间连接(可跨域)

6、平时如何管理你的项目,如何设计突发大规模并发架构?

先期团队必须确定好全局样式(globe.css),编码模式(utf-8) 等

编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);

标注样式编写人,各模块都及时标注(标注关键样式调用的地方);

页面进行标注(例如 页面 模块 开始和结束);

CSS跟HTML 分文件夹并行存放,命名都得统一(例如style.css)

JS 分文件夹存放 命民以该JS 功能为准英文翻译;

图片采用整合的 images.png png8 格式文件使用 尽量整合在一起使用方便将来的管理

7、那些操作会造成内存泄漏?

内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。

垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。

setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。

闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

8、你说你热爱前端,那么应该WEB行业的发展很关注吧? 说说最近最流行的一些东西吧?

Node.js、Mongodb、npm、MVVM、MEAN、react、angularjs、browserify、webpack

11、      你所知道的页面性能优化方法有那些?

压缩、合并,减少请求,代码层析优化。。。

15、你对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?

前端界面工程师是跟用户接触最近的一个职位,一个产品好坏并不是由企业说了算,用户喜欢的才是好的产品,而用户所能评价就是他看到的和触摸到的,前端界面工程师要做的就是呈现给用户这些信息,一个好的前端界面工程师应该是一个能真正了解客户的人。

  前景:

  随着互联网行业的蓬勃发展和终端设备的更新换代,前端技术也要时刻更新,要用更多的轻量型代码完成更复杂的工作。

  UI、产品经理、前端工程师要紧密配合,力求引领时代而不是跟随时代

18、phpinset和empty的区别,举例说明

1、empty函数

用途:检测变量是否为空

判断:如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。注意:empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用;

2、isset函数

用途:检测变量是否设置

判断:检测变量是否设置,并且不是 NULL。如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个NULL 字节("\0")并不等同于 PHP 的 NULL 常数。

22、如何优化网页加载速度?

   1.减少css,js文件数量及大小(减少重复性代码,代码重复利用),压缩CSS和Js代码

   2.图片的大小

   3.把css样式表放置顶部,把js放置页面底部

   4.减少http请求数

   5.使用外部 Js 和 CSS

21.解释下浮动和它的工作原理,列举不同的清除浮动的技巧。

浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。

浮动元素引起的问题和解决办法?

浮动元素引起的问题:

父元素的高度无法被撑开,影响与父元素同级的元素

与浮动元素同级的非浮动元素(内联元素)会跟随其后

若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构

解决方法: 使用CSS中的clear:both;属性来清除元素的浮动可解决2、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,设置`overflow`为`hidden`或者auto

给包含浮动元素的父标签添加css属性overflow:auto; zoom:1; zoom:1用于兼容IE6。

23.解释下CSS sprites,以及你要如何在页面或网站中使用它。

CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background-repeat”,“background-position”的组合进行背景定位,background-position可以用数字能精确的定位出背景图片的位置。

29.你用过媒体查询,或针对移动端的布局/CSS吗?

媒体查询,就是响应式布局。通过不同的媒介类型和条件定义样式表规则。媒介查询让CSS可以更精确作用于不同的媒介类型和同一媒介的不同条件。

语法结构及用法:@media 设备名 only (选取条件) not (选取条件) and(设备选取条件),设备二{sRules}。

示例如下:

 1/* 当浏览器的可视区域小于980px */

2@media screen and (max-width: 980px) {

7}

8/* 当浏览器的可视区域小于650px */

9@media screen and (max-width: 650px) {}

30.你熟悉SVG样式的书写吗?

SVG 意为可缩放矢量图形(Scalable Vector Graphics)。

什么是SVG?

SVG 指可伸缩矢量图形 (Scalable Vector Graphics)

SVG 用来定义用于网络的基于矢量的图形

SVG 使用 XML 格式定义图形

SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失

31.如何优化网页的打印样式?

<link rel = "stylesheet" type = "text/css" media = "screen" href = "xxx.css"/>

其中media指定的属性就是设备,显示器上就是screen,打印机则是print,电视是tv,投影仪是projection。打印样式示例如下:

<link rel = "stylesheet" type = "text/css" media = "print" href = "yyy.css"/>

但打印样式表也应注意以下事项:

打印样式表中最好不要用背景图片,因为打印机不能打印CSS中的背景。如要显示图片,请使用html插入到页面中。

最好不要使用像素作为单位,因为打印样式表要打印出来的会是实物,所以建议使用pt和cm。

隐藏掉不必要的内容。(@print div{display:none;})

打印样式表中最好少用浮动属性,因为它们会消失。如果想要知道打印样式表的效果如何,直接在浏览器上选择打印预览就可以了。

32.在书写高效CSS时会有哪些问题需要考虑?

1.样式是:从右向左的解析一个选择器;

2.ID最快,Universal最慢有四种类型的key selector,解析速度由快到慢依次是:ID、class、tag和universal ;

3.不要tag-qualify(永远不要这样做ul#main-navigation{}ID已经是唯一的,不需要Tag来标识,这样做会让选择器变慢。);

4.后代选择器最糟糕(换句话说,下面这个选择器是很低效的:html body ul li a{});

5.想清楚你为什么这样写;

6.CSS3的效率问题(CSS3选择器(比如:nth-child)能够漂亮的定位我们想要的元素,又能保证我们的CSS整洁易读。但是这些神奇的选择器会浪费很多的浏览器资源。);

7.我们知道#ID速度是最快的,那么我们都用ID,是不是很快。但是我们不应该为了效率而牺牲可读性和可维护性。

33.使用CSS预处理器的优缺点有哪些?

    LESS&SassLESS是受Sass启发而开发的工具,它列出了如下开发的理由:

    “为什么要开发一个Sass的替代品呢?原因很简单:首先是语法。Sass的一个关键特性是缩进式的语法,这种语法可以产生柱式外观的代码。但是你需要花费时间学习一门新的语法以及重新构建你现在的样式表。LESS给CSS带来了很多特性,使得LESS能够和CSS无缝地紧密结合在一起。因此,你可以平滑地由CSS迁移到LESS,如果你只是对使用变量或者操作感兴趣的话,你不需要学习一整门全新的语言。”

   

36.解释一下你对盒模型的理解,以及如何在CSS中告诉浏览器使用不同的盒模型来渲染你的布局。

关于盒模型请看文章CSS之布局与定位

请解释一下*{box-sizing:border-box;}的作用,并且说明使用它有什么好处?

说到IE的bug,在IE6以前的版本中,IE对盒模型的解析出现一些问题,跟其它浏览器不同,将border与padding都包含在width之内。而另外一些浏览器则与它相反,是不包括border和padding的。

在我们开发的过程中会发现,有时候,如果对页面中的大区域进行设置时,将border、padding计算到width和height之内,反而更灵活。但W3C的CSS2.1规范却规定了他们并不能被包含其中。考虑到这个问题,css3中引入了一个新的属性:box-sizing,它具有“content-box”和”border-box“两个值。

1box-sizing:content-box

当我们设置box-sizing:content-box;时,浏览器对盒模型的解释遵从我们之前认识到的W3C标准,当它定义width和height时,它的宽度不包括border和padding。

1box-sizing:border-box

当我们设置box-sizing:border-box;时,浏览器对盒模型的解释与IE6之前的版本相同,当它定义width和height时,border和padding则是被包含在宽高之内的。内容的宽和高可以通过定义的“width”和“height”减去相应方向的“padding”和“border”的宽度得到。内容的宽和高必须保证不能为负,必要时将自动增大该元素border box的尺寸以使其内容的宽或高最小为0。

40.解释下事件代理。

JavaScript事件代理则是一种简单的技巧,通过它你可以把事件处理器添加到一个父级元素上,这样就避免了把事件处理器添加到多个子级元素上。当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数。这主要得益于浏览器的事件冒泡机制。事件代理用到了两个在JavaSciprt事件中常被忽略的特性:事件冒泡以及目标元素。

41.解释下JavaScript中this是如何工作的。

this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。匿名函数或不处于任何对象中的函数指向window 。

1.如果是call,apply,with,指定的this是谁,就是谁。

2.普通的函数调用,函数被谁调用,this就是谁。

47.描述以下变量的区别:null,undefined或undeclared?

JavaScript的最初版本是这样区分的:null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。

但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。

null表示"没有对象",即该处不应该有值。典型用法是:

用来初始化一个变量,这个变量可能被赋值为一个对象。

用来和一个已经初始化的变量比较,这个变量可以是也可以不是一个对象。

当函数的参数期望是对象时,被用作参数传入。

当函数的返回值期望是对象时,被用作返回值传出。

作为对象原型链的终点。

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:

变量被声明了,但没有赋值时,就等于undefined。

调用函数时,应该提供的参数没有提供,该参数等于undefined。

对象没有赋值的属性,该属性的值为undefined。

函数没有返回值时,默认返回undefined。

该如何检测它们?

null:表示无值;undefined:表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。

==运算符将两者看作相等。如果要区分两者,要使用===或typeof运算符。

48.什么是闭包,如何使用它,为什么要使用它?

包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

使用闭包的注意点:

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

(关于闭包,详细了解请看JavaScript之作用域与闭包详解

55.你何时优化自己的代码?

请看文章JavaScript之高效编程 JavaScript编码风格指南

60.请解释JSONP的工作原理,以及它为什么不是真正的AJAX。

JSONP (JSON withPadding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的javascript,于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据,然后在 pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。JSONP易于实现,但是也会存在一些安全隐患,如果第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。

AJAX是不跨域的,而JSONP是一个是跨域的,还有就是二者接收参数形式不一样!

68.==和===有什么不同?

”==””===”是不同的,一个是判断值是否相等,一个是判断值及类型是否完全相等。

74.什么是三元表达式?“三元”表示什么意思?

三元表达式:? :三元--三个操作对象

在表达式boolean-exp? value0 : value1 中,如果“布尔表达式”的结果为true,就计算“value0”,而且这个计算结果也就是操作符最终产生的值。如果“布尔表达式”的结果为false,就计算“value1”,同样,它的结果也就成为了操作符最终产生的值。

82.请说出你可以传递给jQuery方法的四种不同值。

选择器(字符串),HTML(字符串),回调函数,HTML元素,对象,数组,元素数组,jQuery对象等。

7、 问:对于面向对象编程这块用的多吗?你是怎样理解的?

答:其实面向对象编程这块用的还是比较多的,因为他有许多优点他是一种程序开发的方法,它将对象作为程序的基本单元,将程序和数据封装其中,可以大大提高软件的灵活性、重用性和扩展性。可以做到我们的属性私有方法共享,对于项目开发来说是比较好用的,那我在实际的项目开发中也经常有用到面向对象的编程思想,用构造函数的方式建立对象的私有属性,用原型的方法构建共享的方法,这样在不同地方如果我们要用某一个对象的属性或者方法我们直接调用这个对象就可以直接使用了,而且对于整个方法的更改,或者属性的设置更改,我们只需要更改对象中的值就可以使整个项目调用这个对象的地方更改,非常方便,而且做出的项目是非常符合他的三大特征的,封装,继承和多态,尤其是在做游戏开发的时候,dom操作非常频繁,很多方法频繁调用,这个时候我们用面向对象的编程思想进行编写,会大大的提高开发速度,后期的维护修改也是非常方便的。

7、HTML5的新特性了解吗?你觉得有什么优缺点?

答:h5出了很多新标签,像header footer等,新标签的出现能够很好的优化页面,而且像是音视频标签的出现取代了传统的flash插件,给用户带来了很好的体验,新增的input表单类型,能够更好地帮助我们对输入的内容进行一个处理判断,减少了开发人员的代码书写量,总的来说它的优点还是非常多的,像是

1)提高可用性和改进用户的友好体验;

2)有几个新的标签,这将有助于开发人员定义重要的内容;

3)可以给站点带来更多的多媒体元素(视频和音频);

4)可以很好的替代FLASH和Silverlight;

5)当涉及到网站的抓取和索引的时候,对于SEO很友好;

6)将被大量应用于移动应用程序和游戏。

但是h5新并不表示它很安全,他也有缺点的:

HTML5所构建的网页和其他语言编写的网页一样容易泄露一些敏感数据。欧洲网络信息安全机构(European Network and Information Security Agency ENISA) 已经警告说HTML5可能并不够安全。2013年3月HTML5编程语言的一个漏洞被发现:它允许网站利用数GB垃圾数据对用户展开轰炸甚至会在短时间内将硬盘塞满,多款主流浏览器均会受此影响。

8、你做项目的时候如何优化你的网站?

答:1.   在书写HTML代码的时候,遵循标签语义化的要求,根据标签的语义性进行选择2.    HTML代码要合理嵌套3.    使用外部引入样式表和JS行为代码,实现结构、样式和行为的相分离,降低模块间的耦合度。4.   CSS规则命名中,一律采用小写加中划线的方式,不使用下划线或大写字母,命名采用更简明有语义的英文单词进行组合,进行合理的缩写5.    CSS代码的书写顺序遵循CSS样式的渲染顺序:显示属性-自身属性-文本属性-其他7.    在CSS代码当中,尽量的规避掉不同浏览器的兼容问题8.    尽量不在代码中出现没有意义的空标签9.   使用背景图合并技术,将多张背景图合并到一张图片上,从而降低页面与服务器之间的请求次数。10.   权衡嵌套层级以及扩展性等多个方面后,在适当位置使用三层嵌套技术11.    合理的填写html文件中的title、meta等内容,合理书写a标签的title、img标签的title和alt,提升网站的SEO  合理控制JS文件的引入位置,提升网站的加载速度。合理书写代码注释    合理控制JS文件的引入位置,提升网站的加载速度。

9、布局这块你一般都是用什么布局的?

答:通常情况下是用html+css布局的,也有用ionic+angular框架做的,主要的布局方式有弹性布局,浮动布局以及响应式布局(这里问到响应式)响应式布局就是将已有的开发技巧(弹性网格布局、弹性图片、媒体和媒体查询)整合起来,命名为响应式网页设计,是一种针对任意设备对网页内容进行“完美”布局的一种显示机制。对于重内容的网站,例如形象展示,则比较适合使用响应式web设计,总的来说它是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。

有许多优势

多终端视觉和操作体验风格统一

兼容当前及未来新设备

节约了开发成本,维护成本也降低很多

当然每个技术都不是十全十美,也是有一些瑕疵存在的,兼容性:低版本浏览器兼容性有问题

移动带宽流量:相比较手机定制网站,流量稍大,但比较加载一个完整pc端网站显然是小得多

代码累赘,会出现隐藏无用的元素,加载时间加长

在设计的初期就要考虑的页面如何在多终端显示,兼容各种设备工作量大

ES5 一些语言特性的缺失

由于上面的很多问题,所以ES 需要不断的改进, 当然新的版本肯定不可能一下子解决之前所有的问题。

已有JavaScript的问题这一块就不细说了,因为能来看这篇文章的人,应该对下面我列的几个突出的问题都有感受。

没有块级作用域,这个导致上面示例7的问题

全局变量的污染

类的写法比较怪异

没有模块管理

异步调用写法容易产生 “回调地狱”

Babel 入门教程

Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行

 第一步肯定是配置文件呀.babelrc   就是用来设置转码规则和插件  把这些转码加入到配置文件中。

 第二部就是命令行转码  专门提供的babel-cli工具,用于命令行转码

 第三部就是 这个babel-cli工具提供一个babel-node的命令,提供了一个es6的repl环境。而且他支持node的repl的所有环境,而且可以运行es6的代码。(有一点他不是单独安装,是和babel-cli一起安装的 )、这个babel-node的命令直接运行在es6 的脚本上。

 第四部 babel-register模块改写requier命令,为他加上一个钩子,每当使用requier加载js、jsx、.es、es6后缀的名字时候都会先用babel转码,所以就不需要手动对index.js转码

 第五步 如果某些代码需要条用BABEL的API进行转码,就要使用使用babel-core模块

 第六步 BABEL默认之转换新的javascript语句,而不转换新的API

 第七步 BABEL也可以用于浏览器环境,从babel的6.0开始,不在直接提供浏览器的版本,如果你没有或者不想使用构建工具,可以通过安装5.x的版本进行babel-core模块进行获取

Webpack

什么是Webpack

WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。

WebPack和Grunt以及Gulp相比有什么特性

其实Webpack和另外两个并没有太多的可比性,Gulp/Grunt是一种能够优化前端的开发流程的工具,而WebPack是一种模块化的解决方案,不过Webpack的优点使得Webpack在很多场景下可以替代Gulp/Grunt类的工具。

Grunt和Gulp的工作方式是:在一个配置文件中,指明对某些文件进行类似编译,组合,压缩等任务的具体步骤,工具之后可以自动替你完成这些任务。

Grunt和Gulp的工作流程

Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件

Webpack工作方式

如果实在要把二者进行比较,Webpack的处理速度更快更直接,能打包更多不同类型的文件。

HTML


语义化

  • HTML标签的语义化是指:通过使用包含语义的标签(如h1-h6)恰当地表示文档结构
  • css命名的语义化是指:为html标签添加有意义的class
  • 为什么需要语义化:
    • 去掉样式后页面呈现清晰的结构
    • 盲人使用读屏器更好地阅读
    • 搜索引擎更好地理解页面,有利于收录
    • 便团队项目的可持续运作及维护

简述一下你对HTML语义化的理解?

  • 用正确的标签做正确的事情。
  • html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析;
  • 即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的;
  • 搜索引擎的爬虫也依赖于HTML标记来确定上下文和各个关键字的权重,利于SEO;
  • 使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解

Doctype作用?标准模式与兼容模式各有什么区别?

  • <!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前。告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现
  • 标准模式的排版 和JS运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作

HTML5 为什么只需要写

  • HTML5 不基于 SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运行)
  • 而HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型

行内元素有哪些?块级元素有哪些?(void)元素有那些?

  • 行内元素有:a b span img input select strong(强调的语气)
  • 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
  • 常见的空元素:<br> <hr> <img> <input> <link> <meta>

页面导入样式时,使用link@import有什么区别?

  • link属于XHTML标签,除了加载CSS外,还能用于定义RSS,定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS
  • 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载
  • import是CSS2.1 提出的,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题

介绍一下你对浏览器内核的理解?

  • 主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎
  • 渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核
  • JS引擎则:解析和执行javascript来实现网页的动态效果
  • 最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎

常见的浏览器内核有哪些?

  • Trident内核:IE,MaxThon,TT,The World,360,搜狗浏览器等。[又称MSHTML]
  • Gecko内核:Netscape6及以上版本,FF,MozillaSuite/SeaMonkey等
  • Presto内核:Opera7及以上。 [Opera内核原为:Presto,现为:Blink;]
  • Webkit内核:Safari,Chrome等。 [ Chrome的Blink(WebKit的分支)]

html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML HTML5

  • HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加
    • 绘画 canvas
    • 用于媒介回放的 video 和 audio 元素
    • 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失
    • sessionStorage 的数据在浏览器关闭后自动删除
    • 语意化更好的内容元素,比如 article、footer、header、nav、section
    • 表单控件,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]-->

  • 如何区分HTML5: DOCTYPE声明\新增的结构元素\功能元素

HTML5的离线储存怎么使用,工作原理能不能解释一下?

  • 在用户没有与因特网连接时,可以正常访问站点或应用,在用户与因特网连接时,更新用户机器上的缓存文件
  • 原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示
  • 如何使用:
    • 页面头部像下面一样加入一个manifest的属性;
    • 在cache.manifest文件的编写离线存储的资源
    • 在离线状态时,操作window.applicationCache进行需求实现

CACHE MANIFEST

    #v0.11

    CACHE:

    js/app.js

    css/style.css

    NETWORK:

   resourse/logo.png

    FALLBACK:

    / /offline.html

浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?

  • 在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。
  • 离线的情况下,浏览器就直接使用离线存储的资源。

请描述一下 cookiessessionStorage localStorage 的区别?

  • cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)
  • cookie数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递
  • sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存
  • 存储大小:
    • cookie数据大小不能超过4k
    • sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
  • 有期时间:
    • localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据
    • sessionStorage 数据在当前浏览器窗口关闭后自动删除
    • cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

iframe有那些缺点?

  • iframe会阻塞主页面的Onload事件
  • 搜索引擎的检索程序无法解读这种页面,不利于SEO
  • iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载
  • 使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值,这样可以绕开以上两个问题

Label的作用是什么?是怎么用的?

  • label标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件

HTML5form如何关闭自动完成功能?

  • 给不想要提示的 form 或某个 input 设置为 autocomplete=off。

如何实现浏览器内多个标签页之间的通信? (阿里)

  • WebSocket、SharedWorker
  • 也可以调用localstorge、cookies等本地存储方式

webSocket如何兼容低浏览器?(阿里)

  • Adobe Flash Socket 、
  • ActiveX HTMLFile (IE) 、
  • 基于 multipart 编码发送 XHR 、
  • 基于长轮询的 XHR

页面可见性(Page Visibility API可以有哪些用途?

  • 通过 visibilityState 的值检测页面当前是否可见,以及打开网页的时间等;
  • 在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放

如何在页面上实现一个圆形的可点击区域?

  • map+area或者svg
  • border-radius
  • 纯js实现 需要求一个点在不在圆上简单算法、获取鼠标坐标等等

实现不使用 border 画出1px高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果

<div style="height:1px;overflow:hidden;background:red"></div>

网页验证码是干嘛的,是为了解决什么安全问题

  • 区分用户是计算机还是人的公共全自动程序。可以防止恶意破解密码、刷票、论坛灌水
  • 有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试

titleh1的区别、bstrong的区别、iem的区别?

  • title属性没有明确意义只表示是个标题,H1则表示层次明确的标题,对页面信息的抓取也有很大的影响
  • strong是标明重点内容,有语气加强的含义,使用阅读设备阅读网络时:会重读,而是展示强调内容
  • i内容展示为斜体,em表示强调的文本

页面导入样式时,使用 link @import 有什么区别?

  • link 属于HTML标签,除了加载CSS外,还能用于定 RSS等;@import 只能用于加载CSS
  • 页面加载的时,link 会同时被加载,而 @import 引用的 CSS 会等到页面被加载完再加载
  • @import 只在 IE5 以上才能被识别,而 link 是HTML标签,无兼容问题

介绍一下你对浏览器内核的理解?

  • 浏览器内核主要分为两部分:渲染引擎(layout engineer 或 Rendering Engine) 和 JS引擎
  • 渲染引擎负责取得网页的内容进行布局计和样式渲染,然后会输出至显示器或打印机
  • JS引擎则负责解析和执行JS脚本来实现网页的动态效果和用户交互
  • 最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎

常见的浏览器内核有哪些?

  • Blink内核:新版 Chrome、新版 Opera
  • Webkit内核:Safari、原Chrome
  • Gecko内核:FireFox、Netscape6及以上版本
  • Trident内核(又称MSHTML内核):IE、国产浏览器
  • Presto内核:原Opera7及以上

HTML5有哪些新特性?

  • 新增选择器 document.querySelector、document.querySelectorAll
  • 拖拽释放(Drag and drop) API
  • 媒体播放的 video 和 audio
  • 本地存储 localStorage 和 sessionStorage
  • 离线应用 manifest
  • 桌面通知 Notifications
  • 语意化标签 article、footer、header、nav、section
  • 增强表单控件 calendar、date、time、email、url、search
  • 地理位置 Geolocation
  • 多任务 webworker
  • 全双工通信协议 websocket
  • 历史管理 history
  • 跨域资源共享(CORS) Access-Control-Allow-Origin
  • 页面可见性改变事件 visibilitychange
  • 跨窗口通信 PostMessage
  • Form Data 对象
  • 绘画 canvas

HTML5移除了那些元素?

  • 纯表现的元素:basefont、big、center、font、s、strike、tt、u
  • 对可用性产生负面影响的元素:frame、frameset、noframes

如何处理HTML5新标签的浏览器兼容问题?

  • 通过 document.createElement 创建新标签
  • 使用垫片 html5shiv.js

如何区分 HTML HTML5

  • DOCTYPE声明、新增的结构元素、功能元素

HTML5的离线储存工作原理能不能解释一下,怎么使用?

  • HTML5的离线储存原理:
    • 用户在线时,保存更新用户机器上的缓存文件;当用户离线时,可以正常访离线储存问站点或应用内容
  • HTML5的离线储存使用:
    • 在文档的 html 标签设置 manifest 属性,如 manifest="/offline.appcache"
    • 在项目中新建 manifest 文件,manifest 文件的命名建议:xxx.appcache
    • 在 web 服务器配置正确的 MIME-type,即 text/cache-manifest

浏览器是怎么对HTML5的离线储存资源进行管理和加载的?

  • 在线的情况下,浏览器发现 html 标签有 manifest 属性,它会请求 manifest 文件
  • 如果是第一次访问app,那么浏览器就会根据 manifest 文件的内容下载相应的资源并且进行离线存储
  • 如果已经访问过app且资源已经离线存储了,浏览器会对比新的 manifest 文件与旧的 manifest 文件,如果文件没有发生改变,就不做任何操作。如果文件改变了,那么就会重新下载文件中的资源并进行离线存储
  • 离线的情况下,浏览器就直接使用离线存储的资源。

iframe 有那些优点和缺点?

  • 优点:
    • 用来加载速度较慢的内容(如广告)
    • 可以使脚本可以并行下载
    • 可以实现跨子域通信
  • 缺点:
    • iframe 会阻塞主页面的 onload 事件
    • 无法被一些搜索引擎索识别
    • 会产生很多页面,不容易管理

label 的作用是什么?怎么使用的?

  • label标签来定义表单控件的关系:
    • 当用户选择label标签时,浏览器会自动将焦点转到和label标签相关的表单控件上
  • 使用方法1:
    • <label for="mobile">Number:</label>
    • <input type="text" id="mobile"/>
  • 使用方法2:
    • <label>Date:<input type="text"/></label>

如何实现浏览器内多个标签页之间的通信?

  • iframe + contentWindow
  • postMessage
  • SharedWorker(Web Worker API)
  • storage 事件(localStorge API)
  • WebSocket

webSocket 如何兼容低浏览器?

  • Adobe Flash Socket
  • ActiveX HTMLFile (IE)
  • 基于 multipart 编码发送 XHR
  • 基于长轮询的 XHR

页面可见性(Page Visibility API可以有哪些用途?

  • 在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放
  • 当用户浏览其他页面,暂停网站首页幻灯自动播放
  • 完成登陆后,无刷新自动同步其他页面的登录状态

title h1 的区别、b strong 的区别、i em 的区别?

  • title 表示是整个页面标题,h1 则表示层次明确的标题,对页面信息的抓取有很大的影响
  • strong 标明重点内容,有语气加强的含义,使用阅读设备阅读网络时,strong 会重读,而 b

是展示强调内容

  • i 内容展示为斜体,em 表示强调的文本
  • 自然样式标签:b, i, u, s, pre
  • 语义样式标签:strong, em, ins, del, code
  • 应该准确使用语义样式标签, 但不能滥用。如果不能确定时,首选使用自然样式标签

CSS


display: none; visibility:hidden; 的区别

  • 联系:它们都能让元素不可见
  • 区别:
    • display:none;会让元素完全从渲染树中消失,渲染的时候不占据任何空间;visibility: hidden;不会让元素从渲染树消失,渲染师元素继续占据空间,只是内容不可见
    • display: none;是非继承属性,子孙节点消失由于元素从渲染树消失造成,通过修改子孙节点属性无法显示;visibility:hidden;是继承属性,子孙节点消失由于继承了hidden,通过设置visibility: visible;可以让子孙节点显式
    • 修改常规流中元素的display通常会造成文档重排。修改visibility属性只会造成本元素的重绘
    • 读屏器不会读取display: none;元素内容;会读取visibility: hidden元素内容

css hack原理及常用hack

  • 原理:利用不同浏览器对CSS的支持和解析结果不一样编写针对特定浏览器样式。
  • 常见的hack有
    • 属性hack
    • 选择器hack
    • IE条件注释

link @import 的区别

  • link 是HTML方式, @import 是CSS方式
  • link最大限度支持并行下载,@import 过多嵌套导致串行下载,出现FOUC
  • link 可以通过 rel="alternate stylesheet" 指定候选样式
  • 浏览器对 link 支持早于@import ,可以使用 @import 对老浏览器隐藏样式
  • @import 必须在样式规则之前,可以在css文件中引用其他文件
  • 总体来说:link优于@import

CSS有哪些继承属性

  • 关于文字排版的属性如:
    • font
      • word-break
      • letter-spacing
      • text-align
      • text-rendering
      • word-spacing
      • white-space
      • text-indent
      • text-transform
      • text-shadow
    • line-height
    • color
    • visibility
    • cursor

display,float,position的关系

  • 如果 display 为none,那么position和float都不起作用,这种情况下元素不产生框
  • 否则,如果position值为absolute或者fixed,框就是绝对定位的,float的计算值为none,display根据下面的表格进行调整
  • 否则,如果float不是none,框是浮动的,display根据下表进行调整
  • 否则,如果元素是根元素,display根据下表进行调整
  • 其他情况下display的值为指定值 总结起来:绝对定位、浮动、根元素都需要调整 display

外边距折叠(collapsing margins)

  • 毗邻的两个或多个 margin 会合并成一个margin,叫做外边距折叠。规则如下:
    • 两个或多个毗邻的普通流中的块元素垂直方向上的margin会折叠
    • 浮动元素或inline-block元素或绝对定位元素的margin不会和垂直方向上的其他元素的margin折叠
    • 创建了块级格式化上下文的元素,不会和它的子元素发生margin折叠
    • 元素自身的margin-bottom和margin-top相邻时也会折

介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?

  • 有两种, IE 盒子模型、W3C 盒子模型;
  • 盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border);
  • 区 别: IE的content部分把 border 和 padding计算了进去;

CSS选择符有哪些?哪些属性可以继承?

  • id选择器( # myid)
  • 类选择器(.myclassname)
  • 标签选择器(div, h1, p)
  • 相邻选择器(h1 + p)
  • 子选择器(ul > li)
  • 后代选择器(li a)
  • 通配符选择器( * )
  • 属性选择器(a[rel = "external"])
  • 伪类选择器(a:hover, li:nth-child)
  • 可继承的样式: font-size font-family color, UL LI DL DD DT
  • 不可继承的样式:border padding margin width height

CSS优先级算法如何计算?

  • 优先级就近原则,同权重情况下样式定义最近者为准
  • 载入样式以最后载入的定位为准
  • 优先级为: !important > id > class > tag important 比 内联优先级高

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> 元素。

 

:after          在元素之前添加内容,也可以用来做清除浮动。

:before         在元素之后添加内容

:enabled       

:disabled       控制表单控件的禁用状态。

:checked        单选框或复选框被选中

如何居中div?如何居中一个浮动元素?如何让绝对定位的div居中?

  • 给div设置一个宽度,然后添加margin:0 auto属性

div{

    width:200px;

    margin:0 auto;

 }

  • 居中一个浮动元素

//确定容器的宽高500 300 的层

//设置层的外边距

 

 .div {

      width:500px ;height:300px;//高度可以不设

      margin:-150px 0 0 -250px;

     position:relative;         //相对定位

     background-color:pink;     //方便看效果

      left:50%;

      top:50%;

 }

  • 让绝对定位的div居中

  position:absolute;

  width: 1200px;

  background: none;

  margin: 0 auto;

  top: 0;

  left: 0;

  bottom: 0;

  right: 0;

display有哪些值?说明他们的作用

  • block 象块类型元素一样显示。
  • none 缺省值。象行内元素类型一样显示。
  • inline-block 象行内元素一样显示,但其内容象块类型元素一样显示。
  • list-item 象块类型元素一样显示,并添加样式列表标记。
  • table 此元素会作为块级表格来显示
  • inherit 规定应该从父元素继承 display 属性的值

position的值relativeabsolute定位原点是?

  • absolute
    • 生成绝对定位的元素,相对于值不为 static的第一个父元素进行定位。
  • fixed (老IE不支持)
    • 生成绝对定位的元素,相对于浏览器窗口进行定位。
  • relative
    • 生成相对定位的元素,相对于其正常位置进行定位。
  • static
    • 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right - z-index 声明)。
  • inherit
    • 规定从父元素继承 position 属性的值

CSS3有哪些新特性?

  • 新增各种CSS选择器 (: not(.input):所有 class 不是“input”的节点)
  • 圆角 (border-radius:8px)
  • 多列布局 (multi-column layout)
  • 阴影和反射 (Shadow\Reflect)
  • 文字特效 (text-shadow、)
  • 文字渲染 (Text-decoration)
  • 线性渐变 (gradient)
  • 旋转 (transform)
  • 增加了旋转,缩放,定位,倾斜,动画,多背景
  • transform:\scale(0.85,0.90)\ translate(0px,-30px)\ skew(-9deg,0deg)\Animation:

用纯CSS创建一个三角形的原理是什么?

// 把上、左、右三条边隐藏掉(颜色设为 transparent

#demo {

  width: 0;

  height: 0;

  border-width:20px;

  border-style:solid;

  border-color:transparent transparent red transparent;

}

一个满屏字布局如何设计?

  • 简单的方式:
    • 上面的div宽100%,
    • 下面的两个div分别宽50%,
    • 然后用float或者inline使其不换行即可

经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧

  • png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.
  • 浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一
  • IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;
  • Firefox下,只能使用getAttribute()获取自定义属性。
    • 解决方法:统一通过getAttribute()获取自定义属性
  • IE下,even对象有x,y属性,但是没有pageX,pageY属性
  • Firefox下,event对象有pageX,pageY属性,但是没有x,y属性

lili之间有看不见的空白间隔是什么原因引起的?有什么解决办法?

  • 行框的排列会受到中间空白(回车\空格)等的影响,因为空格也属于字符,这些空白也会被应用样式,占据空间,所以会有间隔,把字符大小设为0,就没有空格了

为什么要初始化CSS样式

  • 因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异

BFC规范(块级格式化上下文:block formatting context)的理解?

  • 一个页面是由很多个 Box 组成的,元素的类型和 display 属性,决定了这个 Box 的类型
  • 不同类型的 Box,会参与不同的 Formatting Context(决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染,也就是说BFC内部的元素和外部的元素不会互相影响

css定义的权重

// 以下是权重的规则:标签的权重为1class的权重为10id的权重为100,以下/// 例子是演示各种定义的权重值:

 

/*权重为1*/

div{

}

/*权重为10*/

.class1{

}

/*权重为100*/

#id1{

}

/*权重为100+1=101*/

#id1 div{

}

/*权重为10+1=11*/

.class1 div{

}

/*权重为10+10+1=21*/

.class1 .class2 div{

}

 

// 如果权重相同,则最后定义的样式会起作用,但是应该避免这种情况出现

display:inline-block 什么时候会显示间隙?(携程)

  • 移除空格、使用margin负值、使用font-size:0、letter-spacing、word-spacing

谈谈浮动和清除浮动

  • 浮动的框可以向左或向右移动,直到他的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流的块框表现得就像浮动框不存在一样。浮动的块框会漂浮在文档普通流的块框上

介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?

  • 盒子模型构成:内容(content)、内填充(padding)、 边框(border)、外边距(margin)
  • IE8及其以下版本浏览器,未声明 DOCTYPE,内容宽高会包含内填充和边框,称为怪异盒模型(IE盒模型)
  • 标准(W3C)盒模型:元素宽度 = width + padding + border + margin
  • 怪异(IE)盒模型:元素宽度 = width + margin
  • 标准浏览器通过设置 css3 的 box-sizing: border-box 属性,触发“怪异模式”解析计算宽高

box-sizing 常用的属性有哪些?分别有什么作用?

  • box-sizing: content-box; // 默认的标准(W3C)盒模型元素效果
  • box-sizing: border-box; // 触发怪异(IE)盒模型元素的效果
  • box-sizing: inherit; // 继承父元素 box-sizing 属性的值

CSS选择器有哪些?

  • id选择器 #id
  • 类选择器 .class
  • 标签选择器 div, h1, p
  • 相邻选择器 h1 + p
  • 子选择器 ul > li
  • 后代选择器 li a
  • 通配符选择器 *
  • 属性选择器 a[rel='external']
  • 伪类选择器 a:hover, li:nth-child

CSS哪些属性可以继承?哪些属性不可以继承?

  • 可以继承的样式:font-size、font-family、color、list-style、cursor
  • 不可继承的样式:width、height、border、padding、margin、background

CSS如何计算选择器优先?

  • 相同权重,定义最近者为准:行内样式 > 内部样式 > 外部样式
  • 含外部载入样式时,后载入样式覆盖其前面的载入的样式和内部样式
  • 选择器优先级: 行内样式[1000] > id[100] > class[10] > Tag[1]
  • 在同一组属性设置中,!important 优先级最高,高于行内样式

CSS3新增伪类有哪些?

  • :root 选择文档的根元素,等同于 html 元素
  • :empty 选择没有子元素的元素
  • :target 选取当前活动的目标元素
  • :not(selector) 选择除 selector 元素意外的元素
  • :enabled 选择可用的表单元素
  • :disabled 选择禁用的表单元素
  • :checked 选择被选中的表单元素
  • :after 在元素内部最前添加内容
  • :before 在元素内部最后添加内容
  • :nth-child(n) 匹配父元素下指定子元素,在所有子元素中排序第n
  • :nth-last-child(n) 匹配父元素下指定子元素,在所有子元素中排序第n,从后向前数
  • :nth-child(odd)
  • :nth-child(even)
  • :nth-child(3n+1)
  • :first-child
  • :last-child
  • :only-child
  • :nth-of-type(n) 匹配父元素下指定子元素,在同类子元素中排序第n
  • :nth-last-of-type(n) 匹配父元素下指定子元素,在同类子元素中排序第n,从后向前数
  • :nth-of-type(odd)
  • :nth-of-type(even)
  • :nth-of-type(3n+1)
  • :first-of-type
  • :last-of-type
  • :only-of-type
  • ::selection 选择被用户选取的元素部分
  • :first-line 选择元素中的第一行
  • :first-letter 选择元素中的第一个字符

请列举几种隐藏元素的方法

  • visibility: hidden; 这个属性只是简单的隐藏某个元素,但是元素占用的空间任然存在
  • opacity: 0; CSS3属性,设置0可以使一个元素完全透明
  • position: absolute; 设置一个很大的 left 负值定位,使元素定位在可见区域之外
  • display: none; 元素会变得不可见,并且不会再占用文档的空间。
  • transform: scale(0); 将一个元素设置为缩放无限小,元素将不可见,元素原来所在的位置将被保留
  • <div hidden="hidden"> HTML5属性,效果和display:none;相同,但这个属性用于记录一个元素的状态
  • height: 0; 将元素高度设为 0 ,并消除边框
  • filter: blur(0); CSS3属性,将一个元素的模糊度设置为0,从而使这个元素“消失”在页面中

rgba() opacity 的透明效果有什么不同?

  • opacity 作用于元素以及元素内的所有内容(包括文字)的透明度
  • rgba() 只作用于元素自身的颜色或其背景色,子元素不会继承透明效果

css 属性 content 有什么作用?

  • content 属性专门应用在 before/after 伪元素上,用于插入额外内容或样式

CSS3有哪些新特性?

  • 新增选择器 p:nth-child(n){color: rgba(255, 0, 0, 0.75)}
  • 弹性盒模型 display: flex;
  • 多列布局 column-count: 5;
  • 媒体查询 @media (max-width: 480px) {.box: {column-count: 1;}}
  • 个性化字体 @font-face{font-family: BorderWeb; src:url(BORDERW0.eot);}
  • 颜色透明度 color: rgba(255, 0, 0, 0.75);
  • 圆角 border-radius: 5px;
  • 渐变 background:linear-gradient(red, green, blue);
  • 阴影 box-shadow:3px 3px 3px rgba(0, 64, 128, 0.3);
  • 倒影 box-reflect: below 2px;
  • 文字装饰 text-stroke-color: red;
  • 文字溢出 text-overflow:ellipsis;
  • 背景效果 background-size: 100px 100px;
  • 边框效果 border-image:url(bt_blue.png) 0 10;
  • 转换
    • 旋转 transform: rotate(20deg);
    • 倾斜 transform: skew(150deg, -10deg);
    • 位移 transform: translate(20px, 20px);
    • 缩放 transform: scale(.5);
  • 平滑过渡 transition: all .3s ease-in .1s;
  • 动画 @keyframes anim-1 {50% {border-radius: 50%;}} animation: anim-1 1s;

请解释一下 CSS3 Flexbox(弹性盒布局模型)以及适用场景?

  • Flexbox 用于不同尺寸屏幕中创建可自动扩展和收缩布局

经常遇到的浏览器的JS兼容性有哪些?解决方法是什么?

  • 当前样式:getComputedStyle(el, null) VS el.currentStyle
  • 事件对象:e VS window.event
  • 鼠标坐标:e.pageX, e.pageY VS window.event.x, window.event.y
  • 按键码:e.which VS event.keyCode
  • 文本节点:el.textContent VS el.innerText

lili之间有看不见的空白间隔是什么原因引起的?有什么解决办法?

  • li排列受到中间空白(回车/空格)等的影响,因为空白也属于字符,会被应用样式占据空间,产生间隔
  • 解决办法:在ul设置设置font-size=0,在li上设置需要的文字大小

什么是外边距重叠?重叠的结果是什么?

  • 外边距重叠就是 margin-collapse
  • 相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的外边距可以结合成一个单独的外边距。 这种合并外边距的方式被称为折叠,结合而成的外边距称为折叠外边距
  • 折叠结果遵循下列计算规则:
    • 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值
    • 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值
    • 两个外边距一正一负时,折叠结果是两者的相加的和

请写出多种等高布局

  • 在列的父元素上使用这个背景图进行Y轴的铺放,从而实现一种等高列的假像
  • 模仿表格布局等高列效果:兼容性不好,在ie6-7无法正常运行
  • css3 flexbox 布局: .container{display: flex; align-items: stretch;}

css垂直居中的方法有哪些?

  • 如果是单行文本, line-height 设置成和 height 值

.vertical {

      height:100px;

      line-height:100px;

    }

  • 已知高度的块级子元素,采用绝对定位和负边距

.container {

  position:relative;

}

.vertical {

  height:300px;  /*子元素高度*/

  position:absolute;

  top:50%;  /*父元素高度50%*/

  margin-top:-150px; /*自身高度一半*/

}

  • 未知高度的块级父子元素居中,模拟表格布局
  • 缺点:IE67不兼容,父级 overflow:hidden 失效

.container {

      display:table;

    }

    .content {

      display:table-cell;

     vertical-align: middle;

    }

 

  • 新增 inline-block 兄弟元素,设置 vertical-align
    • 缺点:需要增加额外标签,IE67不兼容

 

.container {

  height: 100%;/*定义父级高度,作为参考*/

}

.extra .vertical{

  display:inline-block;  /*行内块显示*/

  vertical-align:middle; /*垂直居中*/

}

.extra {

  height: 100%; /*设置新增元素高度为100%*/

}

  • 绝对定位配合 CSS3 位移

.vertical {

  position:absolute;

  top:50%;  /*父元素高度50%*/

 transform:translateY(-50%, -50%);

}

  • CSS3弹性盒模型

.container {

  display:flex;

  justify-content:center; /*子元素水平居中*/

  align-items:center; /*子元素垂直居中*/

}

圣杯布局的实现原理?

  • 要求:三列布局;中间主体内容前置,且宽度自适应;两边内容定宽
    • 好处:重要的内容放在文档流前面可以优先渲染
    • 原理:利用相对定位、浮动、负边距布局,而不添加额外标签

  .container {

      padding-left: 150px;

      padding-right: 190px;

  }

  .main {

      float: left;

      width: 100%;

  }

  .left {

      float: left;

      width: 190px;

      margin-left: -100%;

      position: relative;

      left: -150px;

  }

  .right {

      float: left;

      width: 190px;

      margin-left: -190px;

      position: relative;

      right: -190px;

  }

什么是双飞翼布局?实现原理?

  • 双飞翼布局:对圣杯布局(使用相对定位,对以后布局有局限性)的改进,消除相对定位布局
  • 原理:主体元素上设置左右边距,预留两翼位置。左右两栏使用浮动和负边距归位,消除相对定位。

.container {

    /*padding-left:150px;*/

    /*padding-right:190px;*/

}

.main-wrap {

    width: 100%;

    float: left;

}

.main {

    margin-left: 150px;

    margin-right: 190px;

}

.left {

    float: left;

    width: 150px;

    margin-left: -100%;

    /*position: relative;*/

    /*left:-150px;*/

}

.right {

    float: left;

    width: 190px;

    margin-left: -190px;

    /*position:relative;*/

    /*right:-190px;*/

}

CSS样式中常使用 pxem 在表现上有什么区别?

  • px 相对于显示器屏幕分辨率,无法用浏览器字体放大功能
  • em 值并不是固定的,会继承父级的字体大小: em = 像素值 / 父级font-size

为什么要初始化CSS样式?

  • 不同浏览器对有些标签样式的默认值解析不同
  • 不初始化CSS会造成各现浏览器之间的页面显示差异
  • 可以使用 reset.css 或 Normalize.css 做 CSS 初始化

解释下什么是浮动和它的工作原理?

  • 非IE浏览器下,容器不设高度且子元素浮动时,容器高度不能被内容撑开。 此时,内容会溢出到容器外面而影响布局。这种现象被称为浮动(溢出)。
  • 工作原理:
    • 浮动元素脱离文档流,不占据空间(引起“高度塌陷”现象)
    • 浮动元素碰到包含它的边框或者其他浮动元素的边框停留

浮动元素引起的问题?

  • 父元素的高度无法被撑开,影响与父元素同级的元素
  • 与浮动元素同级的非浮动元素会跟随其后

列举几种清除浮动的方式?

  • 添加额外标签,例如 <div style="clear:both"></div>
  • 使用 br 标签和其自身的 clear 属性,例如 <br clear="all" />
  • 父元素设置 overflow:hidden; 在IE6中还需要触发 hasLayout,例如zoom:1;
  • 父元素也设置浮动
  • 使用 :after 伪元素。由于IE6-7不支持 :after,使用 zoom:1 触发 hasLayout

清除浮动最佳实践(after伪元素闭合浮动):

.clearfix:after{

    content:"\200B";

    display: table;

    height: 0;

    clear: both;

  }

  .clearfix{

    *zoom: 1;

  }

什么是 FOUC(Flash of Unstyled Content)如何来避免 FOUC

  • 当使用 @import 导入 CSS 时,会导致某些页面在 IE 出现奇怪的现象: 没有样式的页面内容显示瞬间闪烁,这种现象称为“文档样式短暂失效”,简称为FOUC
  • 产生原因:当样式表晚于结构性html加载时,加载到此样式表时,页面将停止之前的渲染。
  • 等待此样式表被下载和解析后,再重新渲染页面,期间导致短暂的花屏现象。
  • 解决方法:使用 link 标签将样式表放在文档 head

介绍使用过的 CSS 预处理器?

  • CSS 预处理器基本思想:为 CSS 增加了一些编程的特性(变量、逻辑判断、函数等)
  • 开发者使用这种语言进行进行 Web 页面样式设计,再编译成正常的 CSS 文件使用
  • 使用 CSS 预处理器,可以使 CSS 更加简洁、适应性更强、可读性更佳,无需考虑兼容性
  • 最常用的 CSS 预处理器语言包括:Sass(SCSS)和 LESS

CSS优化、提高性能的方法有哪些?

  • 多个css合并,尽量减少HTTP请求
  • 将css文件放在页面最上面
  • 移除空的css规则
  • 避免使用CSS表达式
  • 选择器优化嵌套,尽量避免层级过深
  • 充分利用css继承属性,减少代码量
  • 抽象提取公共样式,减少代码量
  • 属性值为0时,不加单位
  • 属性值为小于1的小数时,省略小数点前面的0
  • css雪碧图

浏览器是怎样解析CSS选择器的?

  • 浏览器解析 CSS 选择器的方式是从右到左

在网页中的应该使用奇数还是偶数的字体?

  • 在网页中的应该使用“偶数”字体:
    • 偶数字号相对更容易和 web 设计的其他部分构成比例关系
    • 使用奇数号字体时文本段落无法对齐
    • 宋体的中文网页排布中使用最多的就是 12 和 14

marginpadding分别适合什么场景使用?

  • 需要在border外侧添加空白,且空白处不需要背景(色)时,使用 margin
  • 需要在border内测添加空白,且空白处需要背景(色)时,使用 padding

抽离样式模块怎么写,说出思路?

  • CSS可以拆分成2部分:公共CSS 和 业务CSS:
    • 网站的配色,字体,交互提取出为公共CSS。这部分CSS命名不应涉及具体的业务
    • 对于业务CSS,需要有统一的命名,使用公用的前缀。可以参考面向对象的CSS

元素竖向的百分比设定是相对于容器的高度吗?

  • 元素竖向的百分比设定是相对于容器的宽度,而不是高度

全屏滚动的原理是什么?用到了CSS的那些属性?

  • 原理类似图片轮播原理,超出隐藏部分,滚动时显示
  • 可能用到的CSS属性:overflow:hidden; transform:translate(100%, 100%); display:none;

什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE

  • 响应式设计就是网站能够兼容多个终端,而不是为每个终端做一个特定的版本
  • 基本原理是利用CSS3媒体查询,为不同尺寸的设备适配不同样式
  • 对于低版本的IE,可采用JS获取屏幕宽度,然后通过resize方法来实现兼容:

$(window).resize(function () {

  screenRespond();

});

screenRespond();

functionscreenRespond(){

var screenWidth =$(window).width();

if(screenWidth <=1800){

  $("body").attr("class", "w1800");

}

if(screenWidth <=1400){

  $("body").attr("class", "w1400");

}

if(screenWidth >1800){

  $("body").attr("class", "");

}

}

什么是视差滚动效果,如何给每页做不同的动画?

  • 视差滚动是指多层背景以不同的速度移动,形成立体的运动效果,具有非常出色的视觉体验
  • 一般把网页解剖为:背景层、内容层和悬浮层。当滚动鼠标滚轮时,各图层以不同速度移动,形成视差的
  • 实现原理
    • 以 “页面滚动条” 作为 “视差动画进度条”
    • 以 “滚轮刻度” 当作 “动画帧度” 去播放动画的
    • 监听 mousewheel 事件,事件被触发即播放动画,实现“翻页”效果

a标签上四个伪类的执行顺序是怎么样的?

link > visited >hover > active

  • L-V-H-A love hate 用喜欢和讨厌两个词来方便记忆

伪元素和伪类的区别和作用?

  • 伪元素 -- 在内容元素的前后插入额外的元素或样式,但是这些元素实际上并不在文档中生成。
  • 它们只在外部显示可见,但不会在文档的源代码中找到它们,因此,称为“伪”元素。例如:

p::before {content:"第一章:";}

p::after {content:"Hot!";}

p::first-line {background:red;}

p::first-letter {font-size:30px;}

 

  • 伪类 -- 将特殊的效果添加到特定选择器上。它是已有元素上添加类别的,不会产生新的元素。例如:

a:hover {color: #FF00FF}

p:first-child {color: red}

::before :after 中双冒号和单冒号有什么区别?

  • 在 CSS 中伪类一直用 : 表示,如 :hover, :active 等
  • 伪元素在CSS1中已存在,当时语法是用 : 表示,如 :before 和 :after
  • 后来在CSS3中修订,伪元素用 :: 表示,如 ::before 和 ::after,以此区分伪元素和伪类
  • 由于低版本IE对双冒号不兼容,开发者为了兼容性各浏览器,继续使使用 :after 这种老语法表示伪元素
  • 综上所述:::before 是 CSS3 中写伪元素的新语法; :after 是 CSS1 中存在的、兼容IE的老语法

如何修改Chrome记住密码后自动填充表单的黄色背景?

  • 产生原因:由于Chrome默认会给自动填充的input表单加上 input:-webkit-autofill 私有属性造成的
  • 解决方案1:在form标签上直接关闭了表单的自动填充:autocomplete="off"
  • 解决方案2:input:-webkit-autofill { background-color: transparent; }

input [type=search] 搜索框右侧小图标如何美化?

input[type="search"]::-webkit-search-cancel-button{

  -webkit-appearance: none;

  height: 15px;

  width: 15px;

  border-radius: 8px;

  background:url("images/searchicon.png") no-repeat00;

  background-size: 15px15px;

}

网站图片文件,如何点击下载?而非点击预览?

<ahref="logo.jpg" download>下载</a><a href="logo.jpg"download="网站LOGO" >下载</a>

iOS safari 如何阻止橡皮筋效果

  $(document).ready(function(){

      varstopScrolling=function(event) {

          event.preventDefault();

      }

      document.addEventListener('touchstart', stopScrolling, false);

      document.addEventListener('touchmove', stopScrolling, false);

  });

你对 line-height 是如何理解的?

  • line-height 指一行字的高度,包含了字间距,实际上是下一行基线到上一行基线距离
  • 如果一个标签没有定义 height 属性,那么其最终表现的高度是由 line-height 决定的
  • 一个容器没有设置高度,那么撑开容器高度的是 line-height 而不是容器内的文字内容
  • 把 line-height 值设置为 height 一样大小的值可以实现单行文字的垂直居中
  • line-height 和 height 都能撑开一个高度,height 会触发 haslayout,而 line-height 不会

line-height 三种赋值方式有何区别?(带单位、纯数字、百分比)

  • 带单位:px 是固定值,而 em 会参考父元素 font-size 值计算自身的行高
  • 纯数字:会把比例传递给后代。例如,父级行高为 1.5,子元素字体为 18px,则子元素行高为 1.5 * 18 = 27px
  • 百分比:将计算后的值传递给后代

设置元素浮动后,该元素的 display 值会如何变化?

  • 设置元素浮动后,该元素的 display 值自动变成 block

怎么让Chrome支持小于12px 的文字?

  .shrink{

    -webkit-transform:scale(0.8);

    -o-transform:scale(1);

    display:inline-block;

  }

让页面里的字体变清晰,变细用CSS怎么做?(IOS手机浏览器字体齿轮设置)

 -webkit-font-smoothing: antialiased;

font-style 属性 oblique 是什么意思?

  • font-style: oblique; 使没有 italic 属性的文字实现倾斜

如果需要手动写动画,你认为最小时间间隔是多久?

  • 16.7ms 多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔: 1s / 60 * 1000 = 16.7ms

display:inline-block 什么时候会显示间隙?

  • 相邻的 inline-block 元素之间有换行或空格分隔的情况下会产生间距
  • 非 inline-block 水平元素设置为 inline-block 也会有水平间距
  • 可以借助 vertical-align:top; 消除垂直间隙
  • 可以在父级加 font-size:0; 在子元素里设置需要的字体大小,消除垂直间隙
  • 把 li 标签写到同一行可以消除垂直间隙,但代码可读性差

overflow: scroll 时不能平滑滚动的问题怎么处理?

  • 监听滚轮事件,然后滚动到一定距离时用 jquery 的 animate 实现平滑效果。

一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度

  • 方案1: .sub { height: calc(100%-100px); }
  • 方案2: .container { position:relative; } .sub { position: absolute; top: 100px; bottom: 0; }
  • 方案3: .container { display:flex; flex-direction:column; } .sub { flex:1; }

JavaScript


JavaScript的组成

  • JavaScript 由以下三部分组成:
    • ECMAScript(核心):JavaScript 语言基础
    • DOM(文档对象模型):规定了访问HTML和XML的接口
    • BOM(浏览器对象模型):提供了浏览器窗口之间进行交互的对象和方法

JS的基本数据类型和引用数据类型

  • 基本数据类型:undefined、null、boolean、number、string、symbol
  • 引用数据类型:object、array、function

检测浏览器版本版本有哪些方式?

  • 根据 navigator.userAgent // UA.toLowerCase().indexOf('chrome')
  • 根据 window 对象的成员 // 'ActiveXObject' in window

介绍JS有哪些内置对象?

  • 数据封装类对象:Object、Array、Boolean、Number、String
  • 其他对象:Function、Arguments、Math、Date、RegExp、Error
  • ES6新增对象:Symbol、Map、Set、Promises、Proxy、Reflect

说几条写JavaScript的基本规范?

  • 代码缩进,建议使用“四个空格”缩进
  • 代码段使用花括号{}包裹
  • 语句结束使用分号;
  • 变量和函数在使用前进行声明
  • 以大写字母开头命名构造函数,全大写命名常量
  • 规范定义JSON对象,补全双引号
  • 用{}和[]声明对象和数组

如何编写高性能的JavaScript

  • 遵循严格模式:"use strict";
  • 将js脚本放在页面底部,加快渲染页面
  • 将js脚本将脚本成组打包,减少请求
  • 使用非阻塞方式下载js脚本
  • 尽量使用局部变量来保存全局变量
  • 尽量减少使用闭包
  • 使用 window 对象属性方法时,省略 window
  • 尽量减少对象成员嵌套
  • 缓存 DOM 节点的访问
  • 通过避免使用 eval() 和 Function() 构造器
  • 给 setTimeout() 和 setInterval() 传递函数而不是字符串作为参数
  • 尽量使用直接量创建对象和数组
  • 最小化重绘(repaint)和回流(reflow)

描述浏览器的渲染过程,DOM树和渲染树的区别?

  • 浏览器的渲染过程:
    • 解析HTML构建 DOM(DOM树),并行请求 css/image/js
    • CSS 文件下载完成,开始构建 CSSOM(CSS树)
    • CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)
    • 布局(Layout):计算出每个节点在屏幕中的位置
    • 显示(Painting):通过显卡把页面画到屏幕上
  • DOM树 和 渲染树 的区别:
    • DOM树与HTML标签一一对应,包括head和隐藏元素
    • 渲染树不包括head和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的css属性

重绘和回流(重排)的区别和关系?

  • 重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘
  • 回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流
  • 注意:JS获取Layout属性值(如:offsetLeft、scrollTop、getComputedStyle等)也会引起回流。因为浏览器需要通过回流计算最新值
  • 回流必将引起重绘,而重绘不一定会引起回流

如何最小化重绘(repaint)和回流(reflow)

  • 需要要对元素进行复杂的操作时,可以先隐藏(display:"none"),操作完成后再显示
  • 需要创建多个DOM节点时,使用DocumentFragment创建完后一次性的加入document
  • 缓存Layout属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流
  • 尽量避免用table布局(table元素一旦触发回流就会导致table里所有的其它元素回流)
  • 避免使用css表达式(expression),因为每次调用都会重新计算值(包括加载页面)
  • 尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color
  • 批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx

script 的位置是否会影响首屏显示时间?

  • 在解析 HTML 生成 DOM 过程中,js 文件的下载是并行的,不需要 DOM 处理到 script 节点。因此,script的位置不影响首屏显示的开始时间。
  • 浏览器解析 HTML 是自上而下的线性过程,script作为 HTML 的一部分同样遵循这个原则
  • 因此,script 会延迟 DomContentLoad,只显示其上部分首屏内容,从而影响首屏显示的完成时间

解释JavaScript中的作用域与变量声明提升?

  • JavaScript作用域:
    • 在Java、C等语言中,作用域为for语句、if语句或{}内的一块区域,称为作用域;
    • 而在 JavaScript 中,作用域为function(){}内的区域,称为函数作用域。
  • JavaScript变量声明提升:
    • 在JavaScript中,函数声明与变量声明经常被JavaScript引擎隐式地提升到当前作用域的顶部。
    • 声明语句中的赋值部分并不会被提升,只有名称被提升
    • 函数声明的优先级高于变量,如果变量名跟函数名相同且未赋值,则函数声明会覆盖变量声明
    • 如果函数有多个同名参数,那么最后一个参数(即使没有定义)会覆盖前面的同名参数

介绍JavaScript的原型,原型链?有什么特点?

  • 原型:
    • JavaScript的所有对象中都包含了一个 [proto] 内部属性,这个属性所对应的就是该对象的原型
    • JavaScript的函数对象,除了原型 [proto] 之外,还预置了 prototype 属性
    • 当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [proto]。
  • 原型链:
    • 当一个对象调用的属性/方法自身不存在时,就会去自己 [proto] 关联的前辈 prototype 对象上去找
    • 如果没找到,就会去该 prototype 原型 [proto] 关联的前辈 prototype 去找。依次类推,直到找到属性/方法或 undefined 为止。从而形成了所谓的“原型链”
  • 原型特点:
    • JavaScript对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这一改变

JavaScript有几种类型的值?,你能画一下他们的内存图吗

  • 原始数据类型(Undefined,Null,Boolean,Number、String)-- 栈
  • 引用数据类型(对象、数组和函数)-- 堆
  • 两种类型的区别是:存储位置不同:
  • 原始数据类型是直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据;
  • 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;
  • 引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。
  • 当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

JavaScript如何实现一个类,怎么实例化这个类?

  • 构造函数法(this + prototype) -- 用 new 关键字 生成实例对象
    • 缺点:用到了 this 和 prototype,编写复杂,可读性差

  functionMobile(name, price){

     this.name= name;

     this.price = price;

   }

   Mobile.prototype.sell=function(){

      alert(this.name+",售价 $"+this.price);

   }

   var iPhone7 =newMobile("iPhone7", 1000);

   iPhone7.sell();

  • Object.create 法 -- 用 Object.create() 生成实例对象
  • 缺点:不能实现私有属性和私有方法,实例对象之间也不能共享数据

 var Person = {

     firstname:"Mark",

     lastname:"Yun",

     age:25,

     introduce:function(){

         alert('I am '+ Person.firstname +' '+ Person.lastname);

     }

 };

 

 var person =Object.create(Person);

 person.introduce();

 

 // Object.create 要求 IE9+,低版本浏览器可以自行部署:

 if (!Object.create) {

   Object.create=function (o) {

functionF() {}

F.prototype= o;

returnnewF();

};

}

  • 极简主义法(消除 this 和 prototype) -- 调用 createNew() 得到实例对象
    • 优点:容易理解,结构清晰优雅,符合传统的"面向对象编程"的构造

 var Cat = {

   age:3, // 共享数据 -- 定义在类对象内,createNew()

   createNew:function () {

     var cat = {};

     // var cat = Animal.createNew(); // 继承 Animal

     cat.name="小咪";

     var sound ="喵喵喵"; // 私有属性--定义在 createNew() 内,输出对象外

     cat.makeSound=function () {

       alert(sound);  // 暴露私有属性

     };

     cat.changeAge=function(num){

       Cat.age = num; // 修改共享数据

     };

     return cat; // 输出对象

   }

 };

 

 var cat = Cat.createNew();

 cat.makeSound();

  • ES6 语法糖 class -- 用 new 关键字 生成实例对象

     classPoint {

       constructor(x, y) {

         this.x= x;

         this.y= y;

       }

       toString() {

         return'('+this.x+', '+this.y+')';

       }

     }

 

  var point =newPoint(2, 3);

Javascript如何实现继承?

  • 构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上

functionCat(name,color){

 Animal.apply(this, arguments);

 this.name= name;

 this.color= color;

}

  • 实例继承:将子对象的 prototype 指向父对象的一个实例

Cat.prototype=newAnimal();

Cat.prototype.constructor= Cat;

  • 拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象

    functionextend(Child, Parent) {

  var p = Parent.prototype;

  var c = Child.prototype;

  for (var i in p) {

     c[i] = p[i];

  }

  c.uber = p;

  }

  • 原型继承:将子对象的 prototype 指向父对象的 prototype

    functionextend(Child, Parent) {

        varF=function(){};

      F.prototype= Parent.prototype;

      Child.prototype=newF();

      Child.prototype.constructor= Child;

      Child.uber = Parent.prototype;

    }

  • ES6 语法糖 extends:class ColorPoint extends Point {}

    classColorPointextendsPoint {

       constructor(x, y, color) {

          super(x, y); // 调用父类的constructor(x, y)

          this.color= color;

       }

       toString() {

          returnthis.color+' '+super.toString(); // 调用父类的toString()

       }

    }

Javascript作用链域?

  • 全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节
  • 如果当前作用域没有找到属性或方法,会向上层作用域查找,直至全局函数,这种形式就是作用域链

谈谈this对象的理解

  • this 总是指向函数的直接调用者
  • 如果有 new 关键字,this 指向 new 出来的实例对象
  • 在事件中,this指向触发这个事件的对象
  • IE下 attachEvent 中的this总是指向全局对象Window

eval是做什么的?

eval的功能是把对应的字符串解析成JS代码并运行

  • 应该避免使用eval,不安全,非常耗性能(先解析成js语句,再执行)
  • 由JSON字符串转换为JSON对象的时候可以用 eval('('+ str +')');

什么是 Window 对象? 什么是 Document 对象?

  • Window 对象表示当前浏览器的窗口,是JavaScript的顶级对象。
  • 我们创建的所有对象、函数、变量都是 Window 对象的成员。
  • Window 对象的方法和属性是在全局范围内有效的。
  • Document 对象是 HTML 文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点)
  • Document 对象使我们可以通过脚本对 HTML 页面中的所有元素进行访问
  • Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问

介绍 DOM 的发展

  • DOM:文档对象模型(Document Object Model),定义了访问HTML和XML文档的标准,与编程语言及平台无关
  • DOM0:提供了查询和操作Web文档的内容API。未形成标准,实现混乱。如:document.forms['login']
  • DOM1:W3C提出标准化的DOM,简化了对文档中任意部分的访问和操作。如:JavaScript中的Document对象
  • DOM2:原来DOM基础上扩充了鼠标事件等细分模块,增加了对CSS的支持。如:getComputedStyle(elem, pseudo)
  • DOM3:增加了XPath模块和加载与保存(Load and Save)模块。如:XPathEvaluator

介绍DOM0DOM2DOM3事件处理方式区别

  • DOM0级事件处理方式:
    • btn.onclick = func;
    • btn.onclick = null;
  • DOM2级事件处理方式:
    • btn.addEventListener('click', func, false);
    • btn.removeEventListener('click', func, false);
    • btn.attachEvent("onclick", func);
    • btn.detachEvent("onclick", func);
  • DOM3级事件处理方式:
    • eventUtil.addListener(input, "textInput", func);
    • eventUtil 是自定义对象,textInput 是DOM3级事件

事件的三个阶段

  • 捕获、目标、冒泡

介绍事件捕获冒泡执行顺序和事件的执行次数?

  • 按照W3C标准的事件:首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段
  • 事件执行次数(DOM2-addEventListener):元素上绑定事件的个数
    • 注意1:前提是事件被确实触发
    • 注意2:事件绑定几次就算几个事件,即使类型和功能完全一样也不会“覆盖”
  • 事件执行顺序:判断的关键是否目标元素
    • 非目标元素:根据W3C的标准执行:捕获->目标元素->冒泡(不依据事件绑定顺序)
    • 目标元素:依据事件绑定顺序:先绑定的事件先执行(不依据捕获冒泡标准)
    • 最终顺序:父元素捕获->目标元素事件1->目标元素事件2->子元素捕获->子元素冒泡->父元素冒泡
    • 注意:子元素事件执行前提 事件确实“落”到子元素布局区域上,而不是简单的具有嵌套关系

在一个DOM上同时绑定两个点击事件:一个用捕获,一个用冒泡。事件会执行几次,先执行冒泡还是捕获?

  • 该DOM上的事件如果被触发,会执行两次(执行次数等于绑定次数)
  • 如果该DOM是目标元素,则按事件绑定顺序执行,不区分冒泡/捕获
  • 如果该DOM是处于事件流中的非目标元素,则先执行捕获,后执行冒泡

事件的代理/委托

  • 事件委托是指将事件绑定目标元素的到父元素上,利用冒泡机制触发该事件
    • 优点:
      • 可以减少事件注册,节省大量内存占用
      • 可以将事件应用于动态添加的子元素上
    • 缺点: 使用不当会造成事件在不应该触发时触发
    • 示例:

ulEl.addEventListener('click', function(e){

    var target =event.target || event.srcElement;

    if(!!target&& target.nodeName.toUpperCase() === "LI"){

       console.log(target.innerHTML);

    }

}, false);

IE与火狐的事件机制有什么区别?如何阻止冒泡?

  • IE只事件冒泡,不支持事件捕获;火狐同时支持件冒泡和事件捕获

IE的事件处理和W3C的事件处理有哪些区别?

  • 绑定事件
    • W3C: targetEl.addEventListener('click', handler, false);
    • IE: targetEl.attachEvent('onclick', handler);
  • 删除事件
    • W3C: targetEl.removeEventListener('click', handler, false);
    • IE: targetEl.detachEvent(event, handler);
  • 事件对象
    • W3C: var e = arguments.callee.caller.arguments[0]
    • IE: window.event
  • 事件目标
    • W3C: e.target
    • IE: window.event.srcElement
  • 阻止事件默认行为
    • W3C: e.preventDefault()
    • IE: window.event.returnValue = false
  • 阻止事件传播
    • W3C: e.stopPropagation()
    • IE: window.event.cancelBubble = true

W3C事件的 target currentTarget 的区别?

  • target 只会出现在事件流的目标阶段
  • currentTarget 可能出现在事件流的任何阶段
  • 当事件流处在目标阶段时,二者的指向相同
  • 当事件流处于捕获或冒泡阶段时:currentTarget 指向当前事件活动的对象(一般为父级)

如何派发事件(dispatchEvent)?(如何进行事件广播?)

  • W3C: 使用 dispatchEvent 方法
  • IE: 使用 fireEvent 方法

varfireEvent=function(element, event){

    if (document.createEventObject){

        var mockEvent =document.createEventObject();

        return element.fireEvent('on'+event, mockEvent)

    }else{

        var mockEvent =document.createEvent('HTMLEvents');

        mockEvent.initEvent(event, true, true);

        return!element.dispatchEvent(mockEvent);

    }

}

什么是函数节流?介绍一下应用场景和原理?

  • 函数节流(throttle)是指阻止一个函数在很短时间间隔内连续调用。 只有当上一次函数执行后达到规定的时间间隔,才能进行下一次调用。 但要保证一个累计最小调用间隔(否则拖拽类的节流都将无连续效果)
  • 函数节流用于 onresize, onscroll 等短时间内会多次触发的事件
  • 函数节流的原理:使用定时器做时间节流。 当触发一个事件时,先用 setTimout 让这个事件延迟一小段时间再执行。 如果在这个时间间隔内又触发了事件,就 clearTimeout 原来的定时器, 再 setTimeout 一个新的定时器重复以上流程。
  • 函数节流简单实现:

functionthrottle(method, context) {

     clearTimeout(methor.tId);

     method.tId =setTimeout(function(){

         method.call(context);

     }100); // 两次调用至少间隔 100ms

}

// 调用

window.onresize=function(){

    throttle(myFunc, window);

}

区分什么是客户区坐标页面坐标屏幕坐标

  • 客户区坐标:鼠标指针在可视区中的水平坐标(clientX)和垂直坐标(clientY)
  • 页面坐标:鼠标指针在页面布局中的水平坐标(pageX)和垂直坐标(pageY)
  • 屏幕坐标:设备物理屏幕的水平坐标(screenX)和垂直坐标(screenY)

如何获得一个DOM元素的绝对位置?

  • elem.offsetLeft:返回元素相对于其定位父级左侧的距离
  • elem.offsetTop:返回元素相对于其定位父级顶部的距离
  • elem.getBoundingClientRect():返回一个DOMRect对象,包含一组描述边框的只读属性,单位像素

分析 ['1', '2', '3'].map(parseInt) 答案是多少?

  • 答案:[1, NaN, NaN]
  • parseInt(string, radix) 第2个参数 radix 表示进制。省略 radix 或 radix = 0,则数字将以十进制解析
  • map 每次为 parseInt 传3个参数(elem, index, array),其中 index 为数组索引
  • 因此,map 遍历 ["1", "2", "3"],相应 parseInt 接收参数如下

parseInt('1', 0); // 1

parseInt('2', 1); // NaN

parseInt('3', 2); // NaN

  • 所以,parseInt 参数 radix 不合法,导致返回值为 NaN

new 操作符具体干了什么?

  • 创建实例对象,this 变量引用该对象,同时还继承了构造函数的原型
  • 属性和方法被加入到 this 引用的对象中
  • 新创建的对象由 this 所引用,并且最后隐式的返回 this

用原生JavaScript的实现过什么功能吗?

  • 封装选择器、调用第三方API、设置和获取样式

解释一下这段代码的意思吗?

  [].forEach.call($$("*"), function(el){

      el.style.outline ="1px solid #"+ (~~(Math.random()*(1<<24))).toString(16);

  })

  • 解释:获取页面所有的元素,遍历这些元素,为它们添加1像素随机颜色的轮廓(outline)
  •  
    1. $$(sel) // $$函数被许多现代浏览器命令行支持,等价于 document.querySelectorAll(sel)
    1. [].forEach.call(NodeLists) // 使用 call 函数将数组遍历函数 forEach 应到节点元素列表
    1. el.style.outline = "1px solid #333" // 样式 outline 位于盒模型之外,不影响元素布局位置
    1. (1<<24) // parseInt("ffffff", 16) == 16777215 == 2^24 - 1 // 1<<24 == 2^24 == 16777216
    1. Math.random()*(1<<24) // 表示一个位于 0 到 16777216 之间的随机浮点数
    1. ~~Math.random()*(1<<24) // ~~ 作用相当于 parseInt 取整
    1. (~~(Math.random()*(1<<24))).toString(16) // 转换为一个十六进制-

** JavaScript实现异步编程的方法?**

  • 回调函数
  • 事件监听
  • 发布/订阅
  • Promises对象
  • Async函数[ES7]

web开发中会话跟踪的方法有哪些

  • cookie
  • session
  • url重写
  • 隐藏input
  • ip地址

介绍js的基本数据类型

  • Undefined、Null、Boolean、Number、String

介绍js有哪些内置对象?

  • Object 是 JavaScript 中所有对象的父对象
  • 数据封装类对象:Object、Array、Boolean、Number 和 String
  • 其他对象:Function、Arguments、Math、Date、RegExp、Error

说几条写JavaScript的基本规范?

  • 不要在同一行声明多个变量
  • 请使用 ===/!==来比较true/false或者数值
  • 使用对象字面量替代new Array这种形式
  • 不要使用全局函数
  • Switch语句必须带有default分支
  • 函数不应该有时候有返回值,有时候没有返回值
  • If语句必须使用大括号
  • for-in循环中的变量 应该使用var关键字明确限定作用域,从而避免作用域污

JavaScript原型,原型链 ? 有什么特点?

  • 每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时
  • 如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念
  • 关系:instance.constructor.prototype = instance.__proto__
  • 特点:
    • JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。
  • 当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的
  • 就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象

JavaScript有几种类型的值?,你能画一下他们的内存图吗?

  • 栈:原始数据类型(Undefined,Null,Boolean,Number、String)
  • 堆:引用数据类型(对象、数组和函数)
  • 两种类型的区别是:存储位置不同;
  • 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
  • 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其
  • 在栈中的地址,取得地址后从堆中获得实体

Javascript如何实现继承?

  • 构造继承
  • 原型继承
  • 实例继承
  • 拷贝继承
  • 原型prototype机制或apply和call方法去实现较简单,建议使用构造函数与原型混合方式

 function Parent(){

        this.name ='wang';

    }

 

    functionChild(){

        this.age =28;

    }

    Child.prototype= new Parent();//继承了Parent,通过原型

 

    var demo = newChild();

   alert(demo.age);

   alert(demo.name);//得到被继承的属性

  }

javascript创建对象的几种方式?

javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON;但写法有很多种,也能混合使用

  • 对象字面量的方式

person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};

  • 用function来模拟无参的构造函数

 functionPerson(){}

    var person=newPerson();//定义一个function,如果使用new"实例化",function可以看作是一个Class

       person.name="Mark";

       person.age="25";

        person.work=function(){

       alert(person.name+" hello...");

    }

person.work();

  • 用function来模拟参构造函数来实现(用this关键字定义构造的上下文属性)

function Pet(name,age,hobby){

      this.name=name;//this作用域:当前对象

      this.age=age;

      this.hobby=hobby;

       this.eat=function(){

         alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员");

       }

    }

    var maidou =newPet("麦兜",25,"coding");//实例化、创建对象

    maidou.eat();//调用eat方法

  • 用工厂方式来创建(内置对象)

var wcDog =new Object();

    wcDog.name="旺财";

     wcDog.age=3;

    wcDog.work=function(){

       alert("我是"+wcDog.name+",汪汪汪......");

     }

     wcDog.work();

  • 用原型方式来创建

function Dog(){

 

     }

    Dog.prototype.name="旺财";

    Dog.prototype.eat=function(){

    alert(this.name+"是个吃货");

     }

     var wangcai=new Dog();

     wangcai.eat();

 

  • 用混合方式来创建

 functionCar(name,price){

     this.name=name;

     this.price=price;

    }

    Car.prototype.sell=function(){

       alert("我是"+this.name+",我现在卖"+this.price+"万元");

      }

    var camry =newCar("凯美瑞",27);

    camry.sell();

Javascript作用链域?

  • 全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节
  • 当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找
  • 直至全局函数,这种组织形式就是作用域链

谈谈This对象的理解

  • this总是指向函数的直接调用者(而非间接调用者)
  • 如果有new关键字,this指向new出来的那个对象
  • 在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window

eval是做什么的?

  • 它的功能是把对应的字符串解析成JS代码并运行
  • 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)
  • 由JSON字符串转换为JSON对象的时候可以用eval,var obj =eval('('+ str +')')

nullundefined 的区别?

  • undefined 表示不存在这个值。
  • undefined :是一个表示"无"的原始值或者说表示"缺少值",就是此处应该有一个值,但是还没有定义。当尝试读取时会返回 undefined
  • 例如变量被声明了,但没有赋值时,就等于undefined
  • null 表示一个对象被定义了,值为“空值”
  • null : 是一个对象(空对象, 没有任何属性和方法)
  • 例如作为函数的参数,表示该函数的参数不是对象;
  • 在验证null时,一定要使用 === ,因为 == 无法分别 null 和 undefined

写一个通用的事件侦听器函数

 // event(事件)工具集,来源:github.com/markyun

    markyun.Event ={

        // 页面加载完成后

        readyEvent: function(fn) {

            if(fn==null) {

               fn=document;

            }

            varoldonload = window.onload;

            if(typeof window.onload != 'function') {

               window.onload = fn;

            } else {

               window.onload = function() {

                   oldonload();

                   fn();

                };

            }

        },

        // 视能力分别使用dom0||dom2||IE方式来绑定事件

        // 参数:操作的元素,事件名称 ,事件处理程序

        addEvent :function(element, type, handler) {

            if(element.addEventListener) {

                //事件类型、需要执行的函数、是否捕捉

               element.addEventListener(type, handler, false);

            } elseif (element.attachEvent) {

               element.attachEvent('on' + type, function() {

                   handler.call(element);

                });

            } else{

               element['on' + type] = handler;

            }

        },

        // 移除事件

        removeEvent: function(element, type, handler) {

            if(element.removeEventListener) {

               element.removeEventListener(type, handler, false);

            } elseif (element.datachEvent) {

               element.detachEvent('on' + type, handler);

            } else{

                element['on' + type] = null;

            }

        },

        // 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)

       stopPropagation : function(ev) {

            if(ev.stopPropagation) {

               ev.stopPropagation();

            } else{

                ev.cancelBubble= true;

            }

        },

        // 取消事件的默认行为

       preventDefault : function(event) {

            if(event.preventDefault) {

               event.preventDefault();

            } else{

               event.returnValue = false;

            }

        },

        // 获取事件目标

        getTarget :function(event) {

            returnevent.target || event.srcElement;

        },

        // 获取event对象的引用,取到事件的所有信息,确保随时能使用event

        getEvent :function(e) {

            var ev= e || window.event;

            if(!ev) {

                varc = this.getEvent.caller;

               while (c) {

                   ev = c.arguments[0];

                   if (ev && Event == ev.constructor) {

                       break;

                   }

                   c = c.caller;

                }

            }

            returnev;

        }

    };

["1", "2","3"].map(parseInt) 答案是多少?

  • [1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix),其中 radix 表示解析时用的基数。
  • map 传了 3 个 (element, index, array),对应的 radix 不合法导致解析失败。

事件是?IE与火狐的事件机制有什么区别?如何阻止冒泡?

  • 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为
  • 事件处理机制:IE是事件冒泡、Firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件
  • ev.stopPropagation();(旧ie的方法 ev.cancelBubble = true;)

什么是闭包(closure),为什么要用它?

  • 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域
  • 闭包的特性:
    • 函数内再嵌套函数
    • 内部函数可以引用外层的参数和变量
    • 参数和变量不会被垃圾回收机制回收

javascript 代码中的"usestrict";是什么意思 ? 使用它区别是什么?

  • use strict是一种ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为

如何判断一个对象是否属于某个类?

// 使用instanceof (待完善)

   if(a instanceofPerson){

      alert('yes');

   }

new操作符具体干了什么呢?

  • 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型
  • 属性和方法被加入到 this 引用的对象中
  • 新创建的对象由 this 所引用,并且最后隐式的返回 this

var obj  = {};

obj.__proto__ = Base.prototype;

Base.call(obj);

js延迟加载的方式有哪些?

  • defer和async、动态创建DOM方式(用得最多)、按需异步载入js

Ajax 是什么? 如何创建一个Ajax

ajax的全称:Asynchronous Javascript And XML

  • 异步传输+js+xml
  • 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验
  • 创建XMLHttpRequest对象,也就是创建一个异步调用对象
  • 建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息
  • 设置响应HTTP请求状态变化的函数
  • 发送HTTP请求
  • 获取异步调用返回的数据
  • 用JavaScript和DOM实现局部刷新

同步和异步的区别?

  • 同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作
  • 异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容

异步加载JS的方式有哪些?

  • defer,只支持IE
  • async:
  • 创建script,插入到DOM中,加载完毕后callBack

documen.write innerHTML的区别

  • document.write只能重绘整个页面
  • innerHTML可以重绘页面的一部分

DOM操作——怎样添加、移除、移动、复制、创建和查找节点?

  • (1)创建新节点
    • createDocumentFragment() //创建一个DOM片段
    • createElement() //创建一个具体的元素
    • createTextNode() //创建一个文本节点
  • (2)添加、移除、替换、插入
    • appendChild()
    • removeChild()
    • replaceChild()
    • insertBefore() //在已有的子节点前插入一个新的子节点
  • (3)查找
    • getElementsByTagName() //通过标签名称
    • getElementsByName() // 通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)
    • getElementById() //通过元素Id,唯一性

那些操作会造成内存泄漏?

  • 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在
  • 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收
  • setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏
  • 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

渐进增强和优雅降级

  • 渐进增强 :针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
  • 优雅降级 :一开始就构建完整的功能,然后再针对低版本浏览器进行兼容

Javascript垃圾回收方法

  • 标记清除(mark and sweep)
  • 这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”
  • 垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了

引用计数(reference counting)

在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间

js继承方式及其优缺点

  • 原型链继承的缺点
    • 一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。
  • 借用构造函数(类式继承)
    • 借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。所以我们需要原型链+借用构造函数的模式,这种模式称为组合继承
  • 组合式继承
    • 组合式继承是比较常用的一种继承方法,其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。

deferasync

  • defer并行加载js文件,会按照页面上script标签的顺序执行async并行加载js文件,下载完成立即执行,不会按照页面上script标签的顺序执行

用过哪些设计模式?

  • 工厂模式:
    • 主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位置防止代码重复
    • 工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法 搞清楚他们到底是哪个对象的实例

function createObject(name,age,profession){//集中实例化的函数var obj = new Object();

    obj.name =name;

    obj.age = age;

    obj.profession= profession;

    obj.move =function () {

        returnthis.name + ' at ' + this.age + ' engaged in ' + this.profession;

    };

    return obj;

}

var test1 = createObject('trigkit4',22,'programmer');//第一个实例var test2 = createObject('mike',25,'engineer');//第二个实例

 

  • 构造函数模式
    • 使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于
  • 构造函数方法没有显示的创建对象 (new Object());
  • 直接将属性和方法赋值给 this 对象;
  • 没有 renturn 语句

说说你对闭包的理解

  • 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念
  • 闭包有三个特性:
    • 1.函数嵌套函数
    • 2.函数内部可以引用外部的参数和变量
    • 3.参数和变量不会被垃圾回收机制回收

请解释一下 JavaScript 的同源策略

  • 概念:同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议
  • 指一段脚本只能读取来自同一来源的窗口和文档的属性

为什么要有同源限制?

  • 我们举例说明:比如一个黑客程序,他利用Iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
  • 缺点
    • 现在网站的JS都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括NumberStringObjectArrayBoolean)进行值复制

Object.prototype.clone = function(){

 

            var o =this.constructor === Array ? [] : {};

 

            for(vare in this){

 

                   o[e] = typeof this[e] === "object" ? this[e].clone() :this[e];

 

            }

 

            returno;

    }

   

说说严格模式的限制

  • 严格模式主要有以下限制:
  • 变量必须声明后再使用
  • 函数的参数不能有同名属性,否则报错
  • 不能使用with语句
  • 不能对只读属性赋值,否则报错
  • 不能使用前缀0表示八进制数,否则报错
  • 不能删除不可删除的属性,否则报错
  • 不能删除变量delete prop,会报错,只能删除属性delete global[prop]
  • eval不会在它的外层作用域引入变量
  • eval和arguments不能被重新赋值
  • arguments不会自动反映函数参数的变化
  • 不能使用arguments.callee
  • 不能使用arguments.caller
  • 禁止this指向全局对象
  • 不能使用fn.caller和fn.arguments获取函数调用的堆栈
  • 增加了保留字(比如protected、static和interface)

如何删除一个cookie

  • 将时间设为当前时间往前一点

var date = new Date();

 

date.setDate(date.getDate() - 1);//真正的删除

setDate()方法用于设置一个月的某一天

  • expires的设置

  document.cookie ='user='+ encodeURIComponent('name')  +';expires = ' + new Date(0)

编写一个方法求一个字符串的字节长度

  • 假设:一个英文字符占用一个字节,一个中文字符占用两个字节

function GetBytes(str){

 

        var len =str.length;

 

        var bytes =len;

 

        for(vari=0; i<len; i++){

 

            if(str.charCodeAt(i) > 255) bytes++;

 

        }

 

        returnbytes;

 

    }

 

alert(GetBytes("你好,as"));

 

请解释什么是事件代理

  • 事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能

attributeproperty的区别是什么?

  • attribute是dom元素在文档中作为html标签拥有的属性;
  • property就是dom元素在js中作为对象拥有的属性。
  • 对于html的标准属性来说,attribute和property是同步的,是会自动更新的
  • 但是对于自定义的属性来说,他们是不同步的

页面编码和被请求的资源编码如果不一致如何处理?

  • 后端响应头设置 charset
  • 前端页面<meta>设置 charset

<script>放在</body>之前和之后有什么区别?浏览器会如何解析它们?

  • 按照HTML标准,在</body>结束后出现<script>或任何元素的开始标签,都是解析错误
  • 虽然不符合HTML标准,但浏览器会自动容错,使实际效果与写在</body>之前没有区别
  • 浏览器的容错机制会忽略<script>之前的</body>,视作<script>仍在 body 体内。省略</body>和</html>闭合标签符合HTML标准,服务器可以利用这一标准尽可能少输出内容

延迟加载JS的方式有哪些?

  • 设置<script>属性 defer="defer" (脚本将在页面完成解析时执行)
  • 动态创建 script DOM:document.createElement('script');
  • XmlHttpRequest 脚本注入
  • 延迟加载工具 LazyLoad

异步加载JS的方式有哪些?

  • 设置<script>属性 async="async" (一旦脚本可用,则会异步执行)
  • 动态创建 script DOM:document.createElement('script');
  • XmlHttpRequest 脚本注入
  • 异步加载库 LABjs
  • 模块加载器 Sea.js

JavaScript 中,调用函数有哪几种方式?

  • 方法调用模式 Foo.foo(arg1, arg2);
  • 函数调用模式 foo(arg1, arg2);
  • 构造器调用模式 (new Foo())(arg1, arg2);
  • call/applay调用模式 Foo.foo.call(that, arg1, arg2);
  • bind调用模式 Foo.foo.bind(that)(arg1, arg2)();

简单实现 Function.bind 函数?

  if (!Function.prototype.bind) {

    Function.prototype.bind=function(that) {

      var func =this, args =arguments;

      returnfunction() {

        return func.apply(that, Array.prototype.slice.call(args, 1));

      }

    }

  }

  // 只支持 bind 阶段的默认参数:

  func.bind(that, arg1, arg2)();

 

  // 不支持以下调用阶段传入的参数:

  func.bind(that)(arg1, arg2);

** 列举一下JavaScript数组和对象有哪些原生方法?**

  • 数组:
    • arr.concat(arr1, arr2, arrn);
    • arr.join(",");
    • arr.sort(func);
    • arr.pop();
    • arr.push(e1, e2, en);
    • arr.shift();
    • unshift(e1, e2, en);
    • arr.reverse();
    • arr.slice(start, end);
    • arr.splice(index, count, e1, e2, en);
    • arr.indexOf(el);
    • arr.includes(el); // ES6
  • 对象:
    • object.hasOwnProperty(prop);
    • object.propertyIsEnumerable(prop);
    • object.valueOf();
    • object.toString();
    • object.toLocaleString();
    • Class.prototype.isPropertyOf(object);

Array.splice() Array.splice() 的区别?

  • slice -- “读取”数组指定的元素,不会对原数组进行修改
    • 语法:arr.slice(start, end)
    • start 指定选取开始位置(含)
    • end 指定选取结束位置(不含)
  • splice
    • “操作”数组指定的元素,会修改原数组,返回被删除的元素
    • 语法:arr.splice(index, count, [insert Elements])
    • index 是操作的起始位置
    • count = 0 插入元素,count > 0 删除元素
    • [insert Elements] 向数组新插入的元素

JavaScript 对象生命周期的理解?

  • 当创建一个对象时,JavaScript 会自动为该对象分配适当的内存
  • 垃圾回收器定期扫描对象,并计算引用了该对象的其他对象的数量
  • 如果被引用数量为 0,或惟一引用是循环的,那么该对象的内存即可回收

哪些操作会造成内存泄漏?

  • JavaScript 内存泄露指对象在不需要使用它时仍然存在,导致占用的内存不能使用或回收
  • 未使用 var 声明的全局变量
  • 闭包函数(Closures)
  • 循环引用(两个对象相互引用)
  • 控制台日志(console.log)
  • 移除存在绑定事件的DOM元素(IE)

Jquery

你觉得jQueryzepto源码有哪些写的好的地方

  • jquery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window对象参数,可以使window对象作为局部变量使用,好处是当jquery中访问window对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入undefined参数,可以缩短查找undefined时的作用域链

 (function( window,undefined ) {

 

         //用一个函数域包起来,就是所谓的沙箱

 

         //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局

 

         //把当前沙箱需要的外部变量通过函数参数引入进来

 

         //只要保证参数对内提供的接口的一致性,你还可以随意替换传进来的这个参数

 

       window.jQuery = window.$ = jQuery;

 

    })( window );

  • jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法
  • 有一些数组或对象的方法经常能使用到,jQuery将其保存为局部变量以提高访问速度
  • jquery实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率

jQuery 的实现原理?

  • (function(window, undefined) {})(window);
  • jQuery 利用 JS 函数作用域的特性,采用立即调用表达式包裹了自身,解决命名空间和变量污染问题
  • window.jQuery = window.$ = jQuery;
  • 在闭包当中将 jQuery 和 $ 绑定到 window 上,从而将 jQuery 和 $ 暴露为全局变量

jQuery.fn init 方法返回的 this 指的是什么对象?为什么要返回 this

  • jQuery.fn 的 init 方法 返回的 this 就是 jQuery 对象
  • 用户使用 jQuery() 或 $() 即可初始化 jQuery 对象,不需要动态的去调用 init 方法

jQuery.extend jQuery.fn.extend 的区别?

  • $.fn.extend() 和 $.extend() 是 jQuery 为扩展插件提拱了两个方法
  • $.extend(object); // 为jQuery添加“静态方法”(工具方法)

$.extend({

min: function(a, b) { return a < b ? a : b; },

max: function(a, b) { return a > b ? a : b; }

});

$.min(2,3); //  2

$.max(4,5); //  5

  • $.extend([true,] targetObject, object1[, object2]); // 对targt对象进行扩展

var settings = {validate:false, limit:5};

var options = {validate:true, name:"bar"};

$.extend(settings, options);  // 注意:不支持第一个参数传 false

// settings == {validate:true, limit:5, name:"bar"}

  • $.fn.extend(json); // 为jQuery添加“成员函数”(实例方法)

 

$.fn.extend({

   alertValue:function() {

     $(this).click(function(){

       alert($(this).val());

      });

   }

});

 

$("#email").alertValue();

jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

  • 浅拷贝(只复制一份原始对象的引用) var newObject = $.extend({}, oldObject);
  • 深拷贝(对原始对象属性所引用的对象进行进行递归拷贝) var newObject = $.extend(true, {}, oldObject);

jQuery 的队列是如何实现的?队列可以用在哪些地方?

  • jQuery 核心中有一组队列控制方法,由 queue()/dequeue()/clearQueue() 三个方法组成。
  • 主要应用于 animate(),ajax,其他要按时间顺序执行的事件中

varfunc1=function(){alert('事件1');}

varfunc2=function(){alert('事件2');}

varfunc3=function(){alert('事件3');}

varfunc4=function(){alert('事件4');}

 

// 入栈队列事件

$('#box').queue("queue1",func1);  // push func1 to queue1

$('#box').queue("queue1",func2);  // push func2 to queue1

 

// 替换队列事件

$('#box').queue("queue1",[]);  // delete queue1 with empty array

$('#box').queue("queue1",[func3, func4]);  // replace queue1

 

// 获取队列事件(返回一个函数数组)

$('#box').queue("queue1");  // [func3(), func4()]

 

// 出栈队列事件并执行

$('#box').dequeue("queue1"); // return func3 and do func3

$('#box').dequeue("queue1"); // return func4 and do func4

 

// 清空整个队列

$('#box').clearQueue("queue1"); // delete queue1 with clearQueue

jQuery 中的 bind(), live(),delegate(), on()的区别?

  • bind 直接绑定在目标元素上
  • live 通过冒泡传播事件,默认document上,支持动态数据
  • delegate 更精确的小范围使用事件代理,性能优于 live
  • on 是最新的1.9版本整合了之前的三种方式的新事件绑定机制

jQuery 一个对象可以同时绑定多个事件,这是如何实现的?

  $("#btn").on("mouseover mouseout", func);

 

  $("#btn").on({

      mouseover: func1,

      mouseout: func2,

      click: func3

  });

针对 jQuery 的优化方法?

  • 缓存频繁操作DOM对象
  • 尽量使用id选择器代替class选择器
  • 总是从#id选择器来继承
  • 尽量使用链式操作
  • 使用时间委托 on 绑定事件
  • 采用jQuery的内部函数data()来存储数据
  • 使用最新版本的 jQuery

什么是 Ajax? 如何创建一个Ajax?

  • AJAX(Asynchronous Javascript And XML) = 异步 JavaScript + XML 在后台与服务器进行异步数据交换,不用重载整个网页,实现局部刷新。
  • 创建 ajax 步骤:
    • 1.创建 XMLHttpRequest 对象
    • 2.创建一个新的 HTTP 请求,并指定该 HTTP 请求的类型、验证信息
    • 3.设置响应 HTTP 请求状态变化的回调函数
    • 4.发送 HTTP 请求
    • 5.获取异步调用返回的数据
    • 6.使用 JavaScript 和 DOM 实现局部刷新

var xhr =new XMLHttpRequest();

xhr.open("POST",url, true);

xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

xhr.onreadystatechange= function () {

    if (xhr.readyState == 4 &&(xhr.status == 200 || xhr.status == 304)) {

        fn.call(this, xhr.responseText);

    }

};

xhr.send(data);

浏览器本地存储

  • 在较高版本的浏览器中,js提供了sessionStorage和globalStorage。在HTML5中提供了localStorage来取代globalStorage
  • html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage
  • sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储
  • 而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的

web storagecookie的区别

  • Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用
  • 除此之外,WebStorage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie
  • 但是cookie也是不可以或缺的:cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生
  • 浏览器的支持除了IE7及以下不支持外,其他标准浏览器都完全支持(ie及FF需在web服务器里运行),值得一提的是IE总是办好事,例如IE7、IE6中的userData其实就是javascript本地存储的解决方案。通过简单的代码封装可以统一到所有的浏览器都支持web storage
  • localStorage和sessionStorage都具有相同的操作方法,例如setItem、getItem和removeItem等

cookie session 的区别:

  • 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    • 考虑到安全应当使用session。
  • 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    • 考虑到减轻服务器性能方面,应当使用COOKIE。
  • 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  • 5、所以个人建议:
    • 将登陆信息等重要信息存放为SESSION
    • 其他信息如果需要保留,可以放在COOKIE中

描述 cookiessessionStorage localStorage 的区别?

  • 与服务器交互:
    • cookie 是网站为了标示用户身份而储存在用户本地终端上的数据(通常经过加密)
    • cookie 始终会在同源 http 请求头中携带(即使不需要),在浏览器和服务器间来回传递
    • sessionStorage 和 localStorage 不会自动把数据发给服务器,仅在本地保存
  • 存储大小:
  • cookie 数据根据不同浏览器限制,大小一般不能超过 4k
  • sessionStorage 和 localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大
  • 有期时间:
    • localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据
    • sessionStorage 数据在当前浏览器窗口关闭后自动删除
    • cookie 设置的cookie过期时间之前一直有效,与浏览器是否关闭无关

    

Object.is() 与原来的比较操作符 ===== 的区别?

  • == 相等运算符,比较时会自动进行数据类型转换
  • === 严格相等运算符,比较时不进行隐式类型转换
  • Object.is 同值相等算法,在 === 基础上对 0 和 NaN 特别处理

+0 === -0 //true

NaN ===NaN // false

 

Object.is(+0,-0) // false

Object.is(NaN,NaN) // true

什么是 Babel

  • Babel 是一个 JS 编译器,自带一组 ES6 语法转化器,用于转化 JS 代码。 这些转化器让开发者提前使用最新的 JS语法(ES6/ES7),而不用等浏览器全部兼容。
  • Babel 默认只转换新的 JS 句法(syntax),而不转换新的API。

  • 6
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老董前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值