JS基礎(chǔ)

JavaScript 面試

JS基礎(chǔ)篇

變量類型和計(jì)算

  • JS中使用typeof能得到哪些類型
    -undefinded
    • string
    • number
    • boolean
    • object
    • function
  • 何時使用 === 何時用 ==
    if (obj.a == null) {
        // 這里相當(dāng)于obj.a === null || obj.a === undefined
    }
  • JS中有哪些內(nèi)置函數(shù)
    • Array
    • Object
    • RegExp
    • Date
    • Error
    • Function
    • Boolean
    • String
    • umber
  • JS變量按照存儲方式區(qū)分為哪些類型泞遗,并描述其特點(diǎn)

區(qū)分為值類型栏渺、引用類型。值類型的值復(fù)制之后不會相互干涉山析,引用類型的值復(fù)制是變量指針的復(fù)制箭跳,并不是真正的值的拷貝

  • 如何理解JSON

JSON只不過是JS對象

原型和原型鏈

JS三座大山之一

  • 如何準(zhǔn)確判斷一個變量是數(shù)組類型

instanceof。用于判斷引用類型屬于哪個構(gòu)造函數(shù)的方法

  • 寫一個原型繼承的例子
function Elem(id) {
    this.elem = document.getElementById(id)
}
Elem.prototype.html = function (val) {
    var elem = this.elem
    if (val) {
        elem.innerHtml = val
        return this
    } else {
        return elem.html()
    }
}
Elem.prototype.on = function (type, fn) {
    var elem = this.elem
    elem.addEventListener(type, fn)
    return this
}
var fuck = new Elem('fuck')
fuck.html('<p>hello</p>').on('click', function () {
    alert('clicked!')
})
  • 描述new一個對象的過程
    • 創(chuàng)建一個新對象
    • this指向這個新對象
    • 執(zhí)行代碼萌狂,即對this賦值
    • 返回this
  • zepto源碼中如何使用原型鏈

作用域和閉包

  • 說下對變量提升的理解

變量定義函數(shù)聲明都會提前定義

  • 說明this幾種不同的使用場景
    • 作為構(gòu)造函數(shù)執(zhí)行
    • 作為對象屬性執(zhí)行
    • 作為普通函數(shù)執(zhí)行
    • call apply bind
  • 創(chuàng)建10個<a>標(biāo)簽,點(diǎn)擊時彈出對應(yīng)的序號
for (var i = 0; i < 10; i++) {
    (function (i) {
        var a = document.createElement('a')
        a.innerHTML = i + '<br>'
        a.addEventListener('click', function (e) {
            e.preventDefault()
            alert(i)
        })
        document.body.appendChild(a)
    })(i)
}
  • 如何理解作用域
    • 自由變量
    • 作用域鏈
    • 閉包的兩個場景 (函數(shù)作為值返回怀泊,函數(shù)作為參數(shù)傳遞)
  • 實(shí)際開發(fā)中閉包的應(yīng)用

封裝變量茫藏,收斂權(quán)限

function isFirstLoad() {
    var _list = []
    // 保護(hù)了_list變量
    return function (id) {
        if (_list.indexOf(id) >= 0) {
            return false
        } else {
            _list.push(id)
            return true
        }
    }
}
var firstLord = isFirstLoad()
firstLord(10)   // true
firstLord(10)   // false
firstLord(20)   // true

異步和單線程

  • 同步和異步的區(qū)別是什么

同步會阻塞代碼執(zhí)行,異步不會

  • 一個關(guān)于setTimeout的筆試題
  • 前端使用異步的場景有哪些
    • 定時任務(wù):setTimeout霹琼、setInterval
    • 網(wǎng)絡(luò)請求:ajax加載刷允、動態(tài)<img>加載
    • 事件綁定

其他

  • 獲取2017-06-10格式的日期
function formateDate(dt) {
    if (!dt) {
        dt = new Date()
    }
    var year = dt.getFullYear()
    var month = dt.getMonth()
    var date = dt.getDate()
    if (month < 10) {
        month = '0' + month
    }
    if (date < 10) {
        date = '0' + date
    }
    return year + '-' + month + '-' + date
}
  • 獲取隨機(jī)數(shù),要求是長度一致的字符串格式
  • 寫一個能遍歷對象和數(shù)組的通用forEach函數(shù)
