当前位置: 首页 > 后端技术 > PHP

【腾讯面试题】web开发工程师职位

时间:2023-03-29 17:30:11 PHP

JavaScriptXMLHttpRequest介绍及其readyState状态码XMLHttpRequest是一个API,为客户端提供客户端与服务端之间传输数据的功能。它提供了一种无需刷新整个页面即可通过URL获取数据的简便方法。readyState属性,有5个状态值如下:0UNSENT还没有调用open()方法1OPENEDopen()已经调用,还没有调用send()方法2HEADERSRECEIVEDsend()方法已经调用,响应状态andheaders已经返回3LOADING加载responseBody,在responseText中已经获取了一些数据4DONE整个请求过程已经完成scope。功能范围在定义时确定。内部函数可以访问外部函数的变量、参数和其他函数声明。如果允许在包含函数之外调用内部函数,则形成闭包。使用闭包生成自增id函数functioncreateIncId(seed){seed=parseInt(seed)||0;返回函数(){返回种子++;}}varincFn1=createIncId(100);varincFn2=createIncId(10);incFn1();//100incFn1();//101incFn2();//10incFn2();//如何释放11js闭包的内存首先,闭包是因为函数执行后返回的对象或函数可以访问外部函数变量、参数和函数声明。所以在js的回收机制中,这些变量、参数、函数声明引用都会被标记(在定义的时候决定哪些变量会被标记),这些占用的内存在定时回收的时候是不会考虑回收的。如果我们将返回的对象或函数设置为null,那么我们就失去了对内部变量的控制,它将被回收。这是一个简单的实时测试示例varcreateClouse=function(){varargs=[].slice.call(arguments,0);return{//持有对args的引用getValue:function(index){returnargs[index]||不明确的;},getIndex:function(val){返回参数。findIndex(function(arg){returnval===arg;});}}}varclouse=createClouse({},[],'',null,undefined,false,0);alert(clouse.getIndex(undefined));//一旦clouse的引用不存在,对象就会被标记为回收状态clouse=null;JavaScript的内存回收机制使用标记-清除(mark-sweep)算法创建一个“根”列表,其中保存着被引用的全局变量。在浏览器中,window对象一直存在,window对象下的对象变量也一直存在,所以不会被标记为回收。从“根”可到达的所有子节点都没有标记为回收。所有未标记为活动的内存块都可以标记为由垃圾收集器回收。JavaScript在什么情况下会发生内存溢出,如何防止要了解如何防止内存泄漏,需要了解对象的基本生命周期。对象生命周期,JS为引用类型分配合适的内存,垃圾回收器会从分配开始就继续评估对象,检查它是否是有效对象。垃圾收集器周期性地扫描对象,引用数为0或者唯一引用对象的对象被回收到对象中进行回收。内存泄漏方式一:ClosurevartheThing=null;varreplaceThing=function(){varoriginalThing=theThing;varunused=function(){if(originalThing){console.log('hi');}};theThing={longStr:newArray(1000000).join('*'),someMethod:function(){console.log('somemessage');}};//显示标记释放内存//originalThing=null;};setInterval(replaceThing,1000);一直执行的话,可以在chrome工具栏内存下拍几张Heap的快照,你会发现每1s内存就会不断增加。原因是theThing的someMethod和unused都在同一个父作用域中。unused指的是originalThing,someMethod和unsued共享closure的范围。对originalThing的引用被迫保持活跃并防止回收。如果在replaceThing后加上originalThing=null,循环后内存不会增长。内存泄漏方法二:意外的全局变量functionfoo(){//意外绑定到全局window.bar变量一般来说,尽量少用全局变量。运行多用户函数声明以创建私有函数作用域。局部变量会在执行后释放。使用'usestrict'防止内存泄漏隐式定义全局变量方法3:忘记定时器或回调函数varsomeResource=getData();varinterval=setInterval(function(){varnode=document.getEelementById('节点');if(node){//使用node和someResource做一些事情。node.innerHTML=JSON.stringify(someResource));}else{//clearInterval(间隔);}},1000);一旦node节点不存在,someResource就变成了不必要的引用。由于setInterval定时器依然存在,所以someResource的数据无法回收。解决方法是使用clearInterval回收定时器内存泄漏。方法四:DOM引用functiondoStuff(){image.src='http://some.url/image';按钮.点击();console.log(text.innerHTML);//更多的逻辑}functionremoveButton(){//该按钮是body.document.body.removeChild(document.getElementById('button'))的直接子元素;//此时,我们仍然在全局//元素字典中有一个对#button的引用。换句话说,按钮元素仍然在//内存中,无法被GC回收。}文档中删除了DOM引用,但是如果js中有引用,则不会有垃圾回收DOM节点绑定事件。如果不删除事件后直接删除DOM,这样也会造成泄漏。常见的跨域方法有哪些?首先我们要了解同源策略,它是浏览器的核心,具有更基本的安全功能。限制一个源中的文本伙伴脚本从其他源加载资源。同源是指:相同的协议、相同的域名、相同的端口。跨域方法一:主域相同,两个子域跨域。设置文档.domain例如:http://m.liylblog.comandhttp://www.liylblog.com设置http://m.liylblog.com/a.htmlandhttp://m.liylblog.com/b。html的document.domain是liylblog.comwww.htmlscriptvargetDomainIframe=(function(domain,src){document.domain=domain;varifr=document.createElement('iframe');ifr.src=src;ifr.style.display='none';document.body.appendChild(ifr);varpromise=newPromise(function(resolve,reject){ifr.onload=function(){ifr.onload=null;resolve(ifr.contentWindow);};});返回函数(){returnpromise;}})('liylblog.com','http://m.liylblog.com/public/examples/2017/cros_domain/diff_subdomain/m.html');functiongetData(xhr,fn){xhr.open('GET','http://m.liylblog.com/public/examples/2017/cros_domain/diff_subdomain/m_data.json',true);xhr.onreadystatechange=function(){if(xhr.readyState===XMLHttpRequest.DONE&&xhr.status===200){fn&&fn(xhr.responseText);}}xhr.send();}document.querySelector('#btn').addEventListener('click',function(){getDomainIframe().then(function(win){varxhr=newwin.XMLHttpRequest();getData(xhr,function(data){document.querySelector('#console').innerHTML=data;});});},false);m.html脚本document.domain='liylblog.com';原理:获取到m.html的window对象后,就可以使用这个window对象下的XMLHttpRequestAPI对m.liylblog.com的资源进行ajax请求在线演示地址跨域方法二:window.postMessagepostMessageHTML5中新增的方法可以实现跨文档的消息传输。通过绑定window.addEventListner('message')事件监听并发送文档消息传输内容跨域方式三:代理服务器代理将需要请求的地址作为参数发送给同域服务器,服务器代理请求目标地址。跨域方式四:jsonp动态插入脚本利用script脚本动态插入执行的特性,将请求地址存放在script的src属性中,加载onload后执行脚本。跨域方式五:CORS跨域资源共享(CORS)机制允许Web应用服务器进行跨域访问控制,从而可以安全地进行跨域数据传输。浏览器在API容器(例如XMLHttpRequest或Fetch)中支持CORS以降低跨源HTTP请求的风险。Cross-OriginResourceSharing标准增加了一组新的HTTP标头字段,允许服务器声明哪些源站点有权访问哪些资源。规范要求对于那些可能对服务器数据产生副作用的HTTP请求方法,OPTIONS方法预检请求(preflightrequest)重绘(repaint)和回流(reflow)重绘(repaint)repaint在一个元素的外观改变时,但是在不改变布局的情况下发生,例如改变可见性、轮廓、背景等。当重绘发生时,浏览器会验证DOM树中所有其他节点的可见性属性。Reflow当一个元素改变时,它会影响文档的内容或结构,或者元素的位置。这个过程称为回流。什么时候回流发生:改变窗口大小改变文本大小添加/删除样式表内容改变,(用户也会在输入框中写入内容)激活伪类,如:悬停操作类属性脚本操作DOM计算offsetWidth和offsetHeight设置style属性PS:回流一定会引起重绘如果前面有任务队列,则在执行完前面的任务队列后执行动画任务。requestAnimationFrame采用系统时间间隔来保持最佳的绘制效率,不会因为间隔太短导致过度绘制而增加开销;也不会因为间隔太长而导致动画卡顿,从而实现各种网页动画效果有统一的刷新机制,节省系统资源,提高系统性能,提高视觉效果。requestAnimationFrame优点:requestAnimationFrame会将所有DOM操作集中在每一帧,在一次重绘或回流中完成,重绘或回流的时间间隔紧跟浏览器在隐藏或不可见元素的刷新频率,requestAnimationFrame不会重绘或回流,这当然意味着更少的CPU、GPU和内存使用requestAnimationFrame是浏览器专门为动画提供的API,浏览器会在运行时自动优化方法调用,如果页面不活跃,动画会自动暂停,有效节省CPU开销HTTP协议介绍请求过程:-请求行HTTP版本号-请求头响应过程:-响应HTTP版本号响应状态码响应状态-响应头-响应实体HTTP1.0为每个请求打开一个连接,并关闭请求结束后连接。响应的对象可以是任意类型,HTML文件、文本文件、图片等格式内容。由响应头Content-Type指定。简单请求#telnetwebsite.org80>GET/rfc/rfc1945.txtHTTP/1.0>输入两次HTTP1.1与HTTP1.0相比,HTTP1.1有更多的性能优化。持久连接块编码传输字节范围请求增强缓存机制传输编码请求管道在第一个HTTP请求文件成功后,还会使用现有连接发送请求获取favicon.png网站缩略图图标。如果任何一方想要终止连接,可以发送Connection:closed来关闭连接。HTTP2.0协议升级方法ALPN协议(ApplicationLayerNegotiationProtocol)当浏览器建立TLS连接时,它告诉服务器它支持HTTP1.1和HTTP2.0协议。服务器拿到信息后,也告诉浏览器它支持HTTP2.0协议。所以协议转换为HTTP2.0。接下来通过HTTP2.0进行通信。基于HTTP的协商过程HTTP升级请求GET/HTTP/1.1host:nghttp2.orgconnection:Upgrade,HTTP2-Settingsupgrade:h2c/*发起带有HTTP2.0升级头的请求*/http2-settings:AAMAAABkAAQAAP__/*ClientSETTINGSPayload*/user-agent:nghttp2/1.9.0-DEVHTTPUpgraderesponseHTTP/1.1101SwitchingProtocols/*服务器同意升级到HTTP2.0*/Connection:UpgradeUpgrade:h2cHTTPUpgradesuccess/*协商完成*/帧通信缓存方法缓存HTTP协议的方法主要分为强制缓存和协商缓存-Pragma1.0-Expires-Cache-ControlBrowser缓存头和服务器缓存头网络介绍OSI七层模型和TCP/IP四层模型OSI七层模型协议层传输方式物理层传输二进制比特流数据链路层数据帧(frame)网络层数据包(packet)传输层数据段(segment)会话层管理主机间的会话过程s(socket)表示层数据加密、压缩、格式转换应用层消息(message)TCP/IP协议栈协议层传输方式网络接口层Ethernet、WIFI网络互连层IP,对应主机IP,发送数据包传输层TCP,UDP,对应Port,应用层HTTP,FTP,DNSTCP和UDP区别TCP(TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议Connection-orientedtransmissionreliabletransmissionorderUDP(UserDatagramProtocol))是OSI参考模型中的无连接传输层协议,提供面向事务的简单不可靠信息传输服务。非连接传输不可靠,速度很快HTTP、FTP、TELENET、SSH属于TCP,ping命令属于UDP。解释TCP的三次握手和四次握手。linux查找端口对应的进程servicelsof查找进程占用了哪些端口sudolsof-i:80查找使用80端口的进程lsof-uwww查找用户www进程打开的文件netstat显示IP相关统计信息,TCP,UDP和ICMP协议netstat-lntp查看打开了哪些端口查看内存占用和CPU占用命令top查看CPU显示状态top-uwww查看用户的CPU内存占用wwwpmap根据processfreeavailablememorysizefree-mMB为单位free-gGB为单位PHP单例模式实现远程加载图片资源,考虑情况参考PHP的内存回收机制算法常用排序算法快速排序算法时间复杂度二进制如何实现排序参考文章UnderstandingmemoryleaksinJavaScriptapplicationsHTTPaccesscontrol(CORS)----------------------分割线----------------------答案wertothequestionwillareregularlyCompletion欢迎指正,学到东西还是不错的