this执行上下文

this不是在写函数时确定指向的, 它是在函数执行中才能确定上下文, this是执行上下文环境的一部分

1
2
3
4
5
6
7
8
9
10
var a = {
name: 'A',
fn: function (){
console.log(this.name);
}
}
a.fn() // this === a
a.fn.call({name: 'B'}) // this === {name: 'B'}
var fn1 = a.fn;
fn1(); // this === window

0.1 + 0.2 === 0.3问题

1
2
3
4
function numberEpsilon(arg1, arg2){
return Math.abs(arg1 - arg2) < Number.EPSILON;
}
console.log(numberEpsilon(0.1 + 0.2, 0.3)) // true

深拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function deepCopy(obj){
var res = Array.isArray(obj) ? [] : {};
for(let key of obj){
if(obj.hasOwnProperty(key)){
if(typeof obj[key] === 'object'){
res[key] = deepCopy(obj[key]); //递归复制
}
else {
res[key] = obj[key];
}
}
}
return result;
}

浏览器缓存知识

浏览器第一次加载资源, 服务器返回200, 浏览器从服务器下载资源文件, 并缓存资源文件与response header, 以供下次加载对比使用

下一次加载资源, 由于强制缓存优先级高, 先比较上一次返回200的时间差, 如果没有超过cache-control设置的max-age, 则没有过期, 并命中强缓存, 从本地读取资源. 如果不支持http1.1 则用expires判断是否过期

如果资源已经过期, 则表明强制缓存没有被命中, 则开始协商缓存, 向服务器发送带有if-none-match和if-modified-since的请求

服务器收到请求后, 优先根据ETag的值判断被请求的文件有没有被修改, ETag值则一致则没有修改, 命中协商缓存返回304; 如果不一致则返回新资源带上新的ETag并返回200