2023年6月21日发(作者:)

前端可能问到的⾯试题(ts,js,css,es6),null,undefined,never,NaNvoid:⽆返回值,只能赋值undefined和nullnull:空值,表⽰不存在undefined:未定义,声明了但没有赋值,对象没有赋值的属性,对象没有返回值never:永不存在的值的类型,是抛出异常或根本没有返回值的函数表达式的返回值类型NaN:和任何值都不相等,包括⾃⾝和readonlyconst:修饰的常量是静态属性。声明时必须赋值,赋值后不能再改变,实际上是变量⾄指向的内存地址所保存的数据不改动,对于简单类型,值就保存在变量指向的内存地址。对于复合类型的数据(引⽤类型),const只能保证这个指针是固定的,⾄于指针指向的数据结构是否可变就不能控制。readonly :修饰的常量是动态属性(值在运⾏的时候获得)。可以在声明或构造函数中初始化3.接⼝和泛型接⼝:定义了要遵循的类的语法,实现接⼝的类必须实现它的所有成员。不同类之间公有的属性和⽅法可以抽象为⼀个接⼝泛型:解决类,接⼝,⽅法的复⽤性(传⼊什么类型就返回什么类型),以及对不特定数据类型的⽀持4.匿名函数和箭头函数匿名函数:声明是没有任何命名标识符的函数,在运⾏时动态声明的,可以接受输⼊和返回输出,在初始创建之后通常是不可访问的let fun=function(x:number,y:number):number{ return x+y;}箭头函数:相当于匿名函数并且简化了函数的定义。没有prototype原型,所有箭头函数本⾝没有this,this在箭头函数中已经按照词法作⽤域绑定了,this指向是固定的。没有构造函数箭头函数的this指向该函数所在的作⽤域指向的对象dex(),indexof(),forEach()findindex()对于空数组不执⾏,也不使适⽤于字符串。范围更⼴,可以根据不同条件进⾏查询。返回的是符合查询条件的第⼀个值的索引.let arr = [1, 1, 2, 2, 8, 8,5,4]function check(a) { return a>1}let result = dex(check)(result) //2indexof()返回某个指定的字符串值在字符串中⾸次出现的位置。空数组和字符串都会执⾏。forEach() 对于空数组不执⾏,⽤于调⽤数组的每个元素,并将元素传递给回调函数。6.浏览器重定向页⾯,浏览器打开新页⾯重定向页⾯="/"e("/")打开新页⾯,窗⼝("/")()与slice()splice(2,7) 表⽰从索引2开始的位置,截取7个长度,会返回截取后的数据slice(2,7) 表⽰从索引2开始的位置,截取到6索引的位置(不包含7),不会改变原数组epromise:是⼀个构造函数,可以实例化promise实例。有两个函数resolve(成功时的回调函数)和reject(失败后的回调函数)。在promise的构造函数的prototype属性上有then()⽅法。,em,rempx:像素px是相对于显⽰器屏幕分辨率⽽⾔的。缺点没有弹性,IE可能不兼容em:参考物是⽗元素的font-size,具有继承的特点。相对于当前对象内⽂本的字体尺⼨。如当前对⾏内⽂本的字体尺⼨未被⼈为设置,则相对于浏览器的默认字体尺⼨。rem:rem是相对于根元素html, 不会被它的⽗元素影响选择器标签选择器div 类选择器. id选择器# ⼦类选择器> 兄弟选择器~ 全局选择器* 相邻选择器+ 包含选择器 伪类选择器(:hover nth-child(n):)伪类(before,after)与伪类选择器根本区别:是否创建了新元素on有哪些属性relative:相对于原来位置移动,元素设置此属性之后仍然处在⽂档流中,不影响其他元素的布局absolute:元素会脱离⽂档流,如果设置偏移量,会影响其他元素的位置定位。绝对定位是相对于元素最近的已定位的祖先元素(即是设置了绝对定位或者相对定位的祖先元素)。如果元素没有已定位的祖先元素,那么它的位置则是相对于最初的包含块(body)fixed:相对于浏览器窗⼝,⽣成固定定位inherit:继承⽗元素的position 属性的值static:默认值。没有定位,元素出现在正常的流中sticky:粘性定位,该定位基于⽤户滚动的位置。12.垂直⽔平居中

