1、范例推断
推断 Target 的范例,单单用 typeof 并没法完整满足,这实在并非 bug,实质原因是 JS 的万物皆对象的理论。因而要真正圆满推断时,我们须要辨别看待:
- 基本范例(null): 运用 String(null)
- 基本范例(string / number / boolean /undefined) + function: 直接运用 typeof即可
- 其他援用范例(Array / Date / RegExp Error): 挪用toString后依据[object XXX]举行推断
很稳的推断封装:
let class2type = {}
'Array Date RegExp Object Error'.split(' ').forEach(e => class2type[ '[object ' + e + ']' ] = e.toLowerCase())
function type(obj) {
if (obj == null) return String(obj)
return typeof obj === 'object' ? class2type[ Object.prototype.toString.call(obj) ] || 'object' : typeof obj
}
2、防抖和撙节
摘自https://segmentfault.com/a/11…
- 防抖 (debounce): 将屡次高频操纵优化为只在末了一次实行,一般运用的场景是:用户输入,只需再输入完成后做一次输入校验即可。
function debounce(fn, wait, immediate) {
let timer = null
return function() {
let args = arguments
let context = this
if (immediate && !timer) {
fn.apply(context, args)
}
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(context, args)
}, wait)
}
}
- 撙节(throttle): 每隔一段时间后实行一次,也就是下降频次,将高频操纵优化成低频操纵,一般运用场景: 滚动条事宜 或许 resize 事宜,一般每隔 100~500 ms实行一次即可。
function throttle(fn, wait, immediate) {
let timer = null
let callNow = true
return function() {
let context = this,
args = arguments
if (callNow) {
fn.apply(context, args)
callNow = false
}
if (!timer) {
timer = setTimeout(() => {
fn.apply(context, args)
timer = null
}, wait)
}
}
}
3、猎取URL参数
function getUrlKey(name){
return encodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href)||[,""])[1].replace(/\+g,'%20')) || null;
}
4、全局尺寸设置
申明:经常使用长度单元px、em、rem。个中px是物理像素,牢固大小,无自适应特性;em是相对单元,以父元素大小为基准倍率,但累计叠乘,轻易失足;rem相对单元,以根元素大小为基准倍率(document.documentElement.style.fontSize),不叠加,可完成正确自适应。
;(function(win,doc){
function setRem(){
//以iphone6为规范,按屏幕大小完成屏幕基本尺寸缩放,16px是文档的默许尺寸(即1rem默许为16px),为轻易盘算可变更加50或许100(对应1rem=50px或许100px)
doc.documentElement.style.fontSize = 16 * doc.documentElement.clientWidth / 375 + 'px';
}
setRem();
//监听resize事宜,屏幕大小发生变化时,随时变更基本尺寸
win.addEventListener('resize',function(){
setRem();
},false);
})(window,document)
5、深拷贝数据
运用范例(array、object)按援用运用,不能复制,想要复制(深拷贝)须要新建对象,把目的的对象的属性逐一拷贝。
function copyArr (arr){
return arr.map((e) => {
if(typeof e ==='object'){
return Object.assign({},e)
}else {
return e
}
})
}