JS(一)
1.get请求传参长度的误区
HTTP从未规定get或post长度限制的问题,get最大长度显示主要来源于浏览器或web服务器的限制,不同的浏览器和web服务器,限制的最大成都不一样,要支持IE最大长度为2083字节,若支持谷歌,最大长度8182字节
2.get和post请求在缓存方面的区别
get请求类似于查找的过程,用户获取数据可以不用每次都与数据库连接,所以可以使用缓存。Post与get不同,post通常进行修改和删除的操作,需要与数据库进行交互,所以不能使用缓存。因此get请求适合于请求缓存。
3.闭包
闭包就是能够读取其他函数内部变量的函数,或者子函数在外调用,子函数在所在的父函数作用域不会被释放。
闭包的用途:读取函数内部的变量;让这些变量的值始终保存在内存中,不会再使得父函数掉用户被自动清除;方便调用上下文的局部变量,利于代码的封装。
4.类的创建和继承
(1) 类的创建:新建一个function,在function的prototype中添加属性和方法。
(2) 原型链的继承:这里新建一个空对象,空对象指向Animal,并且Cat.prototype指向了这个空对象,(子类的原型prototype指向父类对象)这种就是基于原型链的继承。基于原型链,既是父类实例也是子类实例,但无法hi先多继承
(3) 构造继承:使用父类的构造函数来增强子类实例,等于是复制父类实例给子类(没用到原型)。这样可以实现多继承,但是只能继承父类实例的属性和方法,不能继承原型上的属性和方法。
(4) 实例继承和拷贝继承:实例继承:为父类实例增加新特性,作为子类实例返回,拷贝继承:拷贝父类元素上的属性和方法,实用性不强。
(5) 组合继承:相当于构造继承和原型链继承的组合体。通过调用父类构造,继承父类的属性并保留传参的特点,然后通过将父类实例作为子类原型,实现函数复用。可以继承实例属性和方法,也可以继承原型属性和方法。但调用了两次父类构造函数,生成了两份实例
(6) 寄生组合继承:通过寄生的方式砍掉父类的实例属性,这样在调用两次父类构造的时候就不会初始化两次实例方法和属性
5.如何解决一部回调地狱
Promise,Generator,async/await三种方法。
(1) Promise构造函数包含有一个参数和一个带有resolve和reject两个参数的回调。在回调中执行一些操作(例如异步),如果一切正常可以调用resolve,否则可以调用reject把结果返回给调用者。可以在new出来的Promise实例上调用.then()的方法,预先为这个Promise异步操作指定成功和失败的回调函数。
(2) Generator:generator函数不会像普通函数那样立即执行,而是返回一个指向内部状态对象的指针,调用遍历器对象Iterator的next方法,指针就会从函数头部或者上一次停下来的地方开始执行。注意:next方法的参数表示上一个yield表达式的返回值,而不是函数中参数的值。
(3) async/await:async函数会返回一个promise对象,.then进行成功的回调,.catch捕获异常信息。await只能在async内部使用当async内部的所有await执行完毕之后才会告诉promise成功或者失败(如果await失败后面的await都不再执行),才能进行后面的.then和.catch操作。