function forEach(obj, fn) {
    var key
    if (obj instanceof Array) {
        obj.forEach(function (item, index) {
            fn(item, index)
        })
    } else {
        for (key in obj) {
            fn(key, obj[key])
        }
    }
}

webAPI

DOM操作

  • DOM是哪種數(shù)據(jù)結(jié)構(gòu)

  • DOM操作的常用API有哪些
    • 獲取DOM節(jié)點(diǎn)碧囊,以及節(jié)點(diǎn)的property和attribute
    • 獲取父節(jié)點(diǎn)树灶,獲取子節(jié)點(diǎn)
    • 新增節(jié)點(diǎn),刪除節(jié)點(diǎn)
  • DOM節(jié)點(diǎn)的attr和property有何區(qū)別
    • property只是一個JS對象的屬性的修改
    • attribute是對html標(biāo)簽的修改

BOM操作

  • 如何檢測瀏覽器的類型
var ua = navigator.userAgent
var isChrome = ua.indexOf('Chrome')
console.log(isChrome)
  • 拆解url的各部分

location....

事件

  • 編寫一個通用的事件監(jiān)聽函數(shù)
function bindEvent(elem, type, selector, fn) {
    if (fn == null) {
        fn = selector
        selector = null
    }
    elem.addEventListener(type, function (e) {
      var target
      if (selector) {
          target = e.target
          if (target.matches(selector)) {
              fn.call(target, e)
          }
      } else {
          fn(e)
      }  
    })
}
  • 描述事件冒泡流程
    • DOM樹形結(jié)構(gòu)
    • 事件冒泡
    • 阻止冒泡
    • 冒泡的應(yīng)用 ==> 事件代理
  • 對于無限下拉加載圖片的頁面糯而,如何給每個圖片綁定事件

事件代理:代碼簡介天通、減小瀏覽器的壓力

項(xiàng)目運(yùn)行環(huán)境

頁面加載

  • 從輸入url到得到html的詳細(xì)過程
    • 瀏覽器根據(jù)DNS服務(wù)器得到域名的IP地址
    • 向這個IP的機(jī)器發(fā)送http請求
    • 服務(wù)器收到、處理并返回http請求
    • 瀏覽器得到返回的內(nèi)容
  • window.onload和DOMContentLoaded的區(qū)別
    • window.onload是等
      待全部資源都加載完畢才會執(zhí)行熄驼,包括圖片像寒、視頻
    • DOMContentLoaded是當(dāng)DOM結(jié)構(gòu)渲染完成即執(zhí)行,此時圖片瓜贾、視頻可能沒有加載完成

性能優(yōu)化

  • 多使用內(nèi)存诺祸、緩存或者其他方法
  • 減少CPU計(jì)算、減少網(wǎng)絡(luò)

安全性

Snippets

發(fā)生類型轉(zhuǎn)換的場景

  • 字符串拼接
  • == 運(yùn)算符
  • if語句
  • 邏輯運(yùn)算

原型規(guī)則

原型規(guī)則是學(xué)習(xí)原型鏈的基礎(chǔ)

  1. 所有的引用類型都具有對象的特性祭芦,即可用自由擴(kuò)展屬性('null'除外)
  2. 所有的引用類型都有一個proto屬性(隱式原型)筷笨,屬性值是一個普通對象
  3. 所有的函數(shù)都有一個prototype屬性(顯式原型),屬性值是一個普通對象
  4. 所有引用類型的proto屬性值指向它的構(gòu)造函數(shù)的prototype屬性值
  5. 當(dāng)試圖得到一個對象的某個屬性時龟劲,如果這個對象本身沒有這個屬性胃夏,那么會去它的proto(即它的構(gòu)造函數(shù)的prototype)中尋找

執(zhí)行上下文

  • 范圍:一段<script>或者一個函數(shù)
  • 全局:變量定義、函數(shù)聲明
  • 函數(shù):變量定義昌跌、函數(shù)聲明仰禀、this、arguments

this

this要在執(zhí)行時才能確定值蚕愤,定義時無法確認(rèn)

