刷题积累
1.原声js事件委托;
2.用原生的js写个完整的get请求;
3.local storage,session storage,cookies的区别;
4.window.onload和$(document).ready(function(){})的区别;
5.跨域处理;
6.从一个http请求后到页面加载完成后这期间的经历了哪些过程;
7.前后端分离的好处;
8.post和get的区别;
9.js的性能优化;
10.css的回流和重绘;
11.关于闭包的理解;
12.对象的继承;
13.typeof和instanceof的区别;
14.对盒子模型的理解,ie与普通盒模型的区别;
15.w3c标准与es规范,熟悉web语义化;
16.浏览器与移动设备的兼容性;
17.计算一个for循环的用时;
18.判断一个页面中是否有多个相同的id名;
19.call,apply,bind的区别;
20.null、undefined的区别;
21.insertAbjacentHTML(position,content);
22.new操作符具体干了什么
23.获取document的所有属性
24.var a = 2 ;console.log(a++);
1.原生js事件委托;
1 <ul id="dox"> 2 <li class="item">1</li> 3 <li class="item">2</li> 4 <li class="item">3</li> 5 <li class="item">4</li> 6 <li class="item">5</li> 7 </ul> 8 //判断点击时那一条li 9 10 <script> 11 var ul = document.getElementById("dox"); 12 var lis = ul.getElementsByTagName("li"); 13 ul.addEventListener("click",function(e){ 14 e = e||window.event; 15 var target = e.target||e.srcElement; 16 alert([].indexOf.call(lis,target)); 17 }) 18 </script>
3.local storage,session storage,cookies的区别;
1 3.1.1local storage 能在浏览器端存储键值对数据,页面关闭后数据还存着 2 3 3.1.2只能存储字符串 4 5 3.1.3也可以存储字符串化的json数据 6 7 8 9 3.2.1session storage只能存储当前会话的数据,一旦关闭浏览器或者当前页数据就会被自动清理掉 10 11 12 13 3.3.1cookies的存储大小受到限制 14 15 3.3.2只能存储字符串 16 17 3.3.3增加了文档的传输的负载 18 19 3.3.4能跟服务器端进行通信
4.window.onload和$(document).ready(function(){})的区别;
1 1.加载时间的不同 1.1window.onload是所有的文件(包括图片等)加载完后再加载,1.2$(document).ready(function(){})是在dom文件加载完后就加载 2 3 2.执行的个数的不同 2.1window.onload 是只会执行一个,2.2是所有的$(document).ready(function(){})代码块都会执行 4 3.是否可以缩写 3.1window.onload没有 3.2$(document).ready(function(){})可以写成$(function(){})
6.从一个http请求后到页面加载完成后这期间的经历了哪些过程;
1 1.域名解析 查看chrome的dns缓存 2 3 1.1浏览器搜索自身的dns缓存 4 5 1.2搜索操作系统自身的dns缓存(浏览器没有找到缓存或缓存已失效) 6 7 1.3读取本地的host文件(系统安装文件下的---一般在"windows-system32-drivers-etc-host)") 8 9 1.4浏览器发起一个dns的系统调用 10 11 1.4.1宽带运营商服务器查看本身的缓存 12 13 1.4.2运营商服务发起一个迭代dns解析的请求 14 15 1.4.2.1先去找根域的dns的ip地址,根域解析imooc.com的com是顶级域,然后又去顶级域中找,然后又去imooc.com的域的dns(域名注册商提供) 16 17 2.运营商服务器把结果返回给操作系统,操作系统内核同时缓存起来 18 19 3.操作系统内核把结果返回给浏览器 20 21 4.最终浏览器拿到www.imooc.com对应的ip地址 22 23 5.浏览器获得域名对应的ip地址后发起http"三次握手" 24 25 5.1.客户端向服务器发送发送一个syn(同步序列号)(syn=j)包,并进入syn_sent状态,等待服务器确认, 26 27 5.2服务器接受客户端的syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即syn+ack,此时服务器进入syn_recv状态 28 29 5.3客户端收到服务器的syn+ack包,向服务器发送确认ack包,此包发送完毕,客户端和服务器进入established(tcp连接成功)状态,完成三次握手。 30 31 6.tcp/ip连接建立起来后,浏览器就可以向服务器发送http请求了 eg:用http的get方法请求 32 33 7.服务器接受到了这个请求根据路径参数,经过后端的一些处理之后,把处理后的一个结果的数据返回给浏览器, 34 35 8.浏览器拿到了整个html页面的代码,在解析和渲染时如果里面有js,css也会经过一个个的http请求,第一需要经过上面的7个步骤) 36 37 9.浏览器根据拿到的资源对页面进行渲染,最终把一个完整的页面呈现个用户
9.js的性能优化;
1 9.1如果需要遍历数组,应该先缓存数组长度,放入局部变量中,避免多次查询数组长度 2 3 9.2局部变量的访问数度比全局变量的数度要快,局部变量是放在函数的栈里,全局变量是window对象的成员 4 5 9.3尽量避免对象的嵌套查询,如obj1.obj2.obj3.obj4,需要至少3次的遍历,尽量用局部变量保存再继续 6 7 9.4在运算时尽量使用 "+="、"-="、"*="、"\="替换直接赋值运算 8 9 9.5将数字转换为字符的优先级---》(""+) > String() > toString() > new String(); 10 11 String()属于内部函数,toString()需要查询原型中的函数,new String()需要创建一个字符串对象 12 13 9.6将浮点数转换为整数时,用Math比用parseInt快(Math时内部对象) 14 15 Math.round(x)(把x四舍五入为最接近的整数); 16 17 Math.floor(x)(返回小于等于x的最大整数--向下取整); 18 19 Math.ceil(x)(返回大于等于x的最小数--向上取整); 20 21 9.7尽量用json格式来创建对象,而不是var obj = new Object(),前者是直接赋值,后者要调用构造器 22 23 ,还有数组用var arr = []替换var arr = new Array();前者是引擎直接解析,后者需要调用Array构造器 24 25 9.8对字符串的查找用 "正则表达式"代替"循环查找" 正则是用c写成的API性能好 26 27 9.9对js对象,因为创建时间和空间的开销都比较大,因此因尽量考虑用缓存 28 29 9.10js循环 for(;;),while(),for(in) 30 31 这三种中for(in)的效率最差,因为他会查询hash键,for(;;),while()差不多,推荐for(;;)他可以处理递增递减
17.计算一个for循环的用时;
1 console.time("Time"); 2 3 for(var i = 0;i<5;i++){console.log(i)} 4 5 console.timeEnd("Time");//只能在控制台得到一个计数时间,但不能输出返回结果,也不能赋值给变量保存
1 //如果需要计时作为数据保存,可以使用window.performance.now(); 2 3 var start = window.performance.now(); 4 5 for(var i = 0;i<5;i++){console.log(i)} 6 var end = window.performance.now(); 7 8 var useTime = end - start; 9 10 //如果想知道页面是何时被加载的,可以获取 var a = window.performance.timing.navigationStart 值,得到的是一个时间戳,new Date(a).ToString("yyyy-MM-dd hh:mm:ss");可以转换为字符串
1 //也可以使用 Date.now() 函数来计时,该函数返回一个整数毫秒值 2 3 var start = Date.now(); 4 for(var i = 0;i<5;i++){console.log(i)} 5 var end = Date.now(); 6 7 var useTime = end - start ;
18.判断一个页面中是否有多个相同的id名;
1 <ul class="ul"> 2 <li id="itme1">1</li> 3 <li class="cls">a1</li> 4 <li id="itme1">2</li> 5 <li id="itme1">3</li> 6 <li class="cle">b1</li> 7 </ul> 8 <script> 9 var ul = document.getElementsByClassName('ul'); 10 var lis = ul[0].getElementsByTagName('li'); 11 var item1 = document.getElementById('itme1').id; 12 var j = 0; 13 for (var i = 0; i < lis.length; i++) { 14 if(item1 = lis[i].id)j++; 15 } 16 if(j>1)console.log(item1+"这个id一共有"+j+"个") 17 </script>
19.call,apply,bind的区别;
1 1.apply 、 call 、bind 三者都是用来改变函数的this对象的指向的; 2 3 2.apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文; 4 5 3.apply 、 call 、bind 三者都可以利用后续参数传参; 6 7 4.bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。
20.null、undefined的区别;
1 1.undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是: 2 (1)变量被声明了,但没有赋值时,就等于undefined。 3 (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。 4 (3)对象没有赋值的属性,该属性的值为undefined。 5 (4)函数没有返回值时,默认返回undefined。 6 7 2.null表示"没有对象",即该处不应该有值。典型用法是 8 (1) 作为函数的参数,表示该函数的参数不是对象。 9 (2) 作为对象原型链的终点。
21.insertAbjacentHTML(position,content);可以向指定的元素的指定位置插入节点元素,他不会重新解析它正在使用的元素,因为它不会破坏元素内的现有元素,这避免了额外的序列换步骤,使其比直接innerHTML操作更快
1 <div class="c container1" > 2 <div class="row1"> 3 hello 4 </div> 5 </div> 6 7 <script> 8 //使用insertAdjacentHTML 9 var cl = document.getElementsByClassName('row1')[0]; 10 cl.insertAdjacentHTML("beforeBegin","welcome here!");//元素自身的前面 11 cl.insertAdjacentHTML("beforeBegin","welcome here!1"); 12 cl.insertAdjacentHTML("beforeEnd","end welcome here!");//插入元素的最后一个子节点之后 13 cl.insertAdjacentHTML("beforeEnd","end welcome here!1"); 14 cl.insertAdjacentHTML("afterBegin","come here!");//插入元素内部的第一个子节点之前 15 cl.insertAdjacentHTML("afterBegin","come here!1"); 16 cl.insertAdjacentHTML("afterEnd","end come here!");//元素自身的后面 17 cl.insertAdjacentHTML("afterEnd","end come here!1"); 18 </script>
22.new操作符具体干了什么
new运算符创建并初始化一个新对象,关键字new后跟随一个函数调用,这个函数称为构造函数(constructor),构造函数用以初始化一个新创建的对象,
js语言核心的原始类型都包含内置构造函数,
eg: var o = new Object(); //创建一个空对象,和{}一样
var arr = new Array(); //创建一个空数组,和[]一样
var d = new Data();//创建一个表示当前时间的Date()对象
var reg = new RegExp("js");//创建一个可以进行模式匹配的RegExp对象
22.1创建一个空对象,并且this变量引用该对象,同时还继承了该对象的原型(prototype) 22.2属性和方法加入到this引入的对象中 22.3新创建的对象由this所引用,并且最后隐式的返回this
23.获取document的所有属性
for(var k in document){ console.log(k); }
24.var a = 2 ;console.log(a++);
1 a++ 先参与运算,再自增 2 ++a先自增,再参与运算