⽅法⼀ 相对绝对定位 body{ margin: 0px; padding: 0px; } #aaa{ position: relative; width: 500px; height: 500px; background: red; } #bbb{ position:absolute; width: 300px; height: 300px; background: pink; margin: auto; left: 0; right: 0; top: 0; bottom: 0; }⽅法2 flex布局 body { margin: 0px; padding: 0px; } #aaa { display: flex; width: 500px; height: 500px; justify-content: center; align-items: center; background-color: red; } #bbb { width: 300px; height: 300px; background-color: pink; }13.清除浮动⽅法⼀:添加额外标签,并在标签中使⽤clear:both (不推荐)⽅法⼆:添加伪类元素(::after),设置clear:both。注意必须块级元素且IE8以上14.⾏内元素与块级元素块级元素:独占⼀⾏,默认情况下,其宽度⾃动填满其⽗元素宽度块级元素可以设置width,height,margin,padding⾏内元素:不会独占⼀⾏,⾏内元素设置width,height属性⽆效,它的长度⾼度主要根据内容决定。⾏内元素的margin和padding属性⽔平⽅向有效果,垂直⽅向没有效果与ts的区别ts是js的超集。js是脚本语⾔,ts是⾯向对象编程语⾔。ts⽀持可选参数,静态类型,接⼝,js不⽀持。ts在编译时就能报错,js运⾏时才暴报错。ts是强类型语⾔,可以明确知道参数类型。,ajax,fetchaxios 基于promise⽤于浏览器和的http客户端。是对ajax的封装,安全性更⾼。有then链,可以异步编程function Callback(promise: Promise) { return promise .then((data) => { data }) .catch((err) => { err })}function test() { return Callback((""))}fetch只对⽹络请求报错,对400,500都当做成功的请求,需要封装去处理,是原⽣js,没有使⽤XMLHttpRequest对象ajax底层使⽤XMLHttpRequest,Ajax引擎在客户端运⾏,特点是实现局部刷新,⽀持异步请求的技术。不⽀持浏览器back,暴露了与服务器交互的细节XmlHttpRequest可以在使⽤JavaScript向服务器提出请求并处理响应,⽽不阻塞⽤户。通过XMLHttpRequest对象,Web开发⼈员可以在页⾯加载以后进⾏页⾯的局部更新。$.ajax({ type: 'POST', url: url, data: data, dataType: dataType, success: function () {}, error: function () {}});状态码2xx:服务器成功处理请求例如:200 (成功)表⽰客户端发送的请求在服务器被正常的处理了。3xx:状态码⽤于重定向例如:301 永久性重定向,请求的资源被分配了新的URI,以后都使⽤这个。302 临时性重定向,请求的资源被分配了新的URI,本次使⽤这个。4xx:请求错误,客户端或许有错误例如:404 服务器找不到资源 403 请求的资源访问被拒绝5xx:服务器错误例如:500 服务器执⾏请求时发送异常 503 服务器暂时⽆法处理请求18.a标签的href和target属性href属性⽤于指定超链接⽬标的urltarget属性规定在何处打开链接⽂档_blank 在新窗⼝打开链接_self 在当前窗⼝打开链接(默认)_top 在整个窗⼝中打开链接_parent 在⽗框架集中打开链接alt属性规定在图像⽆法显⽰时的替代⽂本title属性规定的是在⿏标以上元素时显⽰的⽂本 in 与 for offor in 适合遍历对象,数组,通常⽤来遍历对象的键名,原型链上所有属性都会呗访问,⽤hasOwnProperty()解决for of (es6)适合遍历树,数组,数组对象,字符串等,通常⽤来遍历键值循环与setTimeout()21.⽹站的登录状态是如何保存的,完整的登录流程是什么?通过cookie保存登录状态。cookie存储token,每次请求到后端服务器都会带上token,从⽽验证⽤户是否登录。1.客户端请求后台登录接⼝。2.后台验证通过后,将⽤户的登录状态保存⾄cookie并写⼊客户端。3.客户端再次登录⽹站,请求login接⼝时,后台直接从客户端获取到该⽤户写⼊cookie的登录状态。4.通过对该状态的验证,确认⽤户是否需要再次登录。5.如cookie过期,则跳转⾄登录页;如未过期,则直接显⽰为已登录状态。E作⽤声明位于⽂档中最前⾯的位置,处于标签之前。可以告知浏览器⽂档使⽤何种规范解析页⾯(html,xhtml),apply,bindlet a=[1,2,3,4,5](,call(null,2,3,4,5,6)) //(,apply(null,[2,3,4,5,6])) //6let b=,bind(null,2,3,4,5,6)b() //6call和apply直接执⾏,bind事先将⽅法的this改为我们想要的结果,需要时再调⽤执⾏。apply的第⼆个参数是以数组形式传⼊的。call和bind以列表参数传递。,hrefhref是元素或⽂档与指定资源联通,需要的时候再引⽤src是下载后嵌⼊构成⽂档直接内容24. get postget:长度限制为2k,参数在url可见,速度更快post:没有长度限制,参数写在请求头⾥⾯,安全性更⾼,速度不如get(因为在第三次握⼿时,会发送post请求头,服务器才会返回100continue ,客户端此时才发送数据。⽽get在第三次握⼿时就已经携带了数据)25.三次握⼿why:为了保证可靠的数据传输,防⽌⽆效的请求⼜发送到服务器。ACK=1 确认号有效SYN=1 请求建⽴连接seq 序列号ack 期望下⼀次接收到的序列号跨域客户端通过script标签的src属性发送请求,并且定义⼀个回调函数。服务器端响应请求后会传⼊参数动态执⾏回调函数,就实现了跨域。因为是script标签,所以返回的数据会直接当作js语⾔执⾏就会产⽣错误,所以需要回调函数的存在,关键是服务器返回的数据外层需要需要包裹⼀层函数react 使⽤代理中间件 http-proxy-middleware实现跨域请求const proxy = require('http-proxy-middleware')const { createProxyMiddleware } = require('http-proxy-middleware');s = function (app) { (createProxyMiddleware('/api',{ target:'localhost:3300', changeOrigin: true }))};,CSRF攻击xss:跨站脚本攻击,利⽤⽹站对⽤户输⼊没有进⾏限制或过滤,从⽽在页⾯中嵌⼊某些代码,当别的⽤户访问到该⽹页时,会执⾏对应的代码,从⽽使得攻击者可以获取。防御:设置Cookie的属性为Http only,这样js就⽆法获取Cookie值CSRF攻击:跨域请求伪造,防御:使⽤随机token或验证码28.浏览器输⼊url到渲染的过程1.⾸先是域名解析,解析到对应的ip地址2.三次握⼿,请求建⽴连接3.发送http请求,服务器响应请求,浏览器获取html源码4.解析html并且构建DOM树5.解析css⽣成css对象模型树和css附着在⼀起呈现reader tree(重排和重绘)7.浏览器计算节点的位置和样式进⾏布局29.重排reflow和重绘repaint重排:元素的规模,位置和隐藏等改变时,都会引起回流。引起重排的条件:⾸次渲染,删除或增加dom元素,元素位置的改变,尺⼨的改变,窗⼝尺⼨的改变,读取某些元素的值。⼀定会引起重绘。重绘:元素的外观改变触发的浏览器⾏为,浏览器会根据元素的新属性重新绘制,呈现新的外观。如:color优化:1.合并多次dom的修改2.直接改变元素的类名,切换类名3.经常进⾏重排的元素设置position:absolute和fixed ,脱离⽂档流,不会影响到其他元素4.避免使⽤table布局,⼀个⼩改动会引起整个table重新布局5.经常访问元素属性的操作时,将属性赋给局部变量进⾏计算。⼀个对象的过程其实是⼀种继承的⽅式, 通过new,实例与构造函数通过原型链连接了起来出来,所以实例能访问到构造函数的属性。改变了构造函数的this指向ps:每个对象的__proto__属性都指向原型对象每个构造函数都有prototype原型对象prototype原型对象⾥都有constructor指向它的构造函数31.盒⼦模型所有的html元素都可以看作为盒模型,即content+padding+border+margin1.标准模型:box-sizing:content-box内容⼤⼩(宽⾼):content的⼤⼩,即width和height设置padding时,content⼤⼩不变,整体变⼤模型:box-sizing:border-box内容⼤⼩:content(width,height)+padding+border因为是包括padding的,所以设置padding时,元素会被挤压,整体不变32.什么是flex布局弹性布局,任何元素都可以指定为flex,随着⽹页的⼤⼩⾃适应布局。采⽤flex布局的元素称为容器,⼦元素称为项⽬。设置了flex之后,float,clear等属性失效。flex(flex-grow、flex-shrink、flex-basis):flex-grow定义项⽬的放⼤⽐例,默认为0,即如果存在剩余空间,也不放⼤flex-shrink 定义了项⽬的缩⼩⽐例,默认为1,即如果空间不⾜,该项⽬将缩⼩flex-basis给上⾯两个属性分配多余空间之前, 计算项⽬是否有多余空间, 默认值为 auto, 即项⽬本⾝的⼤⼩flex:auto代表 1 1 autoflex:1代表 1 1 块级上下⽂,独⽴的渲染区域。区域内部与外部⽆关。BFC中的所有⼦元素的左外边都会与⽗块的左边接触。作⽤:1.防⽌被浮动的元素挡住2.解决margin塌陷的问题。因为同⼀BFC的两个box之间的margin以⼤的为准3.⾃适应两栏布局4.清除浮动(BFC计算⾼度时会包括浮动的⾼度,会清除内部⼦元素浮动的影响,⽗元素在计算其⾼度时,加⼊了浮动元素的⾼度,“顺便”达成了清除浮动的⽬标,所以⽗元素就包裹住了⼦元素)如何创建BFC:不为ow不为on不为static或y是lnline-block,inline-flex,flex,table-cell,和instanceoftypeof⽤来判断基本数据类型,返回的是字符串,但是对于null,object和array返回的都是object。instanceof⼀个变量是否属于某个对象的实例,返回的是Boolean类型,判断某个构造函数的prototype属性是否存在对象的原型链上。下⾯⼿写实现⼀下instanceof⽅法function test_instanceof(L, R) { let LL = L.__proto__ let RR = ype while (true) { if (LL === null) return false if (RR === LL) return true LL=LL.__proto__ }}function t() { }let a = new t()(test_instanceof(a,t)) //(test_instanceof(a,Object)) //true35.构造函数和普通函数的区别构造函数可以⽣成实例对象调⽤⽅式不同:构造函数⽤new关键字调⽤⾸字母⼤⼩写:构造函数⾸字母⼀般⼤写this指向不同:普通函数this指向window,构造函数的this指向创建的实例对象。36.原型,原型对象原型对象:构造函数prototype指向的就是原型对象原型:函数有原型,函数的这个原型指向⼀个对象即原型对象继承1.原型链继承:⽗类的实例充当⼦类的原型对象缺点:⽗类的属性是所有⼦类共享的,不能多继承function father() { }function son() {}ype=new father()2.构造函数继承:借⽤⽗类的构造函数来增强⼦类实例,等于是把⽗类的实例属性复制⼀份给⼦类实例,可以多继承缺点:⽆法实现函数的复⽤,实例并不是⽗类的实例,只是⼦类的实例,只继承⽗类,不继承原型function Super(val){ = val;//可以传递参数 = [1];}function Sub(val){ (this,val);//核⼼代码 //通过call()和apply()⽅法在新创建的对象上执⾏构造函数}3.组合式继承:使⽤原型链实现对原型属性和⽅法的继承,⽽通过构造函数来实现对实例属性的继承。function Parent(name){ = name; = ['red', 'blue', 'green']; } e = function(){ (); } function Child(name,age){ (this,name);//

