【面試寶典】每天5道題,溫故而知新

面試寶典.jpeg

本系列文章針對目前常見的面試題,僅提供了相應(yīng)的核心原理及思路,部分邊界細節(jié)未處理。后續(xù)會持續(xù)更新,希望對你有所幫助。

這是今天的題目,你可以先思考一下,然后重點關(guān)注不熟悉的~
  • JS中基本數(shù)據(jù)類型有哪幾種?基本數(shù)據(jù)和復雜數(shù)據(jù)類型有什么區(qū)別?

  • JavaScript中什么是閉包?寫出一個例子

  • 如何正確判斷this的指向?(注意區(qū)分嚴格模式和非嚴格模式)?

  • 說一下對call、apply、bind三個函數(shù)的認識?自己實現(xiàn)一下bind方法

  • JavaScript實現(xiàn)一個繼承方法

逐個擊破

1.JS中數(shù)據(jù)類型有哪幾種?有什么區(qū)別?

最新的 ECMAScript 標準定義了 7 種數(shù)據(jù)類型:

  • 簡單(基本)數(shù)據(jù)類型 Undefined、Null、Boolean、Number、String、 Symbol類型(ES6新增)

  • 復雜數(shù)據(jù)類型:Object

注意一下兩種特殊類型:
  • Unndefined類型:該類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined。無論在什么情況下都沒有必要把一個變量的值顯式地設(shè)置為undefined。
  • Null類型:該類型同樣只有一個值,即null。從邏輯角度來看,null表示一個空指針對象,而這也正式使用typeof操作符檢測null值時會返回object的原因。事實上,undefined值是派生自null值的。
基本數(shù)據(jù)和復雜數(shù)據(jù)類型的區(qū)別
  • 基本類型值:指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段;
  • 引用類型值(復雜數(shù)據(jù)):指的是那些保存在堆內(nèi)存中的對象,意思是,變量中保存的實際上只是一個指針,這個指針指向內(nèi)存堆中實際的值;
兩種訪問方式的區(qū)別
  • 基本類型值:按值訪問,操作的是他們實際保存的值;
  • 引用類型值:按引用訪問,當查詢時,我們需要先從棧中讀取內(nèi)存地址,然后再順藤摸瓜地找到保存在堆內(nèi)存中的值;


    棧和堆.jpeg
兩種類型復制的區(qū)別
  • 基本類型變量的復制:
    從一個變量向一個變量復制時,會在棧中創(chuàng)建一個新值,然后把值復制到為新變量分配的位置上,改變源數(shù)據(jù)不會影響到新的變量(互不干涉);

  • 引用類型變量的復制:
    復制的是存儲在棧中的指針,將指針復制到棧中為新變量分配的空間中,而這個指針副本和原指針執(zhí)行存儲在堆中的同一個對象,復制操作結(jié)束后,兩個變量實際上將引用同一個對象;因此改變其中的一個,將影響另一個;

2.JavaScript中什么是閉包?寫出一個例子?

閉包就是定義在函數(shù)內(nèi)部,能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。

舉例:用閉包實現(xiàn)一個計數(shù)器

function createCounter() {
        let counter = 0;
        return function () {
            counter = counter + 1;
            return counter
        };
    }
    const increment = createCounter();
    const c1 = increment();
    const c2 = increment();
    const c3 = increment();
    console.log('example increment', c1, c2, c3);//1,2,3

閉包的用途:

  • 可以讀取函數(shù)內(nèi)部的變量,

  • 讓這些變量的值始終保持在內(nèi)存中。

使用閉包注意點

  • 由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大

  • 閉包會在父函數(shù)外部,注意不能隨便改變父函數(shù)內(nèi)部變量的值

還有疑問的話可以查看我這篇文章【JS基礎(chǔ)系列】帶你深入理解閉包

3.如何正確判斷this的指向(注意區(qū)分嚴格模式和非嚴格模式)?

this的指向總共可以分為五種:

  • 默認綁定(非嚴格模式-window,嚴格模式-undefined)
  • 隱式綁定(一般是上下文,特殊情況指向window或者undefined)
  • 顯式綁定(指向綁定的對象,特殊情況指向window或者undefined)
  • new綁定(一般指向新對象,但是返回function或object時,指向返回的對象)
  • 箭頭函數(shù)綁定(指向上下文中的this)

還有疑問的話可以查看我這篇文章【JS基礎(chǔ)系列】如何正確判斷this的指向?

4.說一下對call、apply、bind三個區(qū)別?自己實現(xiàn)一下bind方法

在JS中,call、apply和bind是Function對象自帶的三個方法,這三個方法的主要作用是改變函數(shù)中的this指向。

call、apply、bind方法的共同點和區(qū)別:

  • 三者都是用來改變函數(shù)的this對象的指向的;
  • 三者第一個參數(shù)都是this要指向的對象,也就是想指定的上下文(函數(shù)的每次調(diào)用都會擁有一個特殊值——本次調(diào)用的上下文(context)——這就是this關(guān)鍵字的值。);
  • 三者都可以利用后續(xù)參數(shù)傳參;
  • bind 是返回對應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。
  • apply、call 二者而言,作用完全一樣,只是接受參數(shù)的方式不太一樣。
var func = function(arg1, arg2) {};
func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])
func.bind(this, arg1, arg2)()

其中 this 是你想指定的上下文,他可以是任何一個 JavaScript 對象(JavaScript 中一切皆對象),call 需要把參數(shù)按順序傳遞進去,而 apply 則是把參數(shù)放在數(shù)組里。

下面自己實現(xiàn)一個bind方法:

Function.prototype.bind2 = function (context) {
    if (typeof this !== "function") {
      throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
    }
    var self = this;
    var args = Array.prototype.slice.call(arguments, 1);
    var fNOP = function () {};
    var fBound = function () {
        var bindArgs = Array.prototype.slice.call(arguments);
        return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs));
    }
    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
    return fBound;
}

還有疑問的話可以查看我這篇文章【JS基礎(chǔ)系列】bind方法的模擬實現(xiàn)

5.js實現(xiàn)一個繼承方法

// 借用構(gòu)造函數(shù)繼承實例屬性
function Child () {
  Parent.call(this)
}
// 寄生繼承原型屬性
(function () {
  let Super = function () {}
  Super.prototype = Parent.prototype
  Child.prototype = new Super()
})()

恭喜你,又掌握了一個新技能~

喜歡就點個關(guān)注吧~??

關(guān)注微信公眾號【前端FE】了解更多哦~

公眾號:【前端FE】.PNG

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,540評論 0 21
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,963評論 0 5
  • JavaScript語言精粹 前言 約定:=> 表示參考相關(guān)文章或書籍; JS是JavaScript的縮寫。 本書...
    微笑的AK47閱讀 663評論 0 3
  • 函數(shù)只定義一次,但可能被執(zhí)行或調(diào)用任意次。JS函數(shù)是參數(shù)化的,函數(shù)的定義會包括一個稱為形參的標識符列表,這些參數(shù)在...
    PySong閱讀 685評論 0 0
  • 函數(shù)只定義一次,但可能被執(zhí)行或調(diào)用任意次。JS函數(shù)是參數(shù)化的,函數(shù)的定義會包括一個稱為形參的標識符列表,這些參數(shù)在...
    PySong閱讀 383評論 0 0

友情鏈接更多精彩內(nèi)容