安全部分
1. xss攻击
大多数通过js脚本注入,攻击数据库,获取cookie等。
==解决: ==
- 输入检查
- 服务端输出检查
- httpOnly(设置后能让js脚本无法获取到cookie信息)
2. CSRF 跨站请求伪造
冒充受信任用户,向服务器发送非预期请求的攻击方式。例如,这些非预期请求可能是通过在跳转链接后的 URL 中加入恶意参数来完成:
==解决: ==
- token
- 验证码
- referer check(同源检查)
同源策略: 同源是指"协议+域名+端口"三者相同
JS相关
1. js内存机制和回收机制
内存机制:
堆: 存复杂对象Object
栈: 存变量,null undefined boolean number string symbol
回收机制:
- 引用计数: 看数据是否还被引用,没有引用则回收(缺点:循环引用中无法释放。)(早年间ie用)
- 标记清除: 从根部(window)出发看是否还能到达某个对象,能到达则被需要,不能则释放
2. dom事件中target和currenttarget
**target: ** 指获取事件的目标(真正的发生事件的dom)
currenttarget: 指正在发生事件的元素(如:事件委托,currenttarget指向父元素,target指向子元素)
两者只有在目标阶段才是相等的
3. 原型和原型链:
原型: 每个js对象创建时,就会与一个原型对象相关联,从这原型对象中继承属性。
原型链: 试图引用对象的某个属性时,会到原型里寻找这个属性,这种实例和原型的关系叫做原型链。
proto每个对象都会有一个proto属性,指向该对象的原型。
prototype 函数对象才有的属性,指向该函数的原型。
construtor 每个原型对象都有的属性,指向关联的构造函数
4. 继承:
- 原型链继承
缺点:
1. 来自原型上的所有属性会被实例所共享。
2. 子类无法向父类传参 - 构造函数继承
解决了原型链继承中子类实例共享父类引用属性的问题。
缺点:
函数复用问题。(方法属性都在构造函数中定义) - 组合继承
缺点:
两次调用了父类构造函数,造成了不必要的消耗。
function Person(){
this.type="Person"
}
Person.prototype.getType=function () {
return this.type
}
function Student(){
Person.call(this) // 第一次调用
this.occupation="Student"
}
Student.prototype=new Person() // 第二次调用
Student.constructor=Student
- 寄生组合继承
解决组合继承调用两次父类的问题
function inheritPrototype(subType,superType){
var prototype = Object(superType.prototype); //创建对象
prototype.constructor = subType; //增强对象
subType.prototype = prototype; //指定对象
}
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function () {
alert(this.name);
};
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}
inheritPrototype(SubType,superType);
SubType.prototype.sayAge = function () {
alert(this.age);
};
防抖和节流
函数防抖(debounce):
在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时;典型的案例就是输入搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时。
函数节流(throttle):
规定在一个单位时间内,只能触发一次函数,如果这个单位时间内触发多次函数,只 有一次生效; 典型的案例就是鼠标不断点击触发,规定在n秒内多次点击只有一次生效。