当前位置: 首页 > news >正文

山东网站建设培训驻马店网络

山东网站建设培训,驻马店网络,深圳住房和建设局官网网站,wordpress 自定义二级菜单前端面试题库 #xff08;面试必备#xff09; 推荐#xff1a;★★★★★ 地址#xff1a;前端面试题库 typeof null 的结果是什么#xff0c;为什么#xff1f; typeof null 的结果是Object。 在 JavaScript 第一个版本中#xff0c;所有值都存储在 32…前端面试题库 面试必备            推荐★★★★★ 地址前端面试题库 typeof null 的结果是什么为什么 typeof null 的结果是Object。 在 JavaScript 第一个版本中所有值都存储在 32 位的单元中每个单元包含一个小的 类型标签(1-3 bits) 以及当前要存储值的真实数据。类型标签存储在每个单元的低位中共有五种数据类型 000: object - 当前存储的数据指向一个对象。1: int - 当前存储的数据是一个 31 位的有符号整数。 010: double - 当前存储的数据指向一个双精度的浮点数。 100: string - 当前存储的数据指向一个字符串。 110: boolean - 当前存储的数据是布尔值。 如果最低位是 1则类型标签标志位的长度只有一位如果最低位是 0则类型标签标志位的长度占三位为存储其他四种数据类型提供了额外两个 bit 的长度。 有两种特殊数据类型 undefined的值是 (-2)30(一个超出整数范围的数字)null 的值是机器码 NULL 指针(null 指针的值全是 0) 那也就是说null的类型标签也是000和Object的类型标签一样所以会被判定为Object。 常见浏览器所用内核 1 IE 浏览器内核Trident 内核也是俗称的 IE 内核 2 Chrome 浏览器内核统称为 Chromium 内核或 Chrome 内核以前是 Webkit 内核现在是 Blink内核 3 Firefox 浏览器内核Gecko 内核俗称 Firefox 内核 4 Safari 浏览器内核Webkit 内核 5 Opera 浏览器内核最初是自己的 Presto 内核后来加入谷歌大军从 Webkit 又到了 Blink 内核 6 360浏览器、猎豹浏览器内核IE Chrome 双内核 7 搜狗、遨游、QQ 浏览器内核Trident兼容模式 Webkit高速模式 8 百度浏览器、世界之窗内核IE 内核 9 2345浏览器内核好像以前是 IE 内核现在也是 IE Chrome 双内核了 10UC 浏览器内核这个众口不一UC 说是他们自己研发的 U3 内核但好像还是基于 Webkit 和 Trident 还有说是基于火狐内核。 一个 tcp 连接能发几个 http 请求 如果是 HTTP 1.0 版本协议一般情况下不支持长连接因此在每次请求发送完毕之后TCP 连接即会断开因此一个 TCP 发送一个 HTTP 请求但是有一种情况可以将一条 TCP 连接保持在活跃状态那就是通过 Connection 和 Keep-Alive 首部在请求头带上 Connection: Keep-Alive并且可以通过 Keep-Alive 通用首部中指定的用逗号分隔的选项调节 keep-alive 的行为如果客户端和服务端都支持那么其实也可以发送多条不过此方式也有限制可以关注《HTTP 权威指南》4.5.5 节对于 Keep-Alive 连接的限制和规则。 而如果是 HTTP 1.1 版本协议支持了长连接因此只要 TCP 连接不断开便可以一直发送 HTTP 请求持续不断没有上限 同样如果是 HTTP 2.0 版本协议支持多用复用一个 TCP 连接是可以并发多个 HTTP 请求的同样也是支持长连接因此只要不断开 TCP 的连接HTTP 请求数也是可以没有上限地持续发送 对浏览器的理解 浏览器的主要功能是将用户选择的 web 资源呈现出来它需要从服务器请求资源并将其显示在浏览器窗口中资源的格式通常是 HTML也包括 PDF、image 及其他格式。用户用 URIUniform Resource Identifier 统一资源标识符来指定所请求资源的位置。 HTML 和 CSS 规范中规定了浏览器解释 html 文档的方式由 W3C 组织对这些规范进行维护W3C 是负责制定 web 标准的组织。但是浏览器厂商纷纷开发自己的扩展对规范的遵循并不完善这为 web 开发者带来了严重的兼容性问题。 浏览器可以分为两部分shell 和 内核。其中 shell 的种类相对比较多内核则比较少。也有一些浏览器并不区分外壳和内核。从 Mozilla 将 Gecko 独立出来后才有了外壳和内核的明确划分。 shell 是指浏览器的外壳例如菜单工具栏等。主要是提供给用户界面操作参数设置等等。它是调用内核来实现各种功能的。内核是浏览器的核心。内核是基于标记语言显示内容的程序或模块。 深浅拷贝 1. 浅拷贝的原理和实现 自己创建一个新的对象来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型复制的就是基本类型的值给新对象但如果属性是引用数据类型复制的就是内存中的地址如果其中一个对象改变了这个内存中的地址肯定会影响到另一个对象 方法一object.assign object.assign是 ES6 中 object 的一个方法该方法可以用于 JS 对象的合并等多个用途其中一个用途就是可以进行浅拷贝。该方法的第一个参数是拷贝的目标对象后面的参数是拷贝的来源对象也可以是多个来源。 object.assign 的语法为Object.assign(target, ...sources)object.assign 的示例代码如下 let target {}; let source { a: { b: 1 } }; Object.assign(target, source); console.log(target); // { a: { b: 1 } };但是使用 object.assign 方法有几点需要注意 它不会拷贝对象的继承属性它不会拷贝对象的不可枚举的属性可以拷贝 Symbol 类型的属性。 let obj1 { a:{ b:1 }, sym:Symbol(1)}; Object.defineProperty(obj1, innumerable ,{value:不可枚举属性,enumerable:false }); let obj2 {}; Object.assign(obj2,obj1) obj1.a.b 2; console.log(obj1,obj1); console.log(obj2,obj2);从上面的样例代码中可以看到利用 object.assign 也可以拷贝 Symbol 类型的对象但是如果到了对象的第二层属性 obj1.a.b 这里的时候前者值的改变也会影响后者的第二层属性的值说明其中依旧存在着访问共同堆内存的问题也就是说这种方法还不能进一步复制而只是完成了浅拷贝的功能 方法二扩展运算符方式 我们也可以利用 JS 的扩展运算符在构造对象的同时完成浅拷贝的功能。扩展运算符的语法为let cloneObj { ...obj }; /* 对象的拷贝 */ let obj {a:1,b:{c:1}} let obj2 {...obj} obj.a 2 console.log(obj) //{a:2,b:{c:1}} console.log(obj2); //{a:1,b:{c:1}} obj.b.c 2 console.log(obj) //{a:2,b:{c:2}} console.log(obj2); //{a:1,b:{c:2}} /* 数组的拷贝 */ let arr [1, 2, 3]; let newArr [...arr]; //跟arr.slice()是一样的效果扩展运算符 和 object.assign 有同样的缺陷也就是实现的浅拷贝的功能差不多但是如果属性都是基本类型的值使用扩展运算符进行浅拷贝会更加方便 方法三concat 拷贝数组 数组的 concat 方法其实也是浅拷贝所以连接一个含有引用类型的数组时需要注意修改原数组中的元素的属性因为它会影响拷贝之后连接的数组。不过 concat 只能用于数组的浅拷贝使用场景比较局限。代码如下所示。 let arr [1, 2, 3]; let newArr arr.concat(); newArr[1] 100; console.log(arr); // [ 1, 2, 3 ] console.log(newArr); // [ 1, 100, 3 ]方法四slice 拷贝数组 slice 方法也比较有局限性因为它仅仅针对数组类型。slice方法会返回一个新的数组对象这一对象由该方法的前两个参数来决定原数组截取的开始和结束时间是不会影响和改变原始数组的。 slice 的语法为arr.slice(begin, end);let arr [1, 2, {val: 4}]; let newArr arr.slice(); newArr[2].val 1000; console.log(arr); //[ 1, 2, { val: 1000 } ]从上面的代码中可以看出这就是浅拷贝的限制所在了——它只能拷贝一层对象。如果存在对象的嵌套那么浅拷贝将无能为力。因此深拷贝就是为了解决这个问题而生的它能解决多层对象嵌套问题彻底实现拷贝 手工实现一个浅拷贝 根据以上对浅拷贝的理解如果让你自己实现一个浅拷贝大致的思路分为两点 对基础类型做一个最基本的一个拷贝对引用类型开辟一个新的存储并且拷贝一层对象属性。 const shallowClone (target) {if (typeof target object target ! null) {const cloneTarget Array.isArray(target) ? []: {};for (let prop in target) {if (target.hasOwnProperty(prop)) {cloneTarget[prop] target[prop];}}return cloneTarget;} else {return target;} }利用类型判断针对引用类型的对象进行 for 循环遍历对象属性赋值给目标对象的属性基本就可以手工实现一个浅拷贝的代码了 2. 深拷贝的原理和实现 浅拷贝只是创建了一个新的对象复制了原有对象的基本类型的值而引用数据类型只拷贝了一层属性再深层的还是无法进行拷贝。深拷贝则不同对于复杂引用数据类型其在堆内存中完全开辟了一块内存地址并将原有的对象完全复制过来存放。 这两个对象是相互独立、不受影响的彻底实现了内存上的分离。总的来说深拷贝的原理可以总结如下 将一个对象从内存中完整地拷贝出来一份给目标对象并从堆内存中开辟一个全新的空间存放新对象且新对象的修改并不会改变原对象二者实现真正的分离。 方法一乞丐版JSON.stringify JSON.stringify() 是目前开发过程中最简单的深拷贝方法其实就是把一个对象序列化成为 JSON 的字符串并将对象里面的内容转换成字符串最后再用 JSON.parse() 的方法将 JSON 字符串生成一个新的对象 let a {age: 1,jobs: {first: FE} } let b JSON.parse(JSON.stringify(a)) a.jobs.first native console.log(b.jobs.first) // FE但是该方法也是有局限性的  会忽略 undefined会忽略 symbol不能序列化函数无法拷贝不可枚举的属性无法拷贝对象的原型链拷贝 RegExp 引用类型会变成空对象拷贝 Date 引用类型会变成字符串对象中含有 NaN、Infinity 以及 -InfinityJSON 序列化的结果会变成 null不能解决循环引用的对象即对象成环 (obj[key] obj)。 function Obj() { this.func function () { alert(1) }; this.obj {a:1};this.arr [1,2,3];this.und undefined; this.reg /123/; this.date new Date(0); this.NaN NaN;this.infinity Infinity;this.sym Symbol(1); } let obj1 new Obj(); Object.defineProperty(obj1,innumerable,{ enumerable:false,value:innumerable }); console.log(obj1,obj1); let str JSON.stringify(obj1); let obj2 JSON.parse(str); console.log(obj2,obj2);使用 JSON.stringify 方法实现深拷贝对象虽然到目前为止还有很多无法实现的功能但是这种方法足以满足日常的开发需求并且是最简单和快捷的。而对于其他的也要实现深拷贝的比较麻烦的属性对应的数据类型JSON.stringify 暂时还是无法满足的那么就需要下面的几种方法了 方法二基础版手写递归实现 下面是一个实现 deepClone 函数封装的例子通过 for in 遍历传入参数的属性值如果值是引用类型则再次递归调用该函数如果是基础数据类型就直接复制 let obj1 {a:{b:1} } function deepClone(obj) { let cloneObj {}for(let key in obj) { //遍历if(typeof obj[key] object) { cloneObj[key] deepClone(obj[key]) //是对象就再次调用该函数递归} else {cloneObj[key] obj[key] //基本类型的话直接复制值}}return cloneObj } let obj2 deepClone(obj1); obj1.a.b 2; console.log(obj2); // {a:{b:1}}虽然利用递归能实现一个深拷贝但是同上面的 JSON.stringify 一样还是有一些问题没有完全解决例如 这个深拷贝函数并不能复制不可枚举的属性以及 Symbol 类型这种方法只是针对普通的引用类型的值做递归复制而对于 Array、Date、RegExp、Error、Function 这样的引用类型并不能正确地拷贝对象的属性里面成环即循环引用没有解决。 这种基础版本的写法也比较简单可以应对大部分的应用情况。但是你在面试的过程中如果只能写出这样的一个有缺陷的深拷贝方法有可能不会通过。 所以为了“拯救”这些缺陷下面我带你一起看看改进的版本以便于你可以在面试种呈现出更好的深拷贝方法赢得面试官的青睐。 方法三改进版改进后递归实现 针对上面几个待解决问题我先通过四点相关的理论告诉你分别应该怎么做。 针对能够遍历对象的不可枚举属性以及 Symbol 类型我们可以使用 Reflect.ownKeys 方法当参数为 Date、RegExp 类型则直接生成一个新的实例返回利用 Object 的 getOwnPropertyDescriptors 方法可以获得对象的所有属性以及对应的特性顺便结合 Object.create 方法创建一个新对象并继承传入原对象的原型链利用 WeakMap 类型作为 Hash 表因为 WeakMap 是弱引用类型可以有效防止内存泄漏你可以关注一下 Map 和 weakMap 的关键区别这里要用 weakMap作为检测循环引用很有帮助如果存在循环则引用直接返回 WeakMap 存储的值 如果你在考虑到循环引用的问题之后还能用 WeakMap 来很好地解决并且向面试官解释这样做的目的那么你所展示的代码以及你对问题思考的全面性在面试官眼中应该算是合格的了 实现深拷贝 const isComplexDataType obj (typeof obj object || typeof obj function) (obj ! null)const deepClone function (obj, hash new WeakMap()) {if (obj.constructor Date) {return new Date(obj) // 日期对象直接返回一个新的日期对象}if (obj.constructor RegExp){return new RegExp(obj) //正则对象直接返回一个新的正则对象}//如果循环引用了就用 weakMap 来解决if (hash.has(obj)) {return hash.get(obj)}let allDesc Object.getOwnPropertyDescriptors(obj)//遍历传入参数所有键的特性let cloneObj Object.create(Object.getPrototypeOf(obj), allDesc)// 把cloneObj原型复制到obj上hash.set(obj, cloneObj)for (let key of Reflect.ownKeys(obj)) { cloneObj[key] (isComplexDataType(obj[key]) typeof obj[key] ! function) ? deepClone(obj[key], hash) : obj[key]}return cloneObj }// 下面是验证代码 let obj {num: 0,str: ,boolean: true,unf: undefined,nul: null,obj: { name: 我是一个对象, id: 1 },arr: [0, 1, 2],func: function () { console.log(我是一个函数) },date: new Date(0),reg: new RegExp(/我是一个正则/ig),[Symbol(1)]: 1, }; Object.defineProperty(obj, innumerable, {enumerable: false, value: 不可枚举属性 } ); obj Object.create(obj, Object.getOwnPropertyDescriptors(obj)) obj.loop obj // 设置loop成循环引用的属性 let cloneObj deepClone(obj) cloneObj.arr.push(4) console.log(obj, obj) console.log(cloneObj, cloneObj)我们看一下结果cloneObj 在 obj 的基础上进行了一次深拷贝cloneObj 里的 arr 数组进行了修改并未影响到 obj.arr 的变化如下图所示 点击刷新按钮或者按 F5、按 CtrlF5 强制刷新、地址栏回车有什么区别 点击刷新按钮或者按 F5 浏览器直接对本地的缓存文件过期但是会带上If-Modifed-SinceIf-None-Match这就意味着服务器会对文件检查新鲜度返回结果可能是 304也有可能是 200。用户按 CtrlF5强制刷新 浏览器不仅会对本地文件过期而且不会带上 If-Modifed-SinceIf-None-Match相当于之前从来没有请求过返回结果是 200。地址栏回车 浏览器发起请求按照正常流程本地检查是否过期然后服务器检查新鲜度最后返回内容。 参考 前端进阶面试题详细解答 对this对象的理解 this 是执行上下文中的一个属性它指向最后一次调用这个方法的对象。在实际开发中this 的指向可以通过四种调用模式来判断。 第一种是函数调用模式当一个函数不是一个对象的属性时直接作为函数来调用时this 指向全局对象。第二种是方法调用模式如果一个函数作为一个对象的方法来调用时this 指向这个对象。第三种是构造器调用模式如果一个函数用 new 调用时函数执行前会新创建一个对象this 指向这个新创建的对象。第四种是 apply 、 call 和 bind 调用模式这三个方法都可以显示的指定调用函数的 this 指向。其中 apply 方法接收两个参数一个是 this 绑定的对象一个是参数数组。call 方法接收的参数第一个是 this 绑定的对象后面的其余参数是传入函数执行的参数。也就是说在使用 call() 方法时传递给函数的参数必须逐个列举出来。bind 方法通过传入一个对象返回一个 this 绑定了传入对象的新函数。这个函数的 this 指向除了使用 new 时会被改变其他情况下都不会改变。 这四种方式使用构造器调用模式的优先级最高然后是 apply、call 和 bind 调用模式然后是方法调用模式然后是函数调用模式。 常见的浏览器内核比较 Trident 这种浏览器内核是 IE 浏览器用的内核因为在早期 IE 占有大量的市场份额所以这种内核比较流行以前有很多网页也是根据这个内核的标准来编写的但是实际上这个内核对真正的网页标准支持不是很好。但是由于 IE 的高市场占有率微软也很长时间没有更新 Trident 内核就导致了 Trident 内核和 W3C 标准脱节。还有就是 Trident 内核的大量 Bug 等安全问题没有得到解决加上一些专家学者公开自己认为 IE 浏览器不安全的观点使很多用户开始转向其他浏览器。Gecko 这是 Firefox 和 Flock 所采用的内核这个内核的优点就是功能强大、丰富可以支持很多复杂网页效果和浏览器扩展接口但是代价是也显而易见就是要消耗很多的资源比如内存。Presto Opera 曾经采用的就是 Presto 内核Presto 内核被称为公认的浏览网页速度最快的内核这得益于它在开发时的天生优势在处理 JS 脚本等脚本语言时会比其他的内核快3倍左右缺点就是为了达到很快的速度而丢掉了一部分网页兼容性。Webkit Webkit 是 Safari 采用的内核它的优点就是网页浏览速度较快虽然不及 Presto 但是也胜于 Gecko 和 Trident缺点是对于网页代码的容错性不高也就是说对网页代码的兼容性较低会使一些编写不标准的网页无法正确显示。WebKit 前身是 KDE 小组的 KHTML 引擎可以说 WebKit 是 KHTML 的一个开源的分支。Blink 谷歌在 Chromium Blog 上发表博客称将与苹果的开源浏览器核心 Webkit 分道扬镳在 Chromium 项目中研发 Blink 渲染引擎即浏览器核心内置于 Chrome 浏览器之中。其实 Blink 引擎就是 Webkit 的一个分支就像 webkit 是KHTML 的分支一样。Blink 引擎现在是谷歌公司与 Opera Software 共同研发上面提到过的Opera 弃用了自己的 Presto 内核加入 Google 阵营跟随谷歌一起研发 Blink。 Virtual Dom 的优势在哪里 Virtual Dom 的优势」其实这道题目面试官更想听到的答案不是上来就说「直接操作/频繁操作 DOM 的性能差」如果 DOM 操作的性能如此不堪那么 jQuery 也不至于活到今天。所以面试官更想听到 VDOM 想解决的问题以及为什么频繁的 DOM 操作会性能差。 首先我们需要知道 DOM 引擎、JS 引擎 相互独立但又工作在同一线程主线程 JS 代码调用 DOM API 必须 挂起 JS 引擎、转换传入参数数据、激活 DOM 引擎DOM 重绘后再转换可能有的返回值最后激活 JS 引擎并继续执行若有频繁的 DOM API 调用且浏览器厂商不做“批量处理”优化 引擎间切换的单位代价将迅速积累若其中有强制重绘的 DOM API 调用重新计算布局、重新绘制图像会引起更大的性能消耗。 其次是 VDOM 和真实 DOM 的区别和优化 虚拟 DOM 不会立马进行排版与重绘操作虚拟 DOM 进行频繁修改然后一次性比较并修改真实 DOM 中需要改的部分最后在真实 DOM 中进行排版与重绘减少过多DOM节点排版与重绘损耗虚拟 DOM 有效降低大面积真实 DOM 的重绘与排版因为最终与真实 DOM 比较差异可以只渲染局部 画一条0.5px的线 采用transform: scale()的方式该方法用来定义元素的2D 缩放转换 transform: scale(0.5,0.5); 采用meta viewport的方式 meta nameviewport contentwidthdevice-width, initial-scale0.5, minimum-scale0.5, maximum-scale0.5/ 这样就能缩放到原来的0.5倍如果是1px那么就会变成0.5px。viewport只针对于移动端只在移动端上才能看到效果 CSS 如何阻塞文档解析 理论上既然样式表不改变 DOM 树也就没有必要停下文档的解析等待它们。然而存在一个问题JavaScript 脚本执行时可能在文档的解析过程中请求样式信息如果样式还没有加载和解析脚本将得到错误的值显然这将会导致很多问题。所以如果浏览器尚未完成 CSSOM 的下载和构建而我们却想在此时运行脚本那么浏览器将延迟 JavaScript 脚本执行和文档的解析直至其完成 CSSOM 的下载和构建。也就是说在这种情况下浏览器会先下载和构建 CSSOM然后再执行 JavaScript最后再继续文档的解析。 冒泡排序--时间复杂度 n^2 题目描述:实现一个冒泡排序 实现代码如下: function bubbleSort(arr) {// 缓存数组长度const len arr.length;// 外层循环用于控制从头到尾的比较交换到底有多少轮for (let i 0; i len; i) {// 内层循环用于完成每一轮遍历过程中的重复比较交换for (let j 0; j len - 1; j) {// 若相邻元素前面的数比后面的大if (arr[j] arr[j 1]) {// 交换两者[arr[j], arr[j 1]] [arr[j 1], arr[j]];}}}// 返回数组return arr; } // console.log(bubbleSort([3, 6, 2, 4, 1])); 代码输出结果 var obj {say: function() {var f1 () {console.log(1111, this);}f1();},pro: {getPro:() {console.log(this);}} } var o obj.say; o(); obj.say(); obj.pro.getPro(); 输出结果 1111 window对象 1111 obj对象 window对象 解析 o()o是在全局执行的而f1是箭头函数它是没有绑定this的它的this指向其父级的this其父级say方法的this指向的是全局作用域所以会打印出windowobj.say()谁调用saysay 的this就指向谁所以此时this指向的是obj对象obj.pro.getPro()我们知道箭头函数时不绑定this的getPro处于pro中而对象不构成单独的作用域所以箭头的函数的this就指向了全局作用域window。 JSONP JSONP 核心原理script 标签不受同源策略约束所以可以用来进行跨域请求优点是兼容性好但是只能用于 GET 请求 const jsonp ({ url, params, callbackName }) {const generateUrl () {let dataSrc for (let key in params) {if (params.hasOwnProperty(key)) {dataSrc ${key}${params[key]}}}dataSrc callback${callbackName}return ${url}?${dataSrc}}return new Promise((resolve, reject) {const scriptEle document.createElement(script)scriptEle.src generateUrl()document.body.appendChild(scriptEle)window[callbackName] data {resolve(data)document.removeChild(scriptEle)}}) } HTTP 1.0 和 HTTP 1.1 之间有哪些区别 HTTP 1.0和 HTTP 1.1 有以下区别 连接方面http1.0 默认使用非持久连接而 http1.1 默认使用持久连接。http1.1 通过使用持久连接来使多个 http 请求复用同一个 TCP 连接以此来避免使用非持久连接时每次需要建立连接的时延。资源请求方面在 http1.0 中存在一些浪费带宽的现象例如客户端只是需要某个对象的一部分而服务器却将整个对象送过来了并且不支持断点续传功能http1.1 则在请求头引入了 range 头域它允许只请求资源的某个部分即返回码是 206Partial Content这样就方便了开发者自由的选择以便于充分利用带宽和连接。缓存方面在 http1.0 中主要使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准http1.1 则引入了更多的缓存控制策略例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。http1.1 中新增了 host 字段用来指定服务器的域名。http1.0 中认为每台服务器都绑定一个唯一的 IP 地址因此请求消息中的 URL 并没有传递主机名hostname。但随着虚拟主机技术的发展在一台物理服务器上可以存在多个虚拟主机并且它们共享一个IP地址。因此有了 host 字段这样就可以将请求发往到同一台服务器上的不同网站。http1.1 相对于 http1.0 还新增了很多请求方法如 PUT、HEAD、OPTIONS 等。 call() 和 apply() 的区别 它们的作用一模一样区别仅在于传入参数的形式的不同。 apply 接受两个参数第一个参数指定了函数体内 this 对象的指向第二个参数为一个带下标的集合这个集合可以为数组也可以为类数组apply 方法把这个集合中的元素作为参数传递给被调用的函数。call 传入的参数数量不固定跟 apply 相同的是第一个参数也是代表函数体内的 this 指向从第二个参数开始往后每个参数被依次传入函数。 let、const、var的区别 1块级作用域 块作用域由 { }包括let和const具有块级作用域var不存在块级作用域。块级作用域解决了ES5中的两个问题 内层变量可能覆盖外层变量用来计数的循环变量泄露为全局变量 2变量提升 var存在变量提升let和const不存在变量提升即在变量只能在声明之后使用否在会报错。 3给全局添加属性 浏览器的全局对象是windowNode的全局对象是global。var声明的变量为全局变量并且会将该变量添加为全局对象的属性但是let和const不会。 4重复声明 var声明变量时可以重复声明变量后声明的同名变量会覆盖之前声明的遍历。const和let不允许重复声明变量。 5暂时性死区 在使用let、const命令声明变量之前该变量都是不可用的。这在语法上称为暂时性死区。使用var声明的变量不存在暂时性死区。 6初始值设置 在变量声明时var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。 7指针指向 let和const都是ES6新增的用于创建变量的语法。 let创建的变量是可以更改指针指向可以重新赋值。但const声明的变量是不允许改变指针的指向。 区别varletconst是否有块级作用域×✔️✔️是否存在变量提升✔️××是否添加全局属性✔️××能否重复声明变量✔️××是否存在暂时性死区×✔️✔️是否必须设置初始值××✔️能否改变指针指向✔️✔️× 有哪些可能引起前端安全的问题? 跨站脚本 (Cross-Site Scripting, XSS): ⼀种代码注⼊⽅式, 为了与 CSS 区分所以被称作 XSS。早期常⻅于⽹络论坛, 起因是⽹站没有对⽤户的输⼊进⾏严格的限制, 使得攻击者可以将脚本上传到帖⼦让其他⼈浏览到有恶意脚本的⻚⾯, 其注⼊⽅式很简单包括但不限于 JavaScript / CSS / Flash 等iframe的滥⽤: iframe中的内容是由第三⽅来提供的默认情况下他们不受控制他们可以在iframe中运⾏JavaScirpt脚本、Flash插件、弹出对话框等等这可能会破坏前端⽤户体验跨站点请求伪造Cross-Site Request ForgeriesCSRF: 指攻击者通过设置好的陷阱强制对已完成认证的⽤户进⾏⾮预期的个⼈信息或设定信息等某些状态更新属于被动攻击恶意第三⽅库: ⽆论是后端服务器应⽤还是前端应⽤开发绝⼤多数时候都是在借助开发框架和各种类库进⾏快速开发⼀旦第三⽅库被植⼊恶意代码很容易引起安全问题。 如何优化动画 对于如何优化动画我们知道一般情况下动画需要频繁的操作DOM就就会导致页面的性能问题我们可以将动画的position属性设置为absolute或者fixed将动画脱离文档流这样他的回流就不会影响到页面了。 选择排序--时间复杂度 n^2 题目描述:实现一个选择排序 实现代码如下: function selectSort(arr) {// 缓存数组长度const len arr.length;// 定义 minIndex缓存当前区间最小值的索引注意是索引let minIndex;// i 是当前排序区间的起点for (let i 0; i len - 1; i) {// 初始化 minIndex 为当前区间第一个元素minIndex i;// i、j分别定义当前区间的上下界i是左边界j是右边界for (let j i; j len; j) {// 若 j 处的数据项比当前最小值还要小则更新最小值索引为 jif (arr[j] arr[minIndex]) {minIndex j;}}// 如果 minIndex 对应元素不是目前的头部元素则交换两者if (minIndex ! i) {[arr[i], arr[minIndex]] [arr[minIndex], arr[i]];}}return arr; } // console.log(quickSort([3, 6, 2, 4, 1]));前端面试题库 面试必备            推荐★★★★★ 地址前端面试题库
http://wiki.neutronadmin.com/news/318209/

