DOM
事件委托
上代码:
ul.addEventListener('click', function(e){ if(e.target.tagName.toLowerCase() === 'li'){ fn() // 执行某个函数 } })
用mouse事件写一个可拖拽的div
//HTML<div id="xxx"></div>//JSvar dragging = falsevar position = nullxxx.addEventListener('mousedown',function(e){ dragging = true position = [e.clientX, e.clientY]})document.addEventListener('mousemove', function(e){ if(dragging === false){return} console.log('hi') const x = e.clientX const y = e.clientY const deltaX = x - position[0] const deltaY = y - position[1] const left = parseInt(xxx.style.left || 0) const top = parseInt(xxx.style.top || 0) xxx.style.left = left + deltaX + 'px' xxx.style.top = top + deltaY + 'px' position = [x, y]})document.addEventListener('mouseup', function(e){ dragging = false})
HTTP
状态码
2xx 示意胜利
3xx 示意须要进一步操作
4xx 示意浏览器方面出错
5xx 示意服务器方面出错
GET和POST的区别
- GET在浏览器回退时是有害的,而POST会再次提交申请。
- GET产生的URL地址能够被Bookmark,而POST不能够。
- GET申请会被浏览器被动cache,而POST不会,除非手动设置。
- GET申请只能进行url编码,而POST反对多种编码方式。
- GET申请参数会被残缺保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET申请在URL中传送的参数是有长度限度的,而POST么有。
- 对参数的数据类型,GET只承受ASCII字符,而POST没有限度。
- GET比POST更不平安,因为参数间接裸露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
Cookie V.S. LocalStorage V.S. SessionStorage V.S. Session
- Cookie V.S. LocalStorage
- 次要区别是 Cookie 会被发送到服务器,而 LocalStorage 不会
- Cookie 个别最大 4k,LocalStorage 能够用 5Mb 甚至 10Mb(各浏览器不同)
- LocalStorage V.S. SessionStorage
- LocalStorage 个别不会主动过期(除非用户手动革除),而 SessionStorage 在回话完结时过期(如敞开浏览器)
- Cookie V.S. Session
- Cookie 存在浏览器的文件里,Session 存在服务器的文件里
- Session 是基于 Cookie 实现的,具体做法就是把 SessionID 存在 Cookie 里
TS
never类型是什么?
举个具体点的例子,当你有一个 union type:
interface Foo { type: 'foo'}interface Bar { type: 'bar'}type All = Foo | Bar
在 switch 当中判断 type,TS 是能够收窄类型的 (discriminated union):
function handleValue(val: All) { switch (val.type) { case 'foo': // 这里 val 被收窄为 foo break case 'bar': // val 在这里是 bar break default: // val 在这里是 never const exhaustiveCheck: never = val break }}
留神在 default 外面咱们把被收窄为 never 的 val 赋值给一个显式申明为 never 的变量。如果所有逻辑正确,那么这里应该可能编译通过。然而如果起初有一天你的共事改了 All 的类型:type All = Foo | Bar | Baz
然而他遗记了在 handleValue 外面加上针对 Baz 的解决逻辑,这个时候在 default branch 外面 val 会被收窄为 Baz,导致无奈赋值给 never,产生一个编译谬误。所以通过这个方法,你能够确保 handleValue 总是穷尽 (exhaust) 了所有 All 的可能类型。
TS比起JS有什么长处?
提供了类型束缚,因而更可控、更容易重构、更适宜大型项目、更容易保护。