面試刷題總結

寫一個事件偵聽器函數?

(至關於封裝一個util兼容主流瀏覽器和IE)css

var EventUtil = {
    //根據狀況分別使用dom2 || IE || dom0方式 來添加事件
    addHandler: function(element,type,handler) {
        if(element.addEventListener) {
            element.addEventListener(type,handler,false);
        } else if(element.attachEvent) {
            element.attachEvent("on" + type,handler);
        } else {
            element["on" + type] = handler;
        }
    },

    //根據狀況分別獲取DOM或者IE中的事件對象,事件目標,阻止事件的默認行爲
    getEvent: function(event) {
        return event ? event: window.event;
    },
    getTarget: function(event) {
        return event.target || event.srcElement;
    },
    preventDefault: function(event) {
        if(event.preventDefault) {
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    }

    //根據狀況分別使用dom2 || IE || dom0方式 來刪除事件
    removeHandler: function(element,type,handler){
        if(element.removeHandler) {
            element.removeEventListener(type,handler,false);
        } else if(element.detachEvent) {
            element.detachEvent("on" + type,handler);
        } else {
            element["on" + type] = null;
        }
    }

    //根據狀況分別取消DOM或者IE中事件冒泡
    stopPropagation: function(event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    }
}

var btn = document.getElementById("myBtn"),
    handler = function () {
        alert("Clicked");
    };

EventUtil.addHandler(btn,"click",handler);
EventUtil.removeHandler(btn,"click",handler);

如何書寫高性能代碼

http://developer.51cto.com/ar...前端

怎樣用js實現千位分隔符

function format (num) {  
    var reg=/\d{1,3}(?=(\d{3})+$)/g;   
    return (num + '').replace(reg, '$&,');  
}
``

    function format(num){  
     num=num+'';//數字轉字符串  
      var str="";//字符串累加  
      for(var i=num.length- 1,j=1;i>=0;i--,j++){  
          if(j%3==0 && i!=0){//每隔三位加逗號,過濾正好在第一個數字的狀況  
              str+=num[i]+",";//加千分位逗號  
              continue;  
          }  
          str+=num[i];//倒着累加數字  
      }  
      return str.split('').reverse().join("");//字符串=>數組=>反轉=>字符串  
    }  
發現一個更好的方法補充一下
let arr = [];
function three(num){
  if(num<1){
    return num
  }
  arr.unshift(parseInt(num%1000))
  three(num/1000);
}
three(1234567)
console.log(arr.join(','))

編寫一個方法 求一個字符串的字節長度

function getByte(str){
    var len = str.length,
        bytes = len,
        i = 0;
    for(; i<len; i++){
        if (str.charCodeAt(i) > 255) bytes++;
    }
    return bytes;
}

JavaScript中如何對一個對象進行深度clone

function clone(obj) {
            if (!obj && typeof obj !== 'object') {
                return;
            }
            var copy = (obj instanceof Array)?[]:{};
            for(var o in obj) {
                if (typeof obj[o] === 'object') {
                    copy[o] = clone(obj[o]);
                } else {
                    copy[o] = obj[o];
                }
            }
            return copy;
        }
        var obj = {
            name: 'zhangsan',
            age: 33,
            child:{
                name:'zhangxiao',
                age:9,
                eat:[1,{el:2}]
            },
            hobby:undefined,
            eat:[1,2,3,4]
        }
        var a=clone(obj)
        obj.child.name = 'lis';
        console.log(a);

如下代碼運行結果

function say() {
        var num = 888;
        var sayAlert = function() { alert(num); }
        num++;
        return sayAlert;
    }
    var sayAlert = say();
    sayAlert();//889

剛調用say()函數的時候sayAlert不會執行,由於沒有啊sayAlert()這樣調用ios

如何實現Array.prototype.forEach?

if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fn){
        for ( var i = 0; i < this.length; i++ ) {
            fn( this[i], i, this );
        }
    };
}

js怎麼獲取非行內樣式

function getStyle(obj, attr){
      if(obj.currentStyle) {
        obj.currentStyle[attr]
      } else {
        getComputedStyle(obj, null)[attr];
      }
}

求數組中出現次數最多的元素和次數