相关文章:

  • 网站建立的步骤是c语言也能干大事网站开发
  • 福州做网站制作帝国cms调用网站名称
  • 佛山网站设计公司idea做百度网站
  • 网站开发需要什么基础只是win7 iis 新建网站
  • 市桥有经验的网站建设wordpress图片搬家
  • 网站认证打款怎么做分录wordpress增加互动
  • 重庆seo整站优化服务上海公司核名查询
  • 哪个网站可以自己做名片淮南电商网站建设价格
  • linux国外网站吗房地产最新消息是涨还是跌
  • 如何做网站微信支付中小学生做的网站
  • 哪些网站做的最有特色陕西住建电子证书查询
  • 网站开发与维护的工作内容设计教学网站推荐
  • 字体设计欣赏网站商丘市住房和城乡建设局网站
  • 峰峰专业做网站wordpress主页导航
  • 做网站用方正字体可以额的去香洲会变黄码吗
  • 电子网站手机网站开发c
  • 杭州网站开发公司排名网站展现形式
  • wordpress建站是什么vi公司设计包括哪些
  • 房地产网站建设方案建设英文网站要求
  • 如何做网站方案网站制作怎么做下拉菜单
  • 做外贸必须用的社交网站重庆人居建设集团网站
  • 舟山网站seo提供网站建设框架
  • 网站设计结果网站页面下载
  • 微信导航网站模板湖南招聘信息网官网
  • 参考消息官方网站公司开发个网站有哪些
  • 诸暨做网站广告的电话怎么样做网站的目录结构
  • 设计师网站pintsetwordpress加音乐
  • 网站建设软文网站和h5
  • 综合电商网站建设需求文档泰安人才招聘信息网
  • 青岛网站制作哪里有wordpress主题 儿童