# 前端面試準(zhǔn)備(day1)

js算法與應(yīng)用

排序部分

快速排序

    // 從小到大的快速排序
        function sort(array){
            //slice用于截取數(shù)組,通過(guò)slice,從0到arr.length 復(fù)制出一個(gè)新的數(shù)組
            var temp_array = array.slice(0)
             quickSort = function(arr){
                  //數(shù)組已經(jīng)為空了
                   if(arr.length<=1){
                    return arr;
                   }
                   //數(shù)組可以繼續(xù)分割
                   //獲取中間元素坐標(biāo),并取出該元素
                   var provIndex = Math.floor(arr.length/2),
                       prov   = arr.splice(provIndex,1)[0],
                            left = [],
                            right = [];

                            for(var i = 0 ; i<arr.length ; i++){
                                  if(arr[i]>prov){
                                      //大于中間元素向右
                                      right.push(arr[i])
                                  }else{
                                    left.push(arr[i])
                                  }
                            }

                           return quickSort(left).concat([prov],quickSort(right))
            }
            return quickSort(temp_array);
        }

優(yōu)化過(guò)的冒泡排序

//優(yōu)化后的冒泡排序
    function baboSort(arr){
        //復(fù)制數(shù)組
        var temp_arr  = arr.slice(0),tag,temp;
        for(var i = 0 ;i<temp_arr.length ;i++){
              tag = 0;
              for(var j =temp_arr.length-1 ;j>i ;j--){
                   if(temp_arr[j]>temp_arr[j+1]){
                       temp = temp_arr[j];
                       temp_arr[j] = temp_arr[j+1];
                       temp_arr[j+1] = temp ; 
                       tag = 1;
                   }
              }
              if(tag === 0 ){break}
        }
        return temp_arr;
    }

數(shù)組去重

   //消除數(shù)組重復(fù)
   var array = [4,2,5,2,8,4,9,1,1]
   //方法一耍铜、現(xiàn)代瀏覽器方法(IE9春叫,chrome,edge,firefox..)
    var newArray = array.filter(function(ele, pos,self){
        return pos === self.indexOf(ele)
    })
  
   //方法二噪矛、
function unique(arr) {
    var ret = [];
    var len = arr.length;
    var tmp = {};
    var tmpKey;
    for(var i=0; i<len; i++){
        //序列成一個(gè)鍵進(jìn)行去重
        tmpKey = typeof arr[i] + JSON.stringify(arr[i]);
        if(!tmp[tmpKey]){
            tmp[tmpKey] = 1;
            ret.push(arr[i]);
        }
    }
    return ret;
} 
  console.log(unique(array))
  //方法三小渊、(es6 IE 11 CHROME 38)
  function unique(arr){
    //set元素都是唯一的
    var set =new Set(arr);
     return Array.from(set)
  }

編寫一個(gè)JavaScript函數(shù)放可,輸入指定類型的選擇器(僅需支持id谒臼,class,tagName三種簡(jiǎn)單CSS選擇器耀里,無(wú)需兼容組合選擇器)可以返回匹配的DOM節(jié)點(diǎn)蜈缤,需考慮瀏覽器兼容性和性能。

