javacript語法易忘知識:
1.實現防抖函數debounce:
防抖函數原理 :
在事件被觸發n秒後在執行回調,如果在這n秒內又被觸發,則重新計時。
場景:
按鈕提交場景: 防止多次提交按鈕,只執行最後提交的一次
服務端驗證場景 : 表單驗證需要服務端配合,只執行一段連續的輸入事件的最後一次,還有搜索聯想詞功能和一些表單元素的校驗,如手機號,郵箱,用戶名等類似
//防抖函數
const debounce = (fn,delay)=>{
let timer = null;
return (...args)=>{
clearTimeout(timer);
timer = setTimeout(()=>{
fn.apply(this,args)
},delay);
};
};
2.實現節流函數 (throttle):
防抖函數原理:
規定在一單位時間內。只能觸發一次函數。如果這個單位時間內觸發多次函數,只有一次生效。
適用場景:
拖拽場景: 固定時間內只執行一次,防止超高頻次觸發位置變動
縮放場景: 監控瀏覽器resize
動畫場景: 避免短時間內多次觸發動畫引起性能問題
//節流函數
const throttle = (fn,delay = 500) =>{
let flag = true;
return (...args) =>{
if (!flag) return;
flag = false;
setTimeout(() => {
fn.apply(this,args)
},delay);
};
};
實現一個call:
將函數設爲對象的屬性
執行&刪除這個函數
指定this到函數並傳人給定參數執行函數
如果不傳人蔘數,默認指向爲 window
//實現一個call方法;
Function.prototype.myCall = function(context){
//此處沒有考慮context非object情況
context.fn = this;
let args = [];
for (let i = 1,len = arguments.length,i < len; i++){
args.push(arguments[i]);
}
context.fn(...args);
let result = context.fn(...args);
delete context.fn;
return result;
};
3.模擬Object.create
原理:Object.create() 方法創建一個新對象,使用現有的對象來提供新創建的對象的__proto__
// 模擬 object.create
function create(proto){
function F(){
F.prototype = proto;
return new F();
}
}
4.轉化爲駝峯命名
var f = function(s){
return s.replace(/-\w/g,function(x){
return x.slice(1).toUpperCase();
})
}