- 节流函数
-
var throttle = function(fn, interval) { //fn为要执行的函数,interval为延迟时间 var _self = fn, //保存需要被延迟执行的函数引用 timer, //定时器 firstTime = true; //是否第一次调用 return function() { //返回一个函数,形成闭包,持久化变量 var args = arguments, //缓存变量 _me = this; if(firstTime) { //如果是第一次调用,不用延迟执行 _self.apply(_me, args); return firstTime = false; } if(timer) { //如果定时器还在,说明上一次延迟执行还没有完成 return false; } timer = setTimeout(function() { //延迟一段时间执行 clearTimeout(timer); timer = null; _self.apply(_me, args); }, interval || 500); }; }; //使用 window.onresize = throttle(function() { //你要执行的代码 }, 500);
2. 防抖
-
function debounce(fn, interval, immediate) { //fn为要执行的函数 //interval为等待的时间 //immediate判断是否立即执行 var timeout; //定时器 return function() { //返回一个闭包 var context = this, args = arguments; //先把变量缓存 var later = function() { //把稍后要执行的代码封装起来 timeout = null; //成功调用后清除定时器 if(!immediate) fn.apply(context, args); //不立即执行时才可以调用 }; var callNow = immediate && !timeout; //判断是否立即调用,并且如果定时器存在,则不立即调用 clearTimeout(timeout); //不管什么情况,先清除定时器,这是最稳妥的 timeout = setTimeout(later, interval); //延迟执行 if(callNow) fn.apply(context, args); //如果是第一次触发,并且immediate为true,则立即执行 }; }; //使用 var myEfficientFn = debounce(function() { //你要做的事 }, 250); window.addEventListener('resize', myEfficientFn);
3. 防抖和节流的区别
4.得到变量的准确类型
一般使用typeOf来获取值的类型,但是array,null用typeOf的得到的值都是object,有时候需要得到他真正的类型就用到了toString()这个方法,由于每种类型都有自己的toString()方法,所以不能直接调用,必须使用prototype链上的toString();
({}).toString.call(data); // 得到结果为 [object object]
console.log(Object.prototype.toString.call("jerry"));//[object String] console.log(Object.prototype.toString.call(12));//[object Number] console.log(Object.prototype.toString.call(true));//[object Boolean] console.log(Object.prototype.toString.call(undefined));//[object Undefined] console.log(Object.prototype.toString.call(null));//[object Null] console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object] console.log(Object.prototype.toString.call(function(){}));//[object Function] console.log(Object.prototype.toString.call([]));//[object Array] console.log(Object.prototype.toString.call(new Date));//[object Date] console.log(Object.prototype.toString.call(/\d/));//[object RegExp] function Person(){}; console.log(Object.prototype.toString.call(new Person));//[object Object]
5. 在if判断条件中使用赋值语句 if(var a = b),这样使用可以将赋值和判断同时进行