第⼆次调⽤ Parent() = age; } ype = new Parent(); //

第⼀次调⽤ Parent(),apply,bind第⼀个参数都是this要指向的对象,call第⼆个参数是参数列表的⽅式传⼊,apply第⼆个参数是数组的⽅式传⼊call与apply是⽴即调⽤,bind是返回对应函数,需要时调⽤ function show(x){ (x); } let person={ name:"aa", }; (person,"男"); (person,["⼥"]); let ss=(person,"111"); ss()bind的实现39.深拷贝的实现(ity(obj))ePromise,就是⼀个对象,⽤来传递异步操作的消息,可以进⾏异步操作async await 解决回调地狱,语法糖async function test1(){ ("11") await test() ("22")}test1()new Promise(function (resolve) { ("33") resolve();}).then(function () { ("44")})function test() { ("test")}//11 test 33 22 44macro-task(宏任务):包括整体代码script,setTimeout,setIntervalmicro-task(微任务):,ck补充⼀个41.强缓存和协商缓存浏览器第⼀次向服务器发起请求时,服务器响应请求后,浏览器端会进⾏缓存。服务器会将最后⼀次修改时间last-modified发送给客户端进⾏记录,同时还会⽣成并发送Etag强缓存:浏览器请求资源时,会获取该资源缓存的header信息,根据cache-control判断是否从缓存中获取资源。cache-control:max-age=31536000,public,immutablemax-age:缓存时间(s)public:服务器和浏览器都可以缓存immutable:资源永远改变(⽤户刷新浏览器也不发送请求)协商缓存:浏览器每次请求资源时,向服务器发送请求并且携带header中的Etag和last-modified,服务器判断是否改变,如果改变就返回新的资源和新的etag,last-modified以及200状态码。如果没有改变,返回304状态码,浏览器就读取本地资源。注意服务器端header会改变// response headeretag: '5c20abbd-e2e8'last-modified: Mon, 24 Dec 2018 09:49:49 GMT// request header

