web前端筆試題(一)

 一、javascript中如何對一個對象進行深度clone?
//深度克隆
function deepClone(obj){
    var result,oClass=isClass(obj);
        //肯定result的類型
    if(oClass==="Object"){
        result={};
    }else if(oClass==="Array"){
        result=[];
    }else{
        return obj;
    }
    for(key in obj){
        var copy=obj[key];
        if(isClass(copy)=="Object"){
            result[key]=arguments.callee(copy);//遞歸調用
        }else if(isClass(copy)=="Array"){
            result[key]=arguments.callee(copy);
        }else{
            result[key]=obj[key];
        }
    }
    return result;
}
//返回傳遞給他的任意對象的類
function isClass(o){
    if(o===null) return "Null";
    if(o===undefined) return "Undefined";
    return Object.prototype.toString.call(o).slice(8,-1);
}
var oPerson={
    oName:"rookiebob",
    oAge:"18",
    oAddress:{
        province:"beijing"
    },    
    ofavorite:[
        "swimming",
        {reading:"history book"}
    ],
    skill:function(){
        console.log("bob is coding");
    }
};
//深度克隆一個對象
var oNew=deepClone(oPerson);
 
oNew.ofavorite[1].reading="picture";
console.log(oNew.ofavorite[1].reading);//picture
console.log(oPerson.ofavorite[1].reading);//history book
 
oNew.oAddress.province="shanghai";
console.log(oPerson.oAddress.province);//beijing
console.log(oNew.oAddress.province);//shanghai

  二、如何控制alert中的換行?javascript

 添加 「\n」  便可實現換行,有些瀏覽器則可能添加 「\r\n」php

        三、請編寫一個javascript函數parseQueryString,它的用途是把URL參數解析爲一個對象css

var url = "http://www.taobao.com/index.php?key0=0&key1=1&key2=2";
var obj = parseQueryString(url);
       
function parseQueryString(argu){
  var str = argu.split('?')[1];
  var result = {};
  var temp = str.split('&');
  for(var i=0; i<temp.length; i++)
  {
     var temp2 = temp[i].split('=');
     result[temp2[0]] = temp2[1];
  }
  return result;
}

  四、如何控制網頁在網絡傳輸過程當中的數據量?前端

  1. 減小http請求次數:css spirit,data urijava

  2.  JS,CSS源碼壓縮
  3.  前端模板 JS 數據,減小因爲HTML標籤致使的帶寬浪費,前端用變量保存AJAX請求結果,每次操做本地變量,不用請求,減小請求次數
  4.  用innerHTML代替DOM操做,減小DOM操做次數,優化javascript性能
  5.  用setTimeout來避免頁面失去響應
  6.   用hash-table來優化查找
  7.  當須要設置的樣式不少時設置className而不是直接操做style 
  8.  少用全局變量
  9.  緩存DOM節點查找的結果
  10.  避免使用CSS Expression
  11.   圖片預載
  12.  避免在頁面的主體佈局中使用table,table要等其中的內容徹底下載以後纔會顯示出來,顯示比div css佈局慢

       五、如下代碼運行結果    //889數組

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

var sayAlert=say();
sayAlert()

  六、請實現ES5中的Object.getPrototypeOf()函數瀏覽器

function Fn(){
            
            }
var fn = new Fn();
 //經過getPrototypeOf靜態方法,得到對象fn的prototype
var proto = Object.getPrototypeOf(fn);
 //將得到的prototype添加一個name屬性,並賦值
 proto.name = 'Monkey';
//輸出對象fn.name
 console.log(fn.name);//Monkey
//判斷proto是不是Fn.prototype
 console.log( 'proto === Fn.prototype? ' + (proto === Fn.prototype) );
//proto === Fn.prototype? true

  七、如何實現Array.prototype.forEach緩存

 
array.forEach(callback(currentValue,index,array){
 
},this)
array.forEach(callback[,  thisArg])
callback
爲數組中每一個元素執行的函數,該函數接收三個參數:
currentValue(當前值)
數組中正在處理的當前元素。
index(索引)
數組中正在處理的當前元素的索引。
array
forEach()方法正在操做的數組。
thisArg可選
可選參數。當執行回調 函數時用做this的值(參考對象)。
 

 

function logArrayElements(element, index, array) {
    console.log("a[" + index + "] = " + element);
}

// 注意索引2被跳過了,由於在數組的這個位置沒有項
[2, 5, ,9].forEach(logArrayElements);

// a[0] = 2
// a[1] = 5
// a[3] = 9

[2, 5,"" ,9].forEach(logArrayElements);
// a[0] = 2
// a[1] = 5
// a[2] = 
// a[3] = 9

[2, 5, undefined ,9].forEach(logArrayElements);
// a[0] = 2
// a[1] = 5
// a[2] = undefined
// a[3] = 9


let xxx;
// undefined

[2, 5, xxx ,9].forEach(logArrayElements);
// a[0] = 2
// a[1] = 5
// a[2] = undefined
// a[3] = 9

  七、如何將arguments轉爲數組網絡

  1. Array.prototype.slice.apply(arguments)這是運行效率比較快的方法(看別人資料說的),爲何不是數組也能夠,由於arguments對象有length屬性,而這個方法會根據length屬性,返回一個具備length長度的數組。若length屬性不爲number,則數組長度返回0;因此其餘對象只要有length屬性也是能夠的喲,如對象中有屬性0,對應的就是arr[0],即屬性爲天然數的number就是對應的數組的下標,若該值大於長度,固然要割捨啦。
  2. Array.prototype.concat.apply(thisArg,arguments)。,thisArg是新的空數組,apply方法將函數this指向thisArg,arguments作爲類數組傳參給apply。根據apply的方法的做用,即將Array.prototype.slice方法在指定的this爲thisArg內調用,並將參數傳給它。用此方法注意:若數組內有數組,會被拼接成一個數組。緣由是apply傳參的特性。
  3. 利用Array的構造函數,如Array(1,2,3,4,5,6);能夠返回一個傳入的參數的數組,那Array.apply(thisArg,arguments)也能夠將arguments轉化爲數組,果真實驗是能夠的;有沒有什麼影響呢,就是亂用了構造函數,但這也是js的特性嘛。構造函數也是函數。用此方法注意:若數組內有數組,會被拼接成一個數組。緣由是apply傳參的特性。
  4. 用循環,由於arguments相似數組可使用arguments[0]來訪問實參,那麼將每項賦值給新的數組每項,直接複製比push要快,若實參有函數或者對象,就要深拷貝。

       八、如下程序運行結果app

var ninja=function myNinja(){
    alert(ninja==myNinja);
};
ninja();//true
myNinja(); //myNinja is not defined

  九、兼容瀏覽器的獲取指定元素的樣式屬性的方法

function getStyle(elem, name){
  //若是屬性存在於style[]中,直接取
  if(elem.style[name]){
    return elem.style[name];
  } 
  //不然 嘗試IE的方法
  else if(elem.currentStyle){
    return elem.currentStyle[name];
  }
  //嘗試W3C的方式
  else if(document.defaultView && document.defaultView.getComputedStyle){
    //W3C中爲textAlign樣式,轉爲text-align
    name = name.replace(/([A-Z])/g, "-$1");
    name = name.toLowerCase();
    
    var s = document.defaultView.getComputedStyle(elem, "");
    return s && s.getPropertyValue(name);
  } else {
    return null;
  }
  
}
相關文章
相關標籤/搜索