var a = {
    name: 'A',
    fn: function () {
        console.log(this.name)
    }
}
a.fn()  // this ==> a
a.fn.call({name: 'B'})  // this ==> {name: 'B'}
var fn1 = a.fn
fn1()   // this ==> window

作用域

  • 沒有塊級作用域
  • 只有函數(shù)和全局作用域
  • 自由變量:當(dāng)前作用域未定義的變量

linux命令

  • mkdir 創(chuàng)建新文件夾
  • ls 查看當(dāng)前文件夾內(nèi)容
  • pwd 查看當(dāng)前文件夾路徑
  • rm -rf a 刪除文件夾
  • cp 拷貝文件
  • mv 移動文件
  • rm 刪除文件
  • vim 創(chuàng)建并編輯文件
  • cat 查看文件內(nèi)容
  • head 查看文件前部內(nèi)容
  • tail 查看文件末尾內(nèi)容

加載資源的形式

  • 輸入url(或跳轉(zhuǎn)頁面)加載html
  • 加載html中的靜態(tài)資源

加載資源的過程

  • 瀏覽器根據(jù)DNS服務(wù)器得到域名的IP地址
  • 向這個IP的機(jī)器發(fā)送http請求
  • 服務(wù)器收到答恶、處理并返回http請求
  • 瀏覽器得到返回的內(nèi)容

瀏覽器渲染頁面的過程

  • 根據(jù)HTML結(jié)構(gòu)生成DOM tree
  • 根據(jù)CSS生成CSSOM
  • 將DOM和CSSOM整合成RenderTree
  • 根據(jù)將DOM和CSSOM整合成RenderTree開始渲染和展示
  • 遇到script時,會執(zhí)行并阻塞渲染

加載資源優(yōu)化

  • 靜態(tài)資源合并壓縮
  • 靜態(tài)資源緩存
  • 使用CDN讓資源加載更快(不同區(qū)域的網(wǎng)絡(luò)優(yōu)化)
  • 使用SSR后端渲染萍诱,數(shù)據(jù)直接輸出到HTML中

渲染優(yōu)化

  • CSS放錢悬嗓、JS放后面
  • 懶加載(圖片懶加載,下拉加載更多)
  • 減少DOM查詢砂沛,對DOM查詢做緩存
  • 減少DOM操作烫扼,多個操作盡量合并在一起執(zhí)行
  • 事件節(jié)流
  • 盡早執(zhí)行操作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曙求,一起剝皮案震驚了整個濱河市碍庵,隨后出現(xiàn)的幾起案子映企,更是在濱河造成了極大的恐慌,老刑警劉巖静浴,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堰氓,死亡現(xiàn)場離奇詭異,居然都是意外死亡苹享,警方通過查閱死者的電腦和手機(jī)双絮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來得问,“玉大人囤攀,你說我怎么就攤上這事」常” “怎么了焚挠?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長漓骚。 經(jīng)常有香客問我蝌衔,道長,這世上最難降的妖魔是什么蝌蹂? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任噩斟,我火速辦了婚禮,結(jié)果婚禮上孤个,老公的妹妹穿的比我還像新娘剃允。我一直安慰自己,他們只是感情好齐鲤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布硅急。 她就那樣靜靜地躺著,像睡著了一般佳遂。 火紅的嫁衣襯著肌膚如雪营袜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天丑罪,我揣著相機(jī)與錄音荚板,去河邊找鬼。 笑死吩屹,一個胖子當(dāng)著我的面吹牛跪另,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播煤搜,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼免绿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了擦盾?” 一聲冷哼從身側(cè)響起嘲驾,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淌哟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辽故,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徒仓,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年誊垢,在試婚紗的時候發(fā)現(xiàn)自己被綠了掉弛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡喂走,死狀恐怖殃饿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芋肠,我是刑警寧澤壁晒,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站业栅,受9級特大地震影響秒咐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碘裕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一携取、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帮孔,春花似錦雷滋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姆坚,卻和暖如春澳泵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兼呵。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工兔辅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人击喂。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓维苔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親懂昂。 傳聞我的和親對象是個殘疾皇子介时,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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