变为if-none-matched: '5c20abbd-e2e8'if-modified-since: Mon, 24 Dec 2018 09:49:49 GMT已经有last-modified为什么要使⽤etag1.有些资源的改变在1s内改变多次,last-modified对这种操作⽆法精确2.某些请求是周期性的,没有修改内容,3.某些服务器⽆法精确到最后修改时间()和ity()():⼀个字符串中解析出ity():从⼀个对象中解析出字符串

2023年6月21日发(作者:)

前端可能问到的⾯试题(ts,js,css,es6),null,undefined,never,NaNvoid:⽆返回值,只能赋值undefined和nullnull:空值,表⽰不存在undefined:未定义,声明了但没有赋值,对象没有赋值的属性,对象没有返回值never:永不存在的值的类型,是抛出异常或根本没有返回值的函数表达式的返回值类型NaN:和任何值都不相等,包括⾃⾝和readonlyconst:修饰的常量是静态属性。声明时必须赋值,赋值后不能再改变,实际上是变量⾄指向的内存地址所保存的数据不改动,对于简单类型,值就保存在变量指向的内存地址。对于复合类型的数据(引⽤类型),const只能保证这个指针是固定的,⾄于指针指向的数据结构是否可变就不能控制。readonly :修饰的常量是动态属性(值在运⾏的时候获得)。可以在声明或构造函数中初始化3.接⼝和泛型接⼝:定义了要遵循的类的语法,实现接⼝的类必须实现它的所有成员。不同类之间公有的属性和⽅法可以抽象为⼀个接⼝泛型:解决类,接⼝,⽅法的复⽤性(传⼊什么类型就返回什么类型),以及对不特定数据类型的⽀持4.匿名函数和箭头函数匿名函数:声明是没有任何命名标识符的函数,在运⾏时动态声明的,可以接受输⼊和返回输出,在初始创建之后通常是不可访问的let fun=function(x:number,y:number):number{ return x+y;}箭头函数:相当于匿名函数并且简化了函数的定义。没有prototype原型,所有箭头函数本⾝没有this,this在箭头函数中已经按照词法作⽤域绑定了,this指向是固定的。没有构造函数箭头函数的this指向该函数所在的作⽤域指向的对象dex(),indexof(),forEach()findindex()对于空数组不执⾏,也不使适⽤于字符串。范围更⼴,可以根据不同条件进⾏查询。返回的是符合查询条件的第⼀个值的索引.let arr = [1, 1, 2, 2, 8, 8,5,4]function check(a) { return a>1}let result = dex(check)(result) //2indexof()返回某个指定的字符串值在字符串中⾸次出现的位置。空数组和字符串都会执⾏。forEach() 对于空数组不执⾏,⽤于调⽤数组的每个元素,并将元素传递给回调函数。6.浏览器重定向页⾯,浏览器打开新页⾯重定向页⾯="/"e("/")打开新页⾯,窗⼝("/")()与slice()splice(2,7) 表⽰从索引2开始的位置,截取7个长度,会返回截取后的数据slice(2,7) 表⽰从索引2开始的位置,截取到6索引的位置(不包含7),不会改变原数组epromise:是⼀个构造函数,可以实例化promise实例。有两个函数resolve(成功时的回调函数)和reject(失败后的回调函数)。在promise的构造函数的prototype属性上有then()⽅法。,em,rempx:像素px是相对于显⽰器屏幕分辨率⽽⾔的。缺点没有弹性,IE可能不兼容em:参考物是⽗元素的font-size,具有继承的特点。相对于当前对象内⽂本的字体尺⼨。如当前对⾏内⽂本的字体尺⼨未被⼈为设置,则相对于浏览器的默认字体尺⼨。rem:rem是相对于根元素html, 不会被它的⽗元素影响选择器标签选择器div 类选择器. id选择器# ⼦类选择器> 兄弟选择器~ 全局选择器* 相邻选择器+ 包含选择器 伪类选择器(:hover nth-child(n):)伪类(before,after)与伪类选择器根本区别:是否创建了新元素on有哪些属性relative:相对于原来位置移动,元素设置此属性之后仍然处在⽂档流中,不影响其他元素的布局absolute:元素会脱离⽂档流,如果设置偏移量,会影响其他元素的位置定位。绝对定位是相对于元素最近的已定位的祖先元素(即是设置了绝对定位或者相对定位的祖先元素)。如果元素没有已定位的祖先元素,那么它的位置则是相对于最初的包含块(body)fixed:相对于浏览器窗⼝,⽣成固定定位inherit:继承⽗元素的position 属性的值static:默认值。没有定位,元素出现在正常的流中sticky:粘性定位,该定位基于⽤户滚动的位置。12.垂直⽔平居中

