diff --git a/http.md b/http.md index 9245060..8911052 100644 --- a/http.md +++ b/http.md @@ -32,6 +32,21 @@ 4》网络接口层:负责通过网络发送和接收 IP 数据报 +##### 缓存协商 + +**Last-Modified 与 If-Modified-Since** + +* 浏览器第一次请求资源时,服务器会把资源的最新修改时间 Last-Modified:Thu, 29 Dec 2011 18:23:55 GMT 放在响应头中返回给浏览器 +* 第二次请求时,浏览器就会把上一次服务器返回的修改时间放在请求头 If-Modified-Since:Thu, 29 Dec 2011 18:23:55 发送给服务器,服务器就会拿这个时间跟服务器上的资源的最新修改时间进行对比 + +如果两者相等或者大于服务器上的最新修改时间,那么表示浏览器的缓存是有效的,此时缓存会命中,服务器就不再返回内容给浏览器了,同时 Last-Modified 头也不会返回,因为资源没被修改,返回了也没什么意义。如果没命中缓存则最新修改的资源连同 Last-Modified 头一起返回。 + +**ETag 与 If-None-Match** + +ETag/If-None-Match 与 Last-Modified/If-Modified-Since 的流程其实是类似的,唯一的区别是它基于资源的内容的摘要信息(比如 MD5 hash)来判断 + +浏览器发送第二次请求时,会把第一次的响应头信息 ETag 的值放在 If-None-Match 的请求头中发送到服务器,与最新的资源的摘要信息对比,如果相等,取浏览器缓存,否则内容有更新,最新的资源连同最新的摘要信息返回。用 ETag 的好处是如果因为某种原因到时资源的修改时间没改变,那么用 ETag 就能区分资源是不是有被更新。 + ##### 加密算法相关 > 1、对称加密 diff --git a/javascript.md b/javascript.md index 7d876ee..fbd1756 100644 --- a/javascript.md +++ b/javascript.md @@ -87,12 +87,12 @@ let Base = function() { } } -let Sub = function(){ +let Sub = function() { let base = new Base() - for(let i in base){ + for (let i in base) { Sub.prototype[i] = base[i] } - Sub.prototype[name] = 'Sub + Sub.prototype[name] = 'Sub' } ``` @@ -100,12 +100,25 @@ let Sub = function(){ > 原型链的简单描述 +* 判断某个对象是不是另一个对象的原型 + +```js +// ES3 +Object.prototype.isPrototypeOf(o) // 返回true值可以确定Object.prototype就是o对象的原型 +// ES5 +Object.getPrototypeOf(o) === Object.prototype +// ES6 +o.__proto__ === Object.prototype +// 设置一个原型 +Object.setPrototypeOf(Child.prototype, Father.prototype) // 将父类的原型设置为子类的原型 +``` + 原型链是 JavaScript 实现继承最重要的一种方式。每一个对象都有自己的原型对象,根原型对象没有原型,所以其 **proto** 属性值为 null 。在调用时,如果访问的对象属性没有找到,JavaScript 会顺着原型链继续往下找,直到触碰到根原型为止。 > ES5 和 ES6 中的继承的区别 -![ES5](https://lcx960324.gitbooks.io/front-end-cheat-sheet/content/assets/es5-inherit.png) -![ES6](https://lcx960324.gitbooks.io/front-end-cheat-sheet/content/assets/es6-inherit.png) +![ES5](https://user-images.githubusercontent.com/10307282/37136881-681c1d28-22de-11e8-946e-03983e9e4426.png) +![ES6](https://user-images.githubusercontent.com/10307282/37136911-818dac0e-22de-11e8-9990-483273493e92.png) > JavaScript 垃圾回收机制 @@ -118,3 +131,7 @@ let Sub = function(){ **引用计数** 在低版本 IE 中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加 1,如果该变量的值变成了另外一个,则这个值得引用次数减 1,当这个值的引用次数变为 0 的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的空间。 + +> JavaScript 内存泄漏 + +* 全局变量引起的内存泄漏 diff --git a/test-cross/cors/server.js b/test-cross/cors/server.js index c844aec..1ee1e49 100644 --- a/test-cross/cors/server.js +++ b/test-cross/cors/server.js @@ -1,11 +1,8 @@ const http = require('http') -http - .createServer((req, res) => { - res.writeHead(200, { - 'Access-Control-Allow-Origin': 'http://127.0.0.1:8080', - 'Content-Type': 'text/html;charset=utf-8' - }) - res.end('这是你要的数据:1111') +http.createServer((req, res) => { + res.writeHead(200, { + 'Access-Control-Allow-Origin': 'http://127.0.0.1:8080', + 'Content-Type': 'text/html;charset=utf-8' }) - .listen(3000, '127.0.0.1') -console.log('The server is listening to 127.0.0.0') + res.end('这是你要的数据:1111') +})