var query = function(selector) {
                var reg = /^(#)?(\.)?(\w+)$/img;
                var regResult = reg.exec(selector);
                var result = [];
                //如果是id選擇器
                if(regResult[1]) {
                    if(regResult[3]) {
                        if(typeof document.querySelector === "function") {
                            result.push(document.querySelector(regResult[3]));
                        }
                        else {
                            result.push(document.getElementById(regResult[3]));
                        }
                    }
                }
                //如果是class選擇器
                else if(regResult[2]) {
                    if(regResult[3]) {
                        if(typeof document.getElementsByClassName === 'function') {
                            var doms = document.getElementsByClassName(regResult[3]);
                            if(doms) {
                                result = converToArray(doms);
                            }
                        }
                        //如果不支持getElementsByClassName函數(shù)
                        else {
                            var allDoms = document.getElementsByTagName("*") ;
                            for(var i = 0, len = allDoms.length; i < len; i++) {
                                if(allDoms[i].className.search(new RegExp(regResult[2])) > -1) {
                                    result.push(allDoms[i]);
                                }
                            }
                        }
                    }
                }
                //如果是標(biāo)簽選擇器
                else if(regResult[3]) {
                    var doms = document.getElementsByTagName(regResult[3].toLowerCase());
                    if(doms) {
                        result = converToArray(doms);
                    }
                }
                return result;
            }

            function converToArray(nodes){
                  var array = null;         
                  try{        
                        array = Array.prototype.slice.call(nodes,0);//針對(duì)非IE瀏覽器         
                  }catch(ex){
                      array = new Array();         
                      for( var i = 0 ,len = nodes.length; i < len ; i++ ) { 
                          array.push(nodes[i])         
                      }         
                  }      
                  return array;
          }

實(shí)現(xiàn)對(duì)象的clone

// 方法一:
Object.prototype.clone = function(){
        //根據(jù)構(gòu)造函數(shù)判斷是數(shù)組還是對(duì)象,分別初始化
        var o = this.constructor === Array ? [] : {};
        for(var e in this){
               //是對(duì)象就遞歸調(diào)用clone 是數(shù)組就根據(jù)(e)index 賦值
                o[e] = typeof this[e] === "object" ? this[e].clone() : this[e];
        }
        return o;
}

//方法二:
  /**
     * 克隆一個(gè)對(duì)象
     * @param Obj
     * @returns
     */
    function clone(Obj) {
        var buf;
          //判斷實(shí)例
        if (Obj instanceof Array) {
            buf = [];                    //創(chuàng)建一個(gè)空的數(shù)組 
            var i = Obj.length;
            while (i--) {
                buf[i] = clone(Obj[i]);
            }
            return buf;
        }else if (Obj instanceof Object){
            buf = {};                   //創(chuàng)建一個(gè)空對(duì)象 
            for (var k in Obj) {           //為這個(gè)對(duì)象添加新的屬性 
                buf[k] = clone(Obj[k]);
            }
            return buf;
        }else{                         //普通變量直接賦值
            return Obj;
        }
    }

小題合集

生成[x,y]范圍的隨機(jī)整數(shù)

function Random(min,max){
    return Math.random()*(max-min)+min+1
}
//random產(chǎn)生[0,1) 如果要達(dá)到1的便捷需要+1

小數(shù)精度問(wèn)題 0.2+0.1?

console.log(0.2 + 0.1);//0.30000000000000004 精度丟失
//解決辦法
 function add(num1, num2){
  let r1, r2, m;
  //轉(zhuǎn)換為字符串來(lái)獲取小數(shù)位數(shù)
  r1 = (''+num1).split('.')[1].length;
  r2 = (''+num2).split('.')[1].length;
  //取位數(shù)最長(zhǎng)的
  m = Math.pow(10,Math.max(r1,r2));
  return (num1 * m + num2 * m) / m;
}
console.log(add(0.2+0.1)) //0.3

已知數(shù)組var stringArray = [“This”, “is”, “Baidu”, “Campus”]冯挎,Alert出”This is Baidu Campus”

var stringArray = ['This', 'is', 'Baidu', 'Campus']
console.log(stringArray.join(" "))

已知有字符串foo=”get-element-by-id”,寫一個(gè)function將其轉(zhuǎn)化成駝峰表示法”getElementById”

function hump(str){
     var newStr = "", flag  = false;
     for(var i = 0 ; i<str.length; i++){
          if(str[i]==='-'){
             flag = true;
          }else{
            if(flag){
                newStr += str[i].toUpperCase(); 
                flag = false;
            }else{
                newStr += str[i]; 
            }
            
          }
     }
     return newStr;
}

var numberArray = [3,6,2,4,1,5]; 實(shí)現(xiàn)倒排底哥,排序。

//順排,倒排
var numberArray = [3,6,2,4,1,5]; 
//sort實(shí)現(xiàn)
var sortArr = numberArray.sort(function(a,b){
    return a - b;
})
//倒排
var sortArr = numberArray.sort(function(a,b){
    return b - a;
})

怎樣添加房官、移除趾徽、移動(dòng)、復(fù)制翰守、創(chuàng)建和查找節(jié)點(diǎn)


 createDocumentFragment()    //創(chuàng)建一個(gè)DOM片段

      createElement()   //創(chuàng)建一個(gè)具體的元素

      createTextNode()   //創(chuàng)建一個(gè)文本節(jié)點(diǎn)

//添加孵奶、移除、替換蜡峰、插入

      appendChild()

      removeChild()

      replaceChild()

      insertBefore()
//查找

   getElementsByTagName()    //通過(guò)標(biāo)簽名稱

      getElementsByName()    //通過(guò)元素的Name屬性的值

      getElementById()    //通過(guò)元素Id了袁,唯一性
      querySelector()    // 查找單個(gè)元素
      querySelectorAll()  //查找所有元素

將一個(gè)#fffff類型的數(shù)據(jù)轉(zhuǎn)換為rgb(255,255,255)形式

遍歷ul中l(wèi)i的內(nèi)容

  (function(){
               var liList = document.getElementsByTagName("li");
                   for(var i = 0 ; i<liList.length ;i++){
                    console.log(liList[i].innerHTML);
                   }
             })()

查找一個(gè)對(duì)象是否具有某個(gè)屬性

            function getNodeById(data,id){
                 if(data['id']==id){
                    return data;
                 }else{
                     if(data.hasOwnProperty("children")){
                          var node = null ;
                          data["children"].every(function(element){
                                 node = getNodeById(element,id); 
                                 if(node){ 
                                    return ;
                                 }else{
                                    return true;
                                 }
                          }) 
                         return node;
                     }else{
                        //找不到節(jié)點(diǎn)
                        return ;
                     }
                 }
            }

請(qǐng)寫出以下執(zhí)行結(jié)果

var myObject = {
    foo: "bar",
    func: function() {
        //指向?qū)ο髆yObject
        var self = this;
        console.log("outer func:  this.foo = " + this.foo);
        console.log("outer func:  self.foo = " + self.foo);
        (function() {
          //this指向windows 嚴(yán)格模式指向undefined
            console.log("inner func:  this.foo = " + this.foo);
            //指向?qū)ο?            console.log("inner func:  self.foo = " + self.foo);
        }());
    }
};
myObject.func();

請(qǐng)寫出以下執(zhí)行結(jié)果

function foo1()
{
  return {
      bar: "hello"
  };
}

function foo2()
{
  return
  {
      bar: "hello"
  };
}
console.log(foo1())//{bar:"hello"}
console.log(foo2())//undefined
//why?,等價(jià)于
function foo3()
{
  return;
  {
      bar: "hello"
  };
}
console.log(foo3())

關(guān)于NaN ,NaN是一個(gè)數(shù)字嗎朗恳? 判斷NaN

console.log(typeof NaN);//number
console.log(Number.isNaN(NaN))//true
console.log(NaN === NaN);//false
console.log(NaN == NaN);// fals

變量問(wèn)題

//2、變量問(wèn)題
(function(){
  var a = b = 3;
  //a是局部變量,b是全局變量
  //等價(jià)于 var a = b ,b = 3 ;
})();

console.log("a defined? " + (typeof a !== 'undefined'));   
console.log("b defined? " + (typeof b !== 'undefined'));

var a = {
  n:1
},
b = a ;
a.x = a = {n:2}
/*
(先尋找變量再賦值)第一階段初始化的時(shí)候值已經(jīng)保存下來(lái)了 a.x是a的引用指向x,此時(shí)x未聲明所以此時(shí)指向null,a已經(jīng)聲明了,a指向堆中的常量{n:1},
第二階段賦值, a指向堆中的常量{n:2},a.x指向a即指向常量{n:2}
需要注意的是此時(shí)a.x在第一階段保存的引用是一開(kāi)始a的變量位置,跟賦值過(guò)來(lái)的a已經(jīng)不是一個(gè)變量了
*/
console.log(b)//{n:1}
console.log(a)//{n:2}
console.log(a.x)//undefined


  var a = 2, b=1;
    function temp(a){
       //a有聲明所以作為局部變量處理
       a = 4 ;
       console.log(a)//4
       //b無(wú)聲明所以當(dāng)做全局變量
       b = 4 
       console.log(b)//4
       //全局變量處理
       c = 5 
       console.log(c)//5
    }
   // temp()
   // temp(4)
   //如果將所在函數(shù)注釋后會(huì)如何载绿?ReferenceError: c is not defined
   console.log(a)//2
   console.log(b)//4
   console.log(c)//5
   

寫一個(gè)按照下面方式調(diào)用都能正常工作的 sum 方法

console.log(sum(2,3));   // Outputs 5
console.log(sum(2)(3));  // Outputs 5
function sum(){
    var sum =0;
  if(arguments.length<=1){
     sum = arguments[0];
    //只有一個(gè)情況下需要儲(chǔ)存當(dāng)前參數(shù)用作下次累加
    return function(value){
      sum += value
      return sum;
    }
  }else{
       return [].reduce.call(arguments,function(sum,value){
        return sum+value;
       },0)
  }
}
//由此引出
 /*
由此延伸call apply call,apply的不同點(diǎn)
call(context,arguments...) //arguments... 是若干個(gè)參數(shù)
apply(context,arguments) //arguments 是 數(shù)組
call的調(diào)用速度比apply快
相同點(diǎn) 改變函數(shù)執(zhí)行的環(huán)境
第一次參數(shù)為null的時(shí)候指向windows
 模擬實(shí)現(xiàn)call,apply僻肖?
 見(jiàn)https://github.com/mqyqingfeng/Blog 獲益良多
 最關(guān)鍵的是
模擬的步驟可以分為:
將函數(shù)設(shè)為對(duì)象的屬性
執(zhí)行該函數(shù)
刪除該函數(shù)
 */

IIFE (Immediately-Invoked Function Expression)

for(var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);  
    }, 1000);
}
//輸出的是5個(gè)5
//解決方式
for(var i = 0; i < 5; i++) {
    (function(i){
        setTimeout(function() {
        console.log(i);  
    }, 1000);
    })(i)
}
//1 2 3 4 5
//那這個(gè)呢?
for(var i = 0; i < 5; i++) {
    (function(){
        setTimeout(function() {
        console.log(i);  
    }, 1000);
    })(i)
}
//i此時(shí)使用的還是外部的i 因?yàn)檫@樣就是提供參數(shù),但是函數(shù)本身沒(méi)有形參
//es6解決辦法卢鹦?
for(let i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);  
    }, 1000);
}
//可以延伸到什么部分臀脏?
console.log(5)
for(let i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);  
    }, 1000);
}
console.log(5)
//執(zhí)行順序 5->5->1~4
//原因?eventLoop,再看一個(gè)

