前端經(jīng)典面試題合集(一)

1.談?wù)勛兞刻嵘?/h3>

考察點(diǎn):js基礎(chǔ)知識(shí),js執(zhí)行機(jī)制,變量的提升
答:執(zhí)行js代碼時(shí)钱烟,會(huì)生成執(zhí)行環(huán)境,在函數(shù)中的代碼會(huì)產(chǎn)生函數(shù)執(zhí)行環(huán)境嫡丙,函數(shù)外的代碼執(zhí)行全局執(zhí)行環(huán)境拴袭,我們看一個(gè)例子:

b() // call b   執(zhí)行b函數(shù),此時(shí)函數(shù)提升曙博,已存入內(nèi)存
console.log(a) // undefined 變量提升但未賦值

var a = 'Hello world'

function b() {
    console.log('call b')
}

此題需要注意拥刻,函數(shù)的變量提升直接將整個(gè)函數(shù)存入內(nèi)存中,而變量則是只聲明變量但是賦值undefined父泳,我們來(lái)看下一題:

b() // call b second  
//執(zhí)行b函數(shù)般哼,此時(shí)相同函數(shù)會(huì)覆蓋上一函數(shù),函數(shù)提升優(yōu)于變量提升惠窄。

function b() {
    console.log('call b fist')
}
function b() {
    console.log('call b second')
}
var b = 'Hello world'

同時(shí)還需注意蒸眠,es6中l(wèi)et聲明也會(huì)被js解析是進(jìn)行變量提升,但是由于let的特性導(dǎo)致聲明的變量不能在聲明前使用杆融。

2.函數(shù)的深拷貝

