年底快到了,又到了跳槽的季节,又到了刷题的时候了。这里总结了一些真实的面试问题,这些问题在被问到时可能会让人感到困惑。有需要的可以去看看~1.谈谈你对dns-prefetch的理解WhatisDNS--DomainNameSystem,域名系统,作为域名和IP地址相互映射的分布式数据库。DNSPrefetching浏览器提前根据自定义规则解析后面可能会用到的域名,加快网站的访问速度。简单的说就是提前解析域名,避免耽误时间。如何使用这个功能有一个默认的加载条件,一个标签的所有href都会自动启用DNSPrefetching,也就是说你的网页带有a标签href的域名不需要在head中添加链接手动设置。但是标签的默认开头在HTTPS中不起作用。这时在meta中使用http-equiv强制启动功能。综上所述,DNSPrefetching提前加载域名解析,节省解析时间。标签的href在chrome中可用。Firefox包含更高版本的IE,但它不能在HTTPS下工作。需要Meta才能强制启用该功能。这是DNS的预解析,不是css、js等的文件缓存,请不要混淆这两个不同的概念。如果直接做js重定向,或者在服务端做重定向,如果不在链接里手动设置,是不行的。这对什么样的网站更有用?对于淘宝这样的网站,你的网页引用了很多其他域名的资源。如果你的网站基本所有的资源都在你自己的域名下,那这个基本没什么。影响。因为DNSChrome会为您缓存您的网站。扩展知识,学习web下性能优化1(网络方向)2.get/post请求参数长度有什么特点我们常说get请求参数大小有限制,但是post请求的参数大小是无限的。这是一个错误的说法。事实上,HTTP协议从来没有规定过GET/POST的请求长度限制。get请求参数的限制是来源和浏览器或web服务器,浏览器或web服务器限制url的长度。为了弄清楚这个概念,我们必须再次强调以下几点:HTTP协议没有规定GET和POST的长度限制。显示GET的最大长度是因为浏览器和Web服务器限制了URI的长度。不同的浏览器和WEB服务器限制的最大长度是不同的。为支持IE,最大长度为2083byte。如果仅支持Chrome,则最大长度为8182byte。标题的价值足以强调重点。重要关键词出现次数不超过2次,放在最前面。不同页面的标题应该不同;不同的;keywords只能列出重要的关键词2.语义化的HTML代码,符合W3C规范:语义化的代码让搜索引擎更容易理解网页3.重要内容的HTML代码放在最前面:搜索引擎从顶部抓取HTMLNext,一些搜索引擎对抓取的长度有限制,以确保重要的内容被抓取。4、不使用js输出重要内容:爬虫不会执行js获取内容。5、少用iframe(搜索引擎不会抓取iframe内容)6、非装饰性图片一定要加alt7、提高网站速度(网站速度是搜索引擎排名的重要指标)4、实现网站不刷新页面操作期间整个页面,并可以在浏览器中显示前进和后退时正确响应。给出你的技术实现方案?第一步是使用pushState+ajax实现浏览器的前进后退无刷新。当ajax调用成功时,我们将在历史对象中添加一条状态记录。在第二步中,状态记录包含url、title和content属性。在popstate事件中可以获取state对象,我们可以使用content来传递数据。第三步,我们通过监听window.onpopstate事件来响应浏览器的前进后退操作。使用pushState有两个问题。一是打开首页没有记录。我们可以使用replaceState来替换首页的记录。另外一个问题就是当一个页面刷新的时候,还是会向服务器请求数据,所以如果请求的url需要后端的配合才能重定向到一个页面。更多参考:http://blog.chenxu.me/post/detail?id=ed4f0732-897f-48e4-9d4f-821e82f17fad5。如何优化SPA应用首屏加载速度慢?通过script标签导入公共JS库,减小app.bundel体积,让浏览器并行下载资源文件,提高下载速度;配置路由时,采用懒加载方式引入页面和组件,进一步缩小应用体积。bundle的大小,调用某个组件时加载对应的js文件;在根目录下插入loading或skeletonscreenprerender-spa-plugin,提升用户体验;如果页面在webview中,可以预加载页面并独立打包异步组件PublicBundle提高复用性和缓存命中率静态文件本地缓存,有两种方式:HTTP缓存,设置响应头如Cache-Control,Last-Modified,EtagandServiceWorkerofflinecachewithPWAusingSSRrootInsertloadingorskeletonscreenprerender-spa-plugin使用TreeShaking减少业务代码大小更多参考:https://github.com/LuckyWinty/fe-weekly-问题/问题/696。创建Reflect对象的目的?把Object对象的一些明显是语言内部的方法(比如Object.defineProperty)放在Reflect对象上。修改一些Object方法的返回结果,使其更合理。让对象操作成为功能行为。Reflect对象的方法与Proxy对象的方法是一一对应的。只要是Proxy对象的方法,在Reflect对象上都能找到对应的方法。这使得Proxy对象可以方便地调用相应的Reflect方法来完成默认行为,作为修改行为的依据。也就是说,无论Proxy如何修改默认行为,你总能在Reflect上得到默认行为。7.什么是内部属性[[Class]]?所有typeof返回“object”的对象(比如数组)都包含一个内部属性[[Class]](我们可以认为它是一个内部类,而不是传统面向对象意义上的类)。该属性不能直接访问,一般通过Object.prototype.toString(..)查看。例如:Object.prototype.toString.call([1,2,3]);//[objectArray]"Object.prototype.toString.call(/regex-literal/i);//[objectRegExp]"majority在某些情况下,对象的内部[[class]]属性对应于创建该对象的内置原生构造函数,但并非总是如此。2、基本类型值的[[class]]属性虽然Null()和Undefined()等原生构造函数不存在,但内部的[[class]]属性仍然是“Null”和“Undefined”。console.log(Object.prototype.toString.call(null));//[objectNull]console.log(Object.prototype.toString.call(undefined));//[objectUndefined]其他基本类型值不同不同:console.log(Object.prototype.toString.call("abc"));//[objectString]console.log(Object.prototype.toString.call(42));//[objectNumber]console.log(Object.prototype.toString.call(true));//[objectBoolean]基本类型值自动被各自的封装对象包裹起来,所以它们内部的[[class]]属性是"String","Number"和"布尔值”。3、封装对象由于基本类型值没有.length、.toString()等属性和方法,所以需要通过封装对象来访问。这时候Javascript引擎会自动为基本类型值包装一个封装对象。//封装对象包装varb='abc';cons一般不直接typevalue),更喜欢使用基本类型值如"abc"和"42"而不是newString("abc")和newNumber(42)。4.解包如果想获取封装对象中的基本类型值,可以使用valueOf()函数。```js//对封装对象的解封装vars=newString("abc");varn=newNumber(42);varb=newBool??ean(true);console.log(s.valueOf());console.log(n.的价值());console.log(b.valueOf());8.什么是堆?什么是堆栈?它们之间有什么区别和联系?堆和栈的概念存在于数据结构和操作系统内存中。在数据结构中,栈中数据的访问方式是先进后出。堆是一个优先级队列,按照优先级排序,可以根据大小指定优先级。完全二叉树是堆的一种实现。在操作系统中,内存分为栈区和堆区。栈区中的内存由编译器自动分配和释放,用于存放函数参数值、局部变量值等,其运行方式类似于数据结构中的栈。堆区的内存一般由程序员分配和释放。如果程序员不释放,可能会在程序结束时被垃圾回收机制回收。详情请参考:《什么是堆?什么是栈?他们之间有什么区别和联系?》9。isNaN和Number.isNaN函数有什么区别?函数isNaN接收到参数后,会尝试将参数转化为数值,凡是不能转化为数值的值都会返回true,所以输入非数值也会返回true,这会影响NaN的判断。函数Number.isNaN会先判断传入的参数是否为数字,如果是数字则继续判断是否为NaN。这种方法对于NaN的判断比较准确。10.什么时候会发生布尔值的隐式强制转换?(1)if(..)语句中的条件判断表达式。(2)for(..;..;..)语句中的条件判断表达式(第二个)。(3)while(..)和do..while(..)循环中的条件判断表达式。(4)?:中的条件判断表达式。(5)逻辑运算符||(逻辑或)和&&(逻辑与)左操作数(作为条件判断表达式)。11.undefined和undeclared有什么区别?已在范围内声明但尚未分配值的变量是未定义的。相反,未在范围内声明的变量是未声明的。对于未声明变量的引用,浏览器会报引用错误,比如ReferenceError:bisnotdefined。但是我们可以利用typeof的安全机制来避免报错,因为对于未声明(或未定义)的变量,typeof会返回“undefined”。12.如何封装一个javascript类型判断函数?functiongetType(value){//判断数据为nullif(value===null){returnvalue+"";}//判断数据为引用类型if(typeofvalue==="object"){letvalueClass=Object.prototype.toString.call(value),type=valueClass.split("")[1].split("");type.pop();returntype.join("").toLowerCase();}else{//判断数据是基本数据类型的情况和函数returntypeofvalue的情况}}