恒星計劃-前端試題

為了提高公司內小伙伴的前端業務水平,每個月都有一個前端的測試,以下是第一期試題以及參考答案

恒星計劃第一期-前端考試

1. let const var 區別

var let const
函數級作用域 塊級作用域 塊級作用域
變量提升 不存在變量提升 不存在變量提升
值可更改 值可更改 值不可更改
- 暫時性鎖區特性 如果變量是基本數據類型,不能更改值;如果是復雜數據類型,則不能更改內存地址。

2. js 中 this 的指向

this 的指向,是當我們調用函數的時候指定的,調用方式的不同,決定了 this 指向的不同

調用方式 this 指向
普通函數調用 window
定時器函數 window
立即執行函數 window
對象方法調用 該方法所屬的對象
事件綁定方法 綁定事件的對象
構造函數調用 實例對象,原型對象里面的方法也指向實例對象

3. call、apply、bind 的區別

  • 不同點
    • call 和 apply 會調用函數,并且改變函數內部 this 指向
    • call 和 apply 傳遞的參數不一樣,前者傳遞參數使用逗號隔開,apply 使用數組傳遞
    • bind 不會調用函數,但可以改變函數內部 this 指向
  • 應用場景
    • call 經常做繼承
    • apply 經常跟數組有關,比如借助數學對象方法找出數組最大值最小值
    • bind 方法執行后,返回的是原函數改變 this 指向之后的新函數,比如改變定時器內部 this 指向

3,js 中繼承各自有什么特點

  • 原型鏈繼承

    • 主要代碼

    • Child.prototype = new Parent()
      
    • 特點

      • 引用類型的屬性被所有實例共享
      • 在創建子類實例時,不能向父類傳參
  • 構造函數繼承

    • 主要代碼

    • function Child() {
          Parent.call(this)
      }
      
    • 特點

      • 避免了引用類型的屬性被所有實例共享
      • 可以在 Child 中向 Parent 傳參
      • 方法都在構造函數中定義,每次創建實例都會創建一遍方法
  • 組合繼承:以上兩種繼承的組合

    • 主要代碼

    • function Child (name, age) {
          Parent.call(this, name)
          this.age = age
      }
      Child.prototype = new Parent()
      Child.prototype.constructor = Child
      
    • 特點

      • 融合原型鏈繼承和構造函數繼承的優點,是最常用的繼承模式
  • 原型式繼承

    • 主要代碼

    • function createObj(o){
          function F() {}
          F.prototype = o;
          return new F()
      }
      
    • 特點:

      • 就是 Object.create 的模擬實現,將傳入對象作為創建對象的原型
      • 包含引用類型的屬性值始終都會共享相應的值,類似原型鏈繼承
  • 寄生組合式繼承

    • 主要代碼

    • function Child (name, age) {
          Parent.call(this, name)
          this.age = age
      }
      Child.prototype = Object.create(Parent.prototype)
      Child.prototype.constructor = Child
      
    • 特點:

      • 比起組合繼承少調用一次 Parent 構造函數
      • 引用類型最理想的繼承方式

4. new 關鍵字的作用

  • 在內存中創建一個新對象
  • 該新對象會被鏈接到原型鏈上
  • 把 this 指向創建出來的空對象,并執行構造函數中的代碼
  • 如果函數沒有返回其它對象,則返回這個新對象

5. js中創建對象的方式

  • 使用 new Object 創建對象
  • 使用對象字面量創建對象
  • 使用構造函數創建對象

6. ES6怎么定義類,以及實現類的繼承

  • 通過class關鍵字創建類
    • class Animal {}
  • 通過 extends 關鍵字實現繼承
    • class Dog extends Animal{}

7. JS中對象訪問規則

  • 通過 . 方式訪問,如: obj.a
  • 通過中括號的方式訪問,如:obj['hello-world']

8. JS中構造函數和Object的原型鏈搜索機制

  • 先從對象自身查找,找到則直接訪問,結束查找
  • 如果找不到則沿著原型鏈依次往上查找,找到則直接訪問
  • 如果最終來到原型鏈頂端,Object.prototye 還是沒有找到的話則直接返回 undefined

9. 構造函數和普通函數的區別

  • 本質上來說構造函數和普通函數沒有任何區別
  • 它們只有調用方式的不同,構造函數通過new操作符調用的時候會返回一個新對象

10. promise 主要解決了什么問題,如何一直 .then 下去

  • 主要解決了無限嵌套回調地獄的問題
  • promise 實例擁有的then方法,而then方法返回的結果也會被js包裝成promise實例,所以能夠一直 .then 下去

11. ES6 怎么實現數組去重

  • Array.from(new Set(arr))

12. ES6中字符串新增了哪些方法

  • 模板字符串

  • padStart, padEnd

  • startsWith, endsWith

  • includes

  • repeat

13. 代碼實現數組從小到大排序,至少兩種方式

  • var arr = [1,2,1,3,4]
    for (let i = 0; i < arr.length; i++){
      for (let j = i; j < arr.length; j++){
          if (arr[i] > arr[j]) {
              var max = arr[i]
              arr[i] = arr[j]
              arr[j] = max
          }
      }
    }
    console.log(arr)
    
  •   var arr = [1,3,2,-1]
      var newArr = []
      for (;arr.length>0;) {
        var min = Math.min.apply(null, arr)
        newArr.push(min)
        var index = arr.findIndex(x => x === min)
        arr.splice(index, 1)
      }
      
      console.log(newArr)
    
  • arr.sort((a, b) => a - b)
    

14. 使用 proxy 實現觀察者模式

觀察者模式是行為模式之一,它的作用是當一個對象的狀態發生變化時,能夠自動通知其他關聯對象,自動刷新對象狀態。

const callbacks = new Set();
const observe = fn => callbacks.add(fn)
const observable = obj => new Proxy(obj, {set})

function set(target, key, value, receiver) {
    const result = Reflect.set(target, key, value, receiver);
    callbacks.forEach(observe => observe());
    return result;
}

// 一個可觀察的對象
const person = observable({name: 'hui', age: 22})
function change() {
    console.log(`${person.name} is ${person.age}`)
}
observe(change)
pserson.age = 33
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 27,559評論 1 45
  • 第一章 錯誤處理: 錯誤: 程序運行過程中,導致程序無法正常執行的現象(即bug) 現象: 程序一旦出錯,默認會報...
    fastwe閱讀 1,132評論 0 1
  • 前端開發面試題 面試題目: 根據你的等級和職位的變化,入門級到專家級,廣度和深度都會有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,602評論 0 7
  • title: js面向對象date: 2017年8月17日 18:58:05updated: 2017年8月27日...
    lu900618閱讀 574評論 0 2
  • (一) “大鎖!你又去哪里偷玩了!”只見一個穿著樸素面容兇惡的黑胡子老頭對站在一個滿臉泥土的毛頭小子背后呵斥著,那...
    十里明月閱讀 1,315評論 14 16