常用方式:JSON.parse(JSON.stringify(object)) 楞卡、 lodash中的cloneDeep函數(shù)
存在問(wèn)題:
1.該方法會(huì)忽略u(píng)ndefined和symbol
2.不能夠序列化函數(shù)
3.不能解決循環(huán)引用問(wèn)題
接下來(lái)我們看看面試常考的手寫遞歸函數(shù)進(jìn)行深克隆。
我們先從一個(gè)對(duì)象的深克隆流程進(jìn)行分析蒋腮,
分析:首先淘捡,我們清晰對(duì)象中可以包含基礎(chǔ)數(shù)據(jù)類型(string,number,null,undefined,bollen,function)和復(fù)雜數(shù)據(jù)類型(RegExp,Date,Synbol,Set,Map等等),還有dom節(jié)點(diǎn)也可以存在于對(duì)象中池摧,
因此案淋,對(duì)于我們整個(gè)函數(shù)的設(shè)計(jì),我們傳入兩個(gè)參數(shù)险绘,一個(gè)為目標(biāo)對(duì)象source踢京,一個(gè)為我們需要復(fù)制到的目標(biāo)變量target,未傳時(shí)我們?cè)O(shè)計(jì)為undefined宦棺。
1.判斷傳入的target是否為undefined瓣距,如果是的話,我們判斷source是不是dom節(jié)點(diǎn)代咸,是的話蹈丸,使用cloneNode方法進(jìn)行復(fù)制,不是的話進(jìn)行new source.constructor進(jìn)行給target賦值source的相同類型呐芥。
2.通過(guò)Object.getOwnPrototyNames的方法獲取到source的所有屬性逻杖,包括不可枚舉屬性。
3.遍歷我們獲取到的屬性思瘟,再次判斷荸百,有三種情況,第一種:dom節(jié)點(diǎn)滨攻,第二種:基本數(shù)據(jù)類型够话,第三種:復(fù)雜數(shù)據(jù)類型。
4.聲明desc光绕,通過(guò)Object.getOwnPropertypertyDescriptor獲取到此屬性的描述屬性 女嘲,第一種dom節(jié)點(diǎn),使用cloneNode進(jìn)行賦值诞帐,第二種設(shè)計(jì)一個(gè)數(shù)組欣尼,包含所有基本類型,如果使用Includes去處理typeof后的遍歷的項(xiàng)返回值是true停蕉,那么則為基礎(chǔ)類型愕鼓,使用Object.defineProperty去復(fù)制對(duì)象的此條屬性,第三種:進(jìn)行switch判斷谷徙,找到指定的類型進(jìn)行相應(yīng)的處理拒啰,我們都設(shè)置一個(gè)對(duì)象o驯绎,將desc的描述屬性如果是true完慧,我們就添加給o,如果get,set也是屈尼,則同樣添加册着,最后通過(guò)Object.definePropertu加到target的此項(xiàng)復(fù)雜數(shù)據(jù)類型中,再去執(zhí)行遞歸脾歧。
talk is cheap , show me the code

  function cloneObj(source, target) { //兩個(gè)參數(shù)甲捏,第一個(gè)是目標(biāo)對(duì)象,第二個(gè)是我們要將對(duì)象賦值的目標(biāo)
    var list = ["string", "number", "null", "undefined", "bollen", "function"]
    if (target === undefined) {
      if (HTMLElement.prototype.isPrototypeOf(source)) {
        target = source.cloneNode(false)
      } else {
        target = new source.constructor() //將target賦值為和傳入的source一樣的類型
      }
    }
    //獲取對(duì)象的所有屬性鞭执,包括不可枚舉的屬性
    var names = Object.getOwnPropertyNames(source)
    for (var i = 0; i < names.length; i++) { //循環(huán)遍歷我們獲得的屬性
      var desc = Object.getOwnPropertyDescriptor(source, names[i]) // 獲得每一個(gè)屬性的描述屬性
      if (list.includes(typeof desc.value)) { //基本數(shù)據(jù)類型包括司顿,則添加到target中
        Object.defineProperty(target, names[i], desc)
      } else { //不是基本屬性
        var t;
        if (HTMLElement.prototype.isPrototypeOf(desc.value)) {
          t = desc.value.cloneNode(false)
        } else {
          switch (desc.value.constructor) {
            case RegExp:
              t = new RegExp(desc.value.source, desc.value.flags)
              break;
            case Date:
              t = new Date(desc.value)
              break;
            case Symbol:
              t = Symbol
              break;
            case Set:
              t = new Set(desc.value.values())
              break;
            case Map:
              t = new Map(desc.value.entries())
              break;
            default:
              t = new desc.value.constructor();
              break;
          }
        }
        var o = {}
        o.value = t
        desc.enumerable && (o.enumerable = desc.enumerable)
        desc.writable && (o.writable = desc.writable)
        desc.configurable && (o.configurable = desc.configurable)
        desc.set && (o.set = desc.set)
        desc.get && (o.get = desc.get)
        Object.defineProperty(target, names[i], o)
        cloneObj(desc.value, t)
      }
    }
    return target
  }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兄纺,隨后出現(xiàn)的幾起案子大溜,更是在濱河造成了極大的恐慌,老刑警劉巖估脆,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钦奋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疙赠,警方通過(guò)查閱死者的電腦和手機(jī)付材,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)圃阳,“玉大人厌衔,你說(shuō)我怎么就攤上這事捍岳∷钔” “怎么了作喘?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晕城。 經(jīng)常有香客問(wèn)我泞坦,道長(zhǎng),這世上最難降的妖魔是什么砖顷? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任贰锁,我火速辦了婚禮,結(jié)果婚禮上滤蝠,老公的妹妹穿的比我還像新娘豌熄。我一直安慰自己,他們只是感情好物咳,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布锣险。 她就那樣靜靜地躺著芯肤,像睡著了一般巷折。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崖咨,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天锻拘,我揣著相機(jī)與錄音,去河邊找鬼击蹲。 笑死芯丧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的世曾。 我是一名探鬼主播缨恒,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼轮听!你這毒婦竟也來(lái)了骗露?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤血巍,失蹤者是張志新(化名)和其女友劉穎萧锉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體述寡,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柿隙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲫凶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禀崖。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖螟炫,靈堂內(nèi)的尸體忽然破棺而出波附,到底是詐尸還是另有隱情,我是刑警寧澤昼钻,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布掸屡,位于F島的核電站,受9級(jí)特大地震影響然评,放射性物質(zhì)發(fā)生泄漏仅财。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一碗淌、第九天 我趴在偏房一處隱蔽的房頂上張望盏求。 院中可真熱鬧抖锥,春花似錦、人聲如沸风喇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)魂莫。三九已至,卻和暖如春爹耗,著一層夾襖步出監(jiān)牢的瞬間耙考,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工潭兽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倦始,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓山卦,卻偏偏與公主長(zhǎng)得像鞋邑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子账蓉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 關(guān)于對(duì)象的深淺克隆 首先在我們的認(rèn)知中枚碗,存在這復(fù)合數(shù)據(jù)類型,和基本數(shù)據(jù)類型铸本“褂辏基本數(shù)據(jù)類型在使用的時(shí)候是進(jìn)行傳值調(diào)用...
    純粹的少年閱讀 985評(píng)論 2 7
  • 1. 一個(gè)200*200的div在不同分辨率屏幕上下左右居中,用css實(shí)現(xiàn) 2. 寫一個(gè)左中右布局占滿屏幕箱玷,其中左...
    造了個(gè)輪子閱讀 557評(píng)論 0 1
  • 請(qǐng)參看我github中的wiki怨规,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon閱讀 7,133評(píng)論 2 19
  • 隱式類型轉(zhuǎn)換相關(guān) 字符串連接符與算數(shù)運(yùn)算符 字符串連接符+:會(huì)把其他數(shù)據(jù)類型調(diào)用String()方法轉(zhuǎn)換成字符串然...
    wowoqu閱讀 1,383評(píng)論 0 4
  • 漸變的面目拼圖要我怎么拼呀舔? 我是疲乏了還是投降了? 不是不允許自己墜落扩灯, 我沒有滴水不進(jìn)的保護(hù)膜媚赖。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,252評(píng)論 0 13