DOM
事件委托
上代码:
ul.addEventListener('click', function(e){if(e.target.tagName.toLowerCase() === 'li'){fn() // 执行某个函数
}
})
用 mouse 事件写一个可拖拽的 div
//HTML
<div id="xxx"></div>
//JS
var dragging = false
var position = null
xxx.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 有什么长处?
提供了类型束缚,因而更可控、更容易重构、更适宜大型项目、更容易保护。