var start = new Date();
setTimeout(function(){
  console.log(4)
  var time = start - new Date();
  console.log(`time is `)
},2)
setTimeout(function(){
  console.log(4)
  var time = start - new Date();
  console.log(`time2 is `)
},0)

//time 是多少?  還有這個(gè)又是多少冀自?
//基于 chrome 版本 59.0.3071.115(正式版本) (64 位)
/* 像定時(shí)器揉稚、計(jì)時(shí)器  Promise 這類的異步操作   是放在任務(wù)隊(duì)列中的,只有js主進(jìn)程棧中的任務(wù)執(zhí)行完才會(huì)執(zhí)行。詳情見(jiàn) http://www.ruanyifeng.com/blog/2014/10/event-loop.html
(基于0秒的setTimeout立即執(zhí)行已過(guò)期)
*/
/*在nodejs中進(jìn)行實(shí)驗(yàn)
hello
4
time2 is
4
time is
結(jié)果相同
但是在nodejs中 eventloop的運(yùn)行機(jī)制與瀏覽器不一樣(暫未深入了解,詳情見(jiàn)阮老師的文章)
*/

IIFE還有用處熬粗?
防止變量污染

類型問(wèn)題

簡(jiǎn)便的類型轉(zhuǎn)換

var num1 ="1a9c",num2 = 19,num3 ="20"
console.log(parseInt(num1)+num2) //20
num1 = "a1"  
console.log(parseInt(num1)+num2) //NaN
console.log(num3-0)  //20