<script>
        var arr = [1,1,1,4,5,4];
        var obj = {};
        for(var ar in arr){
            if(obj[arr[ar]]){
                obj[arr[ar]]++;
            } else {
                obj[arr[ar]] = 1;
            }
        }
        console.log(obj);
        1.//獲取出現最多的元素 次數
        var res = [];
        for(var o in obj) {
            res.push({el: o,val:obj[o]});
        }
        res.sort(function(a,b){
                return  -(a.val-b.val);
        })
        console.log(res[0])
        2.
        let maxone = 0;
        for(var o in obj){
          if(obj[o]>maxone){
            maxone = obj[o]
          }
        }
        console.log(maxone)
    </script>

apply call bind

/*axios

apply call bind
  this 變幻無窮
  都是改變this的智享
  前二者:至關於返回是當即執行函數 fn.call(obj) 至關於obj的prototype上面有一個        fn()函數  obj就能順着原型鏈網上找 this指向obj
  bind:返回的是一個函數不會當即執行
*/
var a = 1;
var obj = {
  a:2,
  fn:function(){
    console.log(this.a)
  }
}
obj.fn.call(obj)  //2
var fn2=obj.fn.bind(obj)
var fn3 = obj.fn.bind()
console.log(fn2)  //fn(){console.log(this.a)}
fn2()            //2
fn3()            //1

用js建立10個標籤,點擊的時候彈出來對應的序號

let aa = document.getElementById('aa')
for(var i=0;i<5;i++){
  (function(i){
    let el_a = document.createElement('a');
    el_a.innerHTML = i+'<br/>'
    el_a.addEventListener('click',function(e){
      e.preventDefault()
      console.log(i)
    },)
    aa.appendChild(el_a)
  })(i)
}

也能夠把for的var改爲letapi

閉包

// 閉包  1.能調用其餘函數內部變量(給變量添加了緩存 但要注意在適當的時候清除緩存)  2.匿名執行函數(防止全局變量污染)
function f1(){
      var a = 1;
      return function(){
        console.log(a)
      }
    }
    let a = f1();
    function f2(f){
      var a =2;
      f()
    }
    f2(a)

回調函數在工做中的應用

/寫回調函數:一般axios請求的函數是封裝起來的(便於維護) 發起請求的頁面是分開的/數組

let params = {
  a:1,
  b:1,
  callback:function({datas}){
    console.log('hhhh')
    console.log(datas)
  }
}
apiAxios(params)

// 封裝到一個js裏面
function apiAxios(params){
  // axios.get('url').then((resp)=>{
    let datas = [1,2,3,4]
    params.callback({datas:datas})
  // })
}

網頁是如何渲染出來的

用戶輸入url到頁面顯示這個過程當中發生了什麼呢?
一、輸入url發送請求
二、瀏覽器拿到服務器返回的HTML
三、瀏覽器開始解析HTML生產DOM樹、css生產css樹,兩個樹合在一塊兒生成渲染數
四、瀏覽器根據渲染樹來繪製頁面
注意:重繪和重排兩個關鍵字
1)重繪:dom節點不發生位置的變化,例如改變background,不影響周邊的節點
2)重排:dom發生節點變化,涉及到的周邊節點也會發生重排,所以消耗性能較大,例如操做節點,修改樣式的寬高,僞類的操做等
3)js的執行會影響dom樹和css樹的渲染
4)<img/>瀏覽器遇到這個標籤 不會停下來,而是繼續下來,等圖片請求下來再返回去重排
總結:一些動畫類的操做節點儘可能使用absolute或者fixed,避免影響周邊節點瀏覽器

前端性能優化(除了css,js順序、減小請求、雪碧圖等)

最近刷博客看到的,window.perforance.timing這個方法下面有不少的屬性能夠獲取緩存

DNS查詢耗時 = domainLookupEnd - domainLookupStart
TCP連接耗時 = connectEnd - connectStart
request請求耗時 = responseEnd - responseStart
解析dom樹耗時 = domComplete - domInteractive
白屏時間 = domloadng - fetchStart
domready時間 = domContentLoadedEventEnd - fetchStart
onload時間 = loadEventEnd - fetchStart
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息