⽅法⼀ 相对绝对定位 body{ margin: 0px; padding: 0px; } #aaa{ position: relative; width: 500px; height: 500px; background: red; } #bbb{ position:absolute; width: 300px; height: 300px; background: pink; margin: auto; left: 0; right: 0; top: 0; bottom: 0; }⽅法2 flex布局 body { margin: 0px; padding: 0px; } #aaa { display: flex; width: 500px; height: 500px; justify-content: center; align-items: center; background-color: red; } #bbb { width: 300px; height: 300px; background-color: pink; }13.清除浮动⽅法⼀:添加额外标签,并在标签中使⽤clear:both (不推荐)⽅法⼆:添加伪类元素(::after),设置clear:both。注意必须块级元素且IE8以上14.⾏内元素与块级元素块级元素:独占⼀⾏,默认情况下,其宽度⾃动填满其⽗元素宽度块级元素可以设置width,height,margin,padding⾏内元素:不会独占⼀⾏,⾏内元素设置width,height属性⽆效,它的长度⾼度主要根据内容决定。⾏内元素的margin和padding属性⽔平⽅向有效果,垂直⽅向没有效果与ts的区别ts是js的超集。js是脚本语⾔,ts是⾯向对象编程语⾔。ts⽀持可选参数,静态类型,接⼝,js不⽀持。ts在编译时就能报错,js运⾏时才暴报错。ts是强类型语⾔,可以明确知道参数类型。,ajax,fetchaxios 基于promise⽤于浏览器和的http客户端。是对ajax的封装,安全性更⾼。有then链,可以异步编程function Callback(promise: Promise) { return promise .then((data) => { data }) .catch((err) => { err })}function test() { return Callback((""))}fetch只对⽹络请求报错,对400,500都当做成功的请求,需要封装去处理,是原⽣js,没有使⽤XMLHttpRequest对象ajax底层使⽤XMLHttpRequest,Ajax引擎在客户端运⾏,特点是实现局部刷新,⽀持异步请求的技术。不⽀持浏览器back,暴露了与服务器交互的细节XmlHttpRequest可以在使⽤JavaScript向服务器提出请求并处理响应,⽽不阻塞⽤户。通过XMLHttpRequest对象,Web开发⼈员可以在页⾯加载以后进⾏页⾯的局部更新。$.ajax({ type: 'POST', url: url, data: data, dataType: dataType, success: function () {}, error: function () {}});状态码2xx:服务器成功处理请求例如:200 (成功)表⽰客户端发送的请求在服务器被正常的处理了。3xx:状态码⽤于重定向例如:301 永久性重定向,请求的资源被分配了新的URI,以后都使⽤这个。302 临时性重定向,请求的资源被分配了新的URI,本次使⽤这个。4xx:请求错误,客户端或许有错误例如:404 服务器找不到资源 403 请求的资源访问被拒绝5xx:服务器错误例如:500 服务器执⾏请求时发送异常 503 服务器暂时⽆法处理请求18.a标签的href和target属性href属性⽤于指定超链接⽬标的urltarget属性规定在何处打开链接⽂档_blank 在新窗⼝打开链接_self 在当前窗⼝打开链接(默认)_top 在整个窗⼝中打开链接_parent 在⽗框架集中打开链接alt属性规定在图像⽆法显⽰时的替代⽂本title属性规定的是在⿏标以上元素时显⽰的⽂本 in 与 for offor in 适合遍历对象,数组,通常⽤来遍历对象的键名,原型链上所有属性都会呗访问,⽤hasOwnProperty()解决for of (es6)适合遍历树,数组,数组对象,字符串等,通常⽤来遍历键值循环与setTimeout()21.⽹站的登录状态是如何保存的,完整的登录流程是什么?通过cookie保存登录状态。cookie存储token,每次请求到后端服务器都会带上token,从⽽验证⽤户是否登录。1.客户端请求后台登录接⼝。2.后台验证通过后,将⽤户的登录状态保存⾄cookie并写⼊客户端。3.客户端再次登录⽹站,请求login接⼝时,后台直接从客户端获取到该⽤户写⼊cookie的登录状态。4.通过对该状态的验证,确认⽤户是否需要再次登录。5.如cookie过期,则跳转⾄登录页;如未过期,则直接显⽰为已登录状态。E作⽤声明位于⽂档中最前⾯的位置,处于标签之前。可以告知浏览器⽂档使⽤何种规范解析页⾯(html,xhtml),apply,bindlet a=[1,2,3,4,5](,call(null,2,3,4,5,6)) //(,apply(null,[2,3,4,5,6])) //6let b=,bind(null,2,3,4,5,6)b() //6call和apply直接执⾏,bind事先将⽅法的this改为我们想要的结果,需要时再调⽤执⾏。apply的第⼆个参数是以数组形式传⼊的。call和bind以列表参数传递。,hrefhref是元素或⽂档与指定资源联通,需要的时候再引⽤src是下载后嵌⼊构成⽂档直接内容24. get postget:长度限制为2k,参数在url可见,速度更快post:没有长度限制,参数写在请求头⾥⾯,安全性更⾼,速度不如get(因为在第三次握⼿时,会发送post请求头,服务器才会返回100continue ,客户端此时才发送数据。⽽get在第三次握⼿时就已经携带了数据)25.三次握⼿why:为了保证可靠的数据传输,防⽌⽆效的请求⼜发送到服务器。ACK=1 确认号有效SYN=1 请求建⽴连接seq 序列号ack 期望下⼀次接收到的序列号跨域客户端通过script标签的src属性发送请求,并且定义⼀个回调函数。服务器端响应请求后会传⼊参数动态执⾏回调函数,就实现了跨域。因为是script标签,所以返回的数据会直接当作js语⾔执⾏就会产⽣错误,所以需要回调函数的存在,关键是服务器返回的数据外层需要需要包裹⼀层函数react 使⽤代理中间件 http-proxy-middleware实现跨域请求const proxy = require('http-proxy-middleware')const { createProxyMiddleware } = require('http-proxy-middleware');s = function (app) { (createProxyMiddleware('/api',{ target:'localhost:3300', changeOrigin: true }))};,CSRF攻击xss:跨站脚本攻击,利⽤⽹站对⽤户输⼊没有进⾏限制或过滤,从⽽在页⾯中嵌⼊某些代码,当别的⽤户访问到该⽹页时,会执⾏对应的代码,从⽽使得攻击者可以获取。防御:设置Cookie的属性为Http only,这样js就⽆法获取Cookie值CSRF攻击:跨域请求伪造,防御:使⽤随机token或验证码28.浏览器输⼊url到渲染的过程1.⾸先是域名解析,解析到对应的ip地址2.三次握⼿,请求建⽴连接3.发送http请求,服务器响应请求,浏览器获取html源码4.解析html并且构建DOM树5.解析css⽣成css对象模型树和css附着在⼀起呈现reader tree(重排和重绘)7.浏览器计算节点的位置和样式进⾏布局29.重排reflow和重绘repaint重排:元素的规模,位置和隐藏等改变时,都会引起回流。引起重排的条件:⾸次渲染,删除或增加dom元素,元素位置的改变,尺⼨的改变,窗⼝尺⼨的改变,读取某些元素的值。⼀定会引起重绘。重绘:元素的外观改变触发的浏览器⾏为,浏览器会根据元素的新属性重新绘制,呈现新的外观。如:color优化:1.合并多次dom的修改2.直接改变元素的类名,切换类名3.经常进⾏重排的元素设置position:absolute和fixed ,脱离⽂档流,不会影响到其他元素4.避免使⽤table布局,⼀个⼩改动会引起整个table重新布局5.经常访问元素属性的操作时,将属性赋给局部变量进⾏计算。⼀个对象的过程其实是⼀种继承的⽅式, 通过new,实例与构造函数通过原型链连接了起来出来,所以实例能访问到构造函数的属性。改变了构造函数的this指向ps:每个对象的__proto__属性都指向原型对象每个构造函数都有prototype原型对象prototype原型对象⾥都有constructor指向它的构造函数31.盒⼦模型所有的html元素都可以看作为盒模型,即content+padding+border+margin1.标准模型:box-sizing:content-box内容⼤⼩(宽⾼):content的⼤⼩,即width和height设置padding时,content⼤⼩不变,整体变⼤模型:box-sizing:border-box内容⼤⼩:content(width,height)+padding+border因为是包括padding的,所以设置padding时,元素会被挤压,整体不变32.什么是flex布局弹性布局,任何元素都可以指定为flex,随着⽹页的⼤⼩⾃适应布局。采⽤flex布局的元素称为容器,⼦元素称为项⽬。设置了flex之后,float,clear等属性失效。flex(flex-grow、flex-shrink、flex-basis):flex-grow定义项⽬的放⼤⽐例,默认为0,即如果存在剩余空间,也不放⼤flex-shrink 定义了项⽬的缩⼩⽐例,默认为1,即如果空间不⾜,该项⽬将缩⼩flex-basis给上⾯两个属性分配多余空间之前, 计算项⽬是否有多余空间, 默认值为 auto, 即项⽬本⾝的⼤⼩flex:auto代表 1 1 autoflex:1代表 1 1 块级上下⽂,独⽴的渲染区域。区域内部与外部⽆关。BFC中的所有⼦元素的左外边都会与⽗块的左边接触。作⽤:1.防⽌被浮动的元素挡住2.解决margin塌陷的问题。因为同⼀BFC的两个box之间的margin以⼤的为准3.⾃适应两栏布局4.清除浮动(BFC计算⾼度时会包括浮动的⾼度,会清除内部⼦元素浮动的影响,⽗元素在计算其⾼度时,加⼊了浮动元素的⾼度,“顺便”达成了清除浮动的⽬标,所以⽗元素就包裹住了⼦元素)如何创建BFC:不为ow不为on不为static或y是lnline-block,inline-flex,flex,table-cell,和instanceoftypeof⽤来判断基本数据类型,返回的是字符串,但是对于null,object和array返回的都是object。instanceof⼀个变量是否属于某个对象的实例,返回的是Boolean类型,判断某个构造函数的prototype属性是否存在对象的原型链上。下⾯⼿写实现⼀下instanceof⽅法function test_instanceof(L, R) { let LL = L.__proto__ let RR = ype while (true) { if (LL === null) return false if (RR === LL) return true LL=LL.__proto__ }}function t() { }let a = new t()(test_instanceof(a,t)) //(test_instanceof(a,Object)) //true35.构造函数和普通函数的区别构造函数可以⽣成实例对象调⽤⽅式不同:构造函数⽤new关键字调⽤⾸字母⼤⼩写:构造函数⾸字母⼀般⼤写this指向不同:普通函数this指向window,构造函数的this指向创建的实例对象。36.原型,原型对象原型对象:构造函数prototype指向的就是原型对象原型:函数有原型,函数的这个原型指向⼀个对象即原型对象继承1.原型链继承:⽗类的实例充当⼦类的原型对象缺点:⽗类的属性是所有⼦类共享的,不能多继承function father() { }function son() {}ype=new father()2.构造函数继承:借⽤⽗类的构造函数来增强⼦类实例,等于是把⽗类的实例属性复制⼀份给⼦类实例,可以多继承缺点:⽆法实现函数的复⽤,实例并不是⽗类的实例,只是⼦类的实例,只继承⽗类,不继承原型function Super(val){ = val;//可以传递参数 = [1];}function Sub(val){ (this,val);//核⼼代码 //通过call()和apply()⽅法在新创建的对象上执⾏构造函数}3.组合式继承:使⽤原型链实现对原型属性和⽅法的继承,⽽通过构造函数来实现对实例属性的继承。function Parent(name){ = name; = ['red', 'blue', 'green']; } e = function(){ (); } function Child(name,age){ (this,name);//

