- 深拷贝,浅拷贝
此问题针对于引用类型
浅拷贝,拷贝(地址)完后,改变任意对象的值后,均改变
深拷贝,拷贝完后,与前对象无关
实现深拷贝:
- 开辟新的栈空间复制
- json序列化和反序列化后
- XSS和CSRF
跨站脚本攻击,跨站请求伪造
前者通过在前后端对输入部分的内容进行验证过滤,并且对特殊字符进行编码
后者通过增加动态验证(二次验证),以及对cookies进行删除
- 双向数据绑定的原理和SPA路由原理
- 通过Object.defineProperty()实现监控数据,准确的发送变更位置给视图
- 通过window.onhashchange事件监听url的#变化,H5新增的history api
A)history.pushState(data, title [, url]):往历史记录堆栈顶部添加一条记录; data会在onpopstate事件触发时作为
参数传递过去;title为页面标题,当前所有浏览器都会 忽略此参数;url为页面地址,可选,缺省为当前页地址;
B)history.replaceState(data, title [, url]) :更改当前的历史记录,参数同上;
C)history.state:用于存储以上方法的data数据,不同浏览器的读写权限不一样;
D)window.onpopstate:响应pushState或replaceState的调用;
- 高效化递归函数
将需要多次计算的值,利用数组将其保存下来【记忆函数】
callee和caller
arguments.callee:指向参数arguments对象的函数【有利于匿名函数的递归和封装】
functionName.caller:指向当前函数的直接父函数
console.time(4)
let fibonacci3 = function(){
let memo = [0,1] ;
let fib = function(n){
let result=memo[n] ;
if(typeof result!=='number'){
result=arguments.callee(n-1) + arguments.callee(n-2) ;
memo[n]=result ;
}
return result ;
};
return fib ;
}();
console.log(fibonacci3(102));
console.timeEnd(4)
- React、Vue、Angular
- call和apply
object[.functionname].call(obj,arg1,arg2,...)
object[.functionname].apply(obj,[arg1,arg2,...])
作用均是使Object中的作用域变成obj的,即改变this的作用域
- 事件流和事件委托
事件流:捕获阶段、执行阶段、冒泡阶段
捕获为由外向内触发
冒泡为由内向外触发
addEventListener() 第三个参数为bool false为冒泡阶段
stopPropagation()、stopImmediatePropagation()可阻止事件流的后续传播。
事件委托就是父元素监听子元素的冒泡事件
$('元素').on( events [, selector ] [, data ], handler )
- promise
promise对象是一个对未来结果的一个承诺
var promise = new promise(function(resolve,reject){})实例化
resolve(data) 代表成功时返回的值
reject(data) 代表失败时返回的值
和promise.resolve()/reject效果一致
同时还有其他方法如all()等
promise的状态有三:
pending初始状态,fulfilled成功,rejected失败
改变状态后不可更改