1.get请求参数误区
误区:
get参数大小存在限制,post参数大小不存在限制
实际上:
http协议从未规定get和post的参数大小,
get参数受限是因为:浏览器和web服务器限制了URL长度
不同浏览器和web服务器,限制的长度不一样
2.get和post在缓存方面的区别
get可以使用缓存:因为类似查找过程,用户获取数据不用每次都与数据库连接
post不能使用缓存:做修改和删除操作,必须与数据库交互
3.说一下闭包## 标题
闭包:一个函数能读取其他函数内部的变量
原理:作用域链特性(当前执行环境下访问某个变量时,如果不存在就一直往外层查找)
优点:隐藏变量,避免全局污染(全局变量容易被人修改)
缺点:导致变量不会被垃圾回收机制回收,造成内存消耗
function Add(){
var a = 10;
return function(){
a++;
return a;
};
};
4.类的创建和继承
创建:首先new一个function,在这个function的prototype中添加属性和方法。
//定义一个动物类
function Animal(name) {
this.name = name; //属性
this.sleep = function() { //实例方法
console.log(this.name + 'sleep...');
}
}
//在原型链上添加一个原型方法
Animal.prototype.eat = function(food) {
console.log(this.name + 'eat...' + food)
}
继承:
1.原型链继承:原型链继承是JavaScript实现继承的主要方法。利用原型让一个引用类型继承另一个引用类型的属性和方法。
特点:基于原型链,既是父类的实例,也是子类的实例。
缺点:不能实现多继承。
//创建一个空对象
function Cat() {
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';
var cat = new Cat;
2.构造继承:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)。
特点:可以实现多继承。
缺点:只能实现继承父类的属性和方法,不能继承原型链上的属性和方法。
function Cat() {
Animal.call(this);
this.name = name || 'cat';
}
var cat = new Cat();
3.组合继承:相当于构造继承和原型链继承的组合体。通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用。
缺点:调用了两次父类构造函数,生成了两份实例。
function Cat() {
Animal.call(this);
this.name = name || 'cat';
}
(function() {
//创建一个空对象
var Super = function() {};
//将实例作为子类的原型
Super.prototype = Animal.prototype;
Cat.prototype = new Super();
}) ()
var cat = new Cat();
4.寄生组合方式:可以说是组合继承的优化。通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例。
function Cat() {
Animal.call(this);
this.name = name || 'cat';
}
(function() {
//创建一个空对象
var Super = function() {};
//将实例作为子类的原型
Super.prototype = Animal.prototype;
Cat.prototype = new Super();
}) ()
var cat = new Cat();
5.如何解决回调地狱
回调:将一个函数作为参数传给另一个函数
回调地狱:异步回调的层层嵌套
解决:async/await、promise
6.说一说事件流
事件流:页面中接收事件的顺序
事件流阶段:事件捕获、处于目标、事件冒泡
指定事件处理程序操作:addEventListener(要处理的事件名, 事件处理函数, 布尔值)
注意:参数3(布尔值)为true(表示捕获阶段调用),为false(表示冒泡阶段调用)
7.如何让事件先冒泡后捕获
监听捕获和冒泡分别对应不同的处理函数,监听到捕获事件,先暂存执行,直到冒泡事件被捕获后再执行捕获事件
8.说一下事件委托
事件委托:不是在事件发生的DOM上设置监听函数,而是在父元素上监听,通过事件冒泡,父元素可以监听到子元素的事件触发,通过判断事件发生元素DOM的类型,做出不同的响应。
举例:ul和li标签
好处:适合动态元素绑定,新添加的子元素也会有监听函数·
9.说一下图片的懒加载和预加载
预加载:提前加载图片,用户需要时从缓存中渲染(会增加服务器前端的压力)
懒加载:目的是服务器前端的优化,减少请求输或延迟请求数(缓解服务器前端压力)
10.mouseover和mouseenter起区别
mouseover:会冒泡,对应的移除事件是mouseout
mouseenter:不会冒泡,对应的移除事件是mouseleave
11.js的new操作做了哪些事
新建一个空对象,这个对象原型指向构造函数的prototype,执行构造函数后返回这个对象
12.改变函数内部this指针的指向函数(bind、apply、call的区别)
apply():第一个参数表示要指向的那个参数,第二个参数是数组
call():第一个参数表示要指向的那个参数,后面参数arg1,arg2…
bind():返回一个新的函数,不会马上执行
13.clientHeight、scrollHeight、offsetHeight的区别?offsetTop、offsetTop、clientTop的区别
clientHeight:可视区域的高度(不包含border和滚动条)
offsetHeight:可视区域的高度(包含border和滚动条)
scrollHeight:所有区域的高度(包含隐藏的部分)
clentTop:边框boder的厚度,未指定情况下为0
scrollTop:滚动后隐藏的高度