第⼆次调⽤ Parent() = age; } ype = new Parent(); //

第⼀次调⽤ Parent(),apply,bind第⼀个参数都是this要指向的对象,call第⼆个参数是参数列表的⽅式传⼊,apply第⼆个参数是数组的⽅式传⼊call与apply是⽴即调⽤,bind是返回对应函数,需要时调⽤ function show(x){ (x); } let person={ name:"aa", }; (person,"男"); (person,["⼥"]); let ss=(person,"111"); ss()bind的实现39.深拷贝的实现(ity(obj))ePromise,就是⼀个对象,⽤来传递异步操作的消息,可以进⾏异步操作async await 解决回调地狱,语法糖async function test1(){ ("11") await test() ("22")}test1()new Promise(function (resolve) { ("33") resolve();}).then(function () { ("44")})function test() { ("test")}//11 test 33 22 44macro-task(宏任务):包括整体代码script,setTimeout,setIntervalmicro-task(微任务):,ck补充⼀个41.强缓存和协商缓存浏览器第⼀次向服务器发起请求时,服务器响应请求后,浏览器端会进⾏缓存。服务器会将最后⼀次修改时间last-modified发送给客户端进⾏记录,同时还会⽣成并发送Etag强缓存:浏览器请求资源时,会获取该资源缓存的header信息,根据cache-control判断是否从缓存中获取资源。cache-control:max-age=31536000,public,immutablemax-age:缓存时间(s)public:服务器和浏览器都可以缓存immutable:资源永远改变(⽤户刷新浏览器也不发送请求)协商缓存:浏览器每次请求资源时,向服务器发送请求并且携带header中的Etag和last-modified,服务器判断是否改变,如果改变就返回新的资源和新的etag,last-modified以及200状态码。如果没有改变,返回304状态码,浏览器就读取本地资源。注意服务器端header会改变// response headeretag: '5c20abbd-e2e8'last-modified: Mon, 24 Dec 2018 09:49:49 GMT// request header

变为if-none-matched: '5c20abbd-e2e8'if-modified-since: Mon, 24 Dec 2018 09:49:49 GMT已经有last-modified为什么要使⽤etag1.有些资源的改变在1s内改变多次,last-modified对这种操作⽆法精确2.某些请求是周期性的,没有修改内容,3.某些服务器⽆法精确到最后修改时间()和ity()():⼀个字符串中解析出ity():从⼀个对象中解析出字符串