前端面试题
最近经理让我整理一份面试题,发现好多我也忘了,在整理的过程也是对这些东西巩固的过程,整理好了,放上来,以备不时之需
1 /**css (10道题目)**/ 2 1.行内元素有哪些?块级元素有哪些?各自的特点是什么?CSS的盒模型? 3 块级元素:div p h1 h2 h3 h4 form ul 等 4 行内元素: a b br i span input select 等 5 块状占一行,行内元素按照文档流挨着排 6 Css盒模型:content[内容],border ,margin,padding 7 8 2.简述display:inline、display:block、display:inline-block属性的作用 9 display:inline--------把元素设置成行内 10 display:block---------把元素设置成块状、 11 display:inline-block -------把元素设置成块状显示的行内元素 12 13 3..CSS引入的方式有哪些? link和@import的区别是? 14 内联 内嵌 外链 导入 15 区别 :同时加载 16 前者无兼容性,后者CSS2.1以下浏览器不支持 17 Link 支持使用javascript改变样式,后者不可 18 19 4.写出几种IE6 BUG的解决方法 20 1.双边距BUG float引起的 //使用display 21 2.3像素问题 使用float引起的 //使用dislpay:inline -3px 22 3.超链接hover 点击后失效 //使用正确的书写顺序 link visited hover active 23 4.IE z-index问题 //给父级添加position:relative 24 5.Min-height 最小高度 //!Important 解决’ 25 6.为什么没有办法定义1px左右的宽度容器(IE6默认的行高造成的,使用over:hidden,zoom:0.08 line-height:1px) 26 27 5..描述css reset的作用和用途。 28 Reset重置浏览器的css默认属性 29 浏览器的默认样式不同,然后重置,让他们统一 30 31 6.解释css sprites,如何使用。 32 Css 精灵 把一堆小的图片整合到一张大的图片上,减轻服务器对图片的请求数量 33 34 7.什么是语义化的HTML,语义化的好处? 35 直观的认识标签 36 eg: 标题部分用<h1></h1>到<h6></h6> 37 有利于搜索引擎的抓取 38 39 8.清除浮动的几种方式,各自的优缺点 40 1.使用空标签清除浮动 clear:both(缺点:增加无意义的标签) 41 2.使用overflow:auto(宽高当超出默认范围会溢出内容不会被显示,使用zoom:1用于兼容IE) 42 3.是用afert伪元素清除浮动(用于非IE浏览器) 43 44 9.使一个层位居于父容器中间有几种办法?各是什么? 45 1.负margin [css2] 46 .parent{position:"relative";width:"400px";height:"400px";} 47 .child{position:"absolute";width:"200px";height:"200px";left:"50%";top:"50%";margin:"-100px 0 0 -100px";} 48 2.tranform [css3] 49 利用css3的 transform:translate3d(100px,100px,0px )或者 translateX(100px) 和translateY(100px) 组合使用 50 3.js 精确计算后添加style样式 51 52 10.两个相邻的元素都有margin:10px;属性,它们之间的距离是多少? 53 10px //两个相邻的元素margin值一样时,则重叠,不一样时,以margin值较大的为准 54 55 56 57 /**原生javascript (30道题目)**/ 58 1.javascript的typeof返回哪些数据类型 或者说 javascript的基础类型都有什么? 59 Object number function boolean underfind 60 61 2.简述一下BOM和DOM 62 浏览器对象模型 (BOM) 63 文档对象模型 (DOM) 64 65 3.var a=1; ++a; 和a++ 的区别 66 ++a; //先进行加1运算,再使用 67 a++; //先使用,在进行+1操作 68 69 //AJAX相关 70 4.请尽可能详尽的解释AJAX的工作原理,AJAX请求的数据类型有哪几种? 71 1、创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp)) 72 2、判断数据传输方式(GET/POST) 73 3、打开链接 open() 74 4、发送 send() 75 5、当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行 76 77 回调函数 78 79 请求的数据类型有:xml, json, script, html, text, jsonp 80 81 5.HTTP协议的状态都有哪些(如200,302,404,500等状态,并进行描述) 82 200:表示请求成功 83 302:表示重定向 84 404:表示访问错误 85 500:服务器遇到错误,无法完成请求(服务器内部错误) 86 87 6.简述get和post方式的区别 88 GET 请求可被缓存 89 GET 请求保留在浏览器历史记录中 90 GET 请求可被收藏为书签 91 GET 请求不应在处理敏感数据时使用 92 GET 请求有长度限制 93 GET 请求只应当用于取回数据 94 95 POST 请求不会被缓存 96 POST 请求不会保留在浏览器历史记录中 97 POST 不能被收藏为书签 98 POST 请求对数据长度没有要求 99 100 //javascript事件 101 7.IE和标准下有哪些兼容性的写法 102 Var ev = e || window.event 103 document.documentElement.clientWidth || document.body.clientWidth 104 Var target = e.srcElement||e.target 105 106 8.简述一下事件冒泡和事件捕获?怎么阻止事件冒泡和事件默认行为? 107 事件冒泡:事件冒泡是从目标节点先开始出来,然后顺着目标节点的父节点,一级一级往上处理,直到道文档树根节点。 108 事件捕捉:事件捕捉的处理流程是从文档树根节点,一直向下处理,直到目标节点才停止。 109 110 阻止事件冒泡 111 标准:event.stopPropagation() 112 IE: window.event.cancelBubble = true; 113 114 阻止事件默认行为 115 标准:event.preventDefault(); 116 IE: window.event.returnValue = false; 117 118 9.DOM事件分为几个等级?怎么给一个对象 obj 添加一个事件?是否需要考虑到兼容性?如果要删除呢? 119 两个级别:dom 0级 和 dom 2级 120 dom 0 级 <input id="myButton" type="button" value="Press Me" onclick="alert('thanks');" > 121 dom 2 级 document.getElementById("myButton").onclick = function () { 122 alert('thanks'); 123 } 124 125 需要考虑兼容性 126 标准事件绑定 addEventListener(eventName[string],handler[fn],useCapture[boolean 一般为fase 从冒泡阶段对事件监听, 127 128 true:在事件捕获阶段添加回调函数]) obj.addEventListener("click", function(){alert(1)}, false); 129 IE事件绑定 attachEvent(on+eventName[string],handler[fn]) 130 obj.attachEvent("onclick", function(){alert(1)}); 131 132 标准事件移除 obj.removeEventListener(eventName,handler[fn],useCapture[boolean 一般为fase 从冒泡阶段对事件监听, 133 134 true:在事件捕获阶段添加回调函数]); 135 IE事件移除 obj.detachEvent('on'+eventName,handler[fn]); 136 137 10.documen.write和 innerHTML的区别 138 document.write只能重绘整个页面 139 innerHTML可以重绘页面的一部分 140 141 11.简述下列返回结果 null == undefined NaN == null NaN == undefined NaN == NaN (NaN 与任何值都不想等,包括NaN本身) 142 null == undefined //true 143 NaN == null //false 144 NaN == undefined //false 145 NaN == NaN //false 146 147 12.var undefined = "test" console.log(undefined) 输出结果是什么? 148 var undefined = "test" 149 console.log(undefined) // test undefined 不是javascript的关键字 150 151 13.typeof undefined 和 typeof null 的结果是什么 152 typeof undefined //undefined 153 typeof null //object null是javascript中的一个数据类型 154 155 //作用域相关 156 14.var s = "test"; s.len = 4; var t =s.len 输出t结果会是什么? 157 var s = "test"; //声明一个对象并赋值 158 s.len = 4; //创建一个临时字符串并赋值 159 var t = s.len; //第二行执行后,s的len属性被销毁,t访问对象的一个不存在的属性结果是undefined 160 161 15. var scope = "global"; 162 function checkScope(){ 163 var scope = "local"; 164 return scope; 165 } 166 调用 checkScope()函数返回值什么值? //local 局部变量覆盖全局变量 167 168 16. var scope = "global"; 169 function f(){ 170 console.log(scope); //输出undefined,而不是global, 171 var scope = "local"; //变量在这里赋值,但变量本身在函数体内任何地方均是有定义的 172 console.log(scope); //输出local 173 } 174 调用 f() 函数会两次分别输出什么? //变量声明提前 175 相当于以下代码 176 var scope = "global"; 177 function f(){ 178 var scope; // 声明但未赋值 179 console.log(scope); //输出一个未赋值的变量,结果是undefined 180 scope = "local"; //给scope赋值 181 console.log(scope); //输出 local 182 } 183 184 185 17.call和apply的区别? 186 Object.call(this,obj1,obj2,obj3) //参数列表 187 Object.apply(this,arguments) //数组 188 189 /**这个可以不问,仅当解释**/ 190 apply:应用某一对象的一个方法,用另一个对象替换当前对象。 191 call:调用一个对象的一个方法,以另一个对象替换当前对象。 192 193 //隐试类型转换 194 18.例举3种强制类型转换和2种隐式类型转换? 195 强制(parseInt,parseFloat,number) 196 隐式(== - ===) 197 198 19.说一下 == 和 === 的区别 199 前者会自动转换类型 且 只判断值是否相等 200 后者不会 且 判断值和类型是都相等 201 202 20.var a = "1"+1,b=1+"1",c=1-"1",d=1-"1"; 的值分别为为() 203 输出为:"11","11",0,0 204 205 //数组的相关函数 206 21.数组方法pop() push() unshift() shift() 207 Push()尾部添加 pop()尾部删除 208 Unshift()头部添加 shift()头部删除 209 210 22.slice()和splice() 的区别 211 slice(start[起始],end[结束]):方法可从已有的数组中返回选定的元素 212 (不改变原数组,返回子数组,参数可以为负数,代表从数组的末尾算起,-1:代表倒数第一个,-2:代表数组倒数第二 213 214 个元素) 215 splice(index[数组索引],howmany[删除个数,0代表不删除],item1,.....,itemX[添加的元素]): 216 方法向/从数组中添加/删除项目,然后返回被删除的项目(会直接对数组进行修改) 217 218 //字符串相关函数 219 23.说一下substring()和substr()的区别 220 substring():提取字符串中两个指定的索引号之间的字符。 221 substr():从起始索引号提取字符串中指定数目的字符。 222 223 24.split() join() 的区别 224 前者是以指定字符切割成数组的形式(默认使用逗号“,”) 225 后者是将数组转换成字符串以指定字符分割 226 eg:split() 227 var str="How are you" 228 229 str.split(" ") 230 //输出["How", "are", "you"] 231 232 str.split("") //输出 233 ["H", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u"] 234 235 str.split(" ",2) //输出["How", "are"] 236 eg:join() 237 var str = ["a","b","c"] 238 239 str.join(" "); //输出 240 "a b c" 241 str.join(","); //输出"a,b,c" 242 243 //Math相关函数 244 25.产生一个1到10的随机数 245 Math.random()*10 246 247 26.Math.floor(),Math.ceil()的区别 248 Math.ceil():对数进行上舍入。 249 eg: 250 Math.floor(-5.9) ==》-5 251 Math.floor(0.9) ==》 1 252 Math.floor():对数进行下舍入 253 eg: 254 Math.floor(-5.9) ==》-6 255 Math.floor(0.9) ==》 0 256 257 //日期类型操作 258 27.输出当前时间,并格式化为yyyy-MM-dd hh:hh:mm 259 var now = new Date(); 260 var y = now.getFullYear(); //获得年份 261 M = now.getMonth()+1; //获得月份 0~11 262 d = now.getDate(); //获得当前日期 263 h = now.getHours(); //获得当前小时 24小时制,若要12小时制,则减去 12 264 m = now.getMinutes() //获得分钟 265 s = getSeconds(); //获得秒数 266 console.log(y+"-"+M+"-"+d+" "+h+":"+m+":"+s); 267 268 //document 对象方法 269 28.有以下文档结构,请问如何获取表单的第一个input元素的值 270 <div> 271 <form name = "myForm"> 272 <input type="text" id="myName" name="myName" class="myName" value="CoCo"/> 273 </form> 274 </div> 275 var name; 276 (1). name = document.getElementById('myName'); 277 (2). name = document.getElementsByTagName('input')[0]; 278 (3). name = document.getElementsByName('myName')[0]; 279 (4). name = document.myForm.children[0]; 280 (5). name = document.getElementsByTagName('form')[0].children[0]; 281 (6). name = $("#myName").val(); //使用jQury 282 (7). name = $(".myName").val(); //使用jQury 283 console.log(name.value); 284 285 29.有以下文档结构 286 <ul id="myList"> 287 <li>Coffee</li> 288 <li>Tea</li> 289 </ul> 290 (1)、在内容为Tea的li后面添加一个内容为Water的li 291 var node=document.createElement("li"), 292 textnode=document.createTextNode("Water"), 293 list = document。getElementById("myList"); 294 node.appendChild(textnode); 295 296 list.appendChild(node); 297 298 (2)、如果在内容为Coffee的li前面添加呢? 299 //insertBefore(newItem[要插入的节点],nodeIndex[可选参数,在那个节点之前插入,若为空则在末尾插入]) 300 301 list.insertBefore(node,list.childNodes[0]); 302 303 30.添加 删除 替换 插入到某个接点的方法 304 obj.appendChidl() 305 obj.innersetBefore 306 obj.replaceChild 307 obj.removeChild 308 309 /**js库相关题目**/ 310 //jQuery相关 311 1.javascript的window.onload()方法和jQuery 的 $(document).ready()方法的区别 312 1.执行时间 313 window.onload() :必须等到页面内包括图片的所有元素加载完毕后才能执行 314 $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。 315 2.编写个数不同 316 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个 317 $(document).ready()可以同时编写多个,并且都可以得到执行 318 3.简化写法 319 window.onload没有简化写法 320 $(document).ready(function(){})可以简写成$(function(){}); 321 322 2.简述以下代码的作用 323 $(".stu .name") //选择所有类名为stu元素下面的所有类名为name的所有元素 324 $(".stu,.name") //选择所有类名为stu元素和 name的所有元素 325 $(".stu > .name") //选择所有类名为stu元素的直系子元素类名为name的所有元素 326 327 3.简述jQuery中 text()、html()、val()方法的作用 328 text() - 设置或返回所选元素的文本内容 329 html() - 设置或返回所选元素的内容(包括 HTML 标记) 330 val() - 设置或返回表单字段的值 331 332 4.使用jQuery 的 animate()出现动画列队时如何保证在执行下一个动画前结束当前动画 333 使用stop()方法 //停止当前动画 334 应用场景: 335 当在滑动轮播图时,当点击很多次是,即使不再点击,但是动画仍列队仍然执行,所以需要停止当前动画 336 337 //zepto相关 338 1.zepto.js中tap() 和 jQuery 中clik()方法的区别 339 click():会有200-300毫秒的延迟 340 tap(): 无延迟 341 342 //HTML5相关 343 1.HTML5 中新增了哪些特性? 344 用于绘画的 canvas 元素 345 用于媒介回放的 video 和 audio 元素 346 对本地离线存储的更好的支持 347 新的特殊内容元素,比如 article、footer、header、nav、section 348 新的表单控件,比如 calendar、date、time、email、url、search 349 350 /**综合**/ 351 1.你有哪些性能优化的方法? 352 (1) 减少http请求次数:CSS Sprites(又称css精灵或者css雪碧图), JS、CSS源码压缩、图片大小控制合适;CDN托管,data缓存 , 353 354 图片服务器。 355 (2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求 356 357 次数 358 (3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。 359 (4) 当需要设置的样式很多时设置className而不是直接操作style。 360 (5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。 361 (6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。 362 (7) 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。 363 364 2.事件兼容写法 365 /*调试*/ 366 addEventHandler(def,'click',preDefault); 367 addEventHandler(def,'click',stopBubble); 368 369 /*类库*/ 370 /*事件绑定*/ 371 function addEventHandler(obj,eventName,handler) { 372 if (document.attachEvent) { 373 obj.attachEvent('on'+eventName,handler); 374 }else if (document.addEventListener) { 375 obj.addEventListener(eventName,handler,false); 376 } 377 } 378 /*事件移除*/ 379 function removeEventHandler(obj,eventName,handler) { 380 if (document.detachEvent) { 381 obj.detachEvent('on'+eventName,handler); 382 }else if (document.removeEventListener) { 383 obj.removeEventListener(eventName,handler,false); 384 } 385 } 386 /*获取事件对象*/ 387 function eventTarget(evt) { 388 var evt = evt||window.event; 389 var targetElement = evt.target||evt.srcElement; 390 return targetElement; 391 } 392 /*阻止冒泡*/ 393 function stopBubble(evt) { 394 var evt = evt||window.event; 395 if (evt.stopPropagation) { 396 evt.stopPropagation(); 397 } 398 else { 399 window.event.cancelBubble = true; 400 } 401 } 402 /*阻止默认*/ 403 function preDefault(evt){ 404 var evt=event||window.event; 405 if (evt&&evt.preventDefault) { 406 evt.preventDefault(); 407 } 408 else { 409 window.event.returnValue = false; 410 } 411 }
当然再整理的过程难免会出披露,希望发现的朋友指出以便更正,也防止误人子弟!与君共勉!