真假值

極假(falsy)
false
null
undefined
' '
0
NaN
其他都是真值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搀玖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驻呐,更是在濱河造成了極大的恐慌灌诅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件含末,死亡現(xiàn)場(chǎng)離奇詭異猜拾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)佣盒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門挎袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肥惭,你說(shuō)我怎么就攤上這事盯仪。” “怎么了蜜葱?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵全景,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我牵囤,道長(zhǎng)爸黄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任奔浅,我火速辦了婚禮馆纳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汹桦。我一直安慰自己鲁驶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布舞骆。 她就那樣靜靜地躺著钥弯,像睡著了一般径荔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脆霎,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天总处,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绘闷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荸频,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼客冈!你這毒婦竟也來(lái)了旭从?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤场仲,失蹤者是張志新(化名)和其女友劉穎和悦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體渠缕,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸽素,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褐健。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片付鹿。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澜汤,死狀恐怖蚜迅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俊抵,我是刑警寧澤谁不,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站徽诲,受9級(jí)特大地震影響刹帕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谎替,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一偷溺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钱贯,春花似錦挫掏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褒傅。三九已至,卻和暖如春袄友,著一層夾襖步出監(jiān)牢的瞬間殿托,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工剧蚣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留支竹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓鸠按,卻偏偏與公主長(zhǎng)得像唾戚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子待诅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前端開(kāi)發(fā)面試題 面試題目: 根據(jù)你的等級(jí)和職位的變化叹坦,入門級(jí)到專家級(jí),廣度和深度都會(huì)有所增加卑雁。 題目類型: 理論知...
    怡寶丶閱讀 2,587評(píng)論 0 7
  • 前端面試問(wèn)題集錦 JavaScript 部分 1募书、JQuery $(document).ready() 和 win...
    涯無(wú)凌閱讀 945評(píng)論 0 2
  • 來(lái)源:BAT及各大互聯(lián)網(wǎng)公司2014前端筆試面試題--JavaScript篇 1、JavaScript是一門什么樣...
    darr250閱讀 2,291評(píng)論 0 17
  • PNG 有PNG8和truecolor PNG PNG8類似GIF顏色上限為256测蹲,文件小莹捡,支持alpha透明度,...
    hudaren閱讀 1,526評(píng)論 0 0
  • 如何控制alert中的換行扣甲?\n alert(“p\np”); 請(qǐng)編寫一個(gè)JavaScript函數(shù) parseQu...
    heyunqiang99閱讀 1,086評(píng)論 0 6