【前端面試】 - 觀遠數據電話面試題

觀遠數據電話面試題

1. 數據結構中對堆棧鏈的理解

以鏈表形式構建的堆棧數據結構,能夠實現動態增長節點,無需預先分配內存。javascript

2. js中哪些數據是放在堆中,哪些數據是放在棧中?js的基本數據類型和對象有哪些的,null放在哪裏?

js的基本數據類型:

空類型:undefined null
值類型:基本數據類型 String Number Boolean
引用型:複雜數據類型 Object Array 對象css

值類型的值在棧空間存儲,引用類型的對象在堆中存儲,地址在棧中存儲
基本類型(值類型)在調用函數的時候,傳遞的是值
引用類型,在函數調用的時候,傳遞的是地址(引用)html

javascript中的null

null值表示一個空對象指針,而這也正是使用typeof操做符檢測null值會返回「object」的緣由,因此null放在堆中存儲前端

3. es6中對Array的改進有哪些?

  • Array.of 建立一個包含全部參數的數組
  • Array.from 接受可迭代對象或類數組對象,最終返回一個數組
  • find方法和findIndex方法java

    let numbers = [25, 30, 35, 40, 45]
    console.log(numbers.find(n => n > 35))//40
    console.log(numbers.findIndex(n => n > 35))//3
  • Array.fill 用指定的值填充一至多個數組元素
  • copyWithin方法
  • 定型數組 定型數組的length屬性是一個不可寫屬性,因此不能修改定型數組的大小es6

    let buffer = new ArrayBuffer(10)
    let buffer2 = buffer.slice(4, 6)
    console.log(buffer2.byteLength)//2

4. const、let、var比較

clipboard.png

5. 怎麼實現只對對象的某個屬性實現保護

  • const命令只是保證變量名指向的地址不變,並不保證該地址的數據不變
  • 若是真的想將對象凍結,應該使用Object.freeze方法。
  • 使用閉包能夠實現只對對象的某個屬性的保護

6. 對閉包的理解,閉包有什麼做用,怎麼樣實現屬性私有化?

閉包:實如今函數內部的函數
閉包的做用:面試

  • 讀取函數內部的變量
  • 讓這些變量的值始終保存在內存中

閉包的缺點:segmentfault

  • 使用閉包會致使函數中的變量始終保存在內存中,形成內存泄露,解決方法是在調用最後將不使用的變量設置爲undefined進行回收。
  • 閉包會在父函數的外部改變父函數內部的值

實現屬性私有化:
經過閉包實現數組

var ClassA = function()
{
    var name = "yourname"; //私有屬性
     
    var privateMethod = function() //私有方法
    {
        alert("private");
    };
    //getter
    this.getName = function() {
        privateMethod();
        return name;
    }
    //setter
    this.setName = function(newName)
    {
        name = newName;
    }
};

7. Array有哪些方法,哪些方法是改變數組自己的,怎麼樣判斷對象是數組,isArray是誰的方法?

不改變數組的方法:數據結構

  • Array.slice()
  • Array.join()
  • Array.concat()
  • Array.isArray()

改變數組的方法

  • Array.splice()
  • Array.shift()
  • Array.unshift()
  • Array.pop()
  • Array.push()
  • Array.sort0()
  • Array.reverse()

怎麼判斷對象是數組的

function judgeArr(arr){ 
    return Array.isArray(arr); //或者 Object.prototype.toString.call(arr) == '[object Array]' 
}

isArray是Array的方法

8. 怎麼實現數組的遍歷,有哪些方法?

js有以下兩種數據須要常常遍歷
數組(Array)
對象(Object)

同時又提供了以下8種方法方便咱們遍歷元素

  • for (推薦)
  • while(或do~while)(推薦)
  • forEach
  • for in (速度最慢)
  • $.each
  • $(selecter).each
  • map
  • every

9. Array的forEach方法裏有return會怎麼樣?

forEach方法放入break會報錯,return也沒法跳出循環
若是須要在遍歷中跳出循環,可使用Array.some()[return true時跳出循環]或者Array.every()[return false時跳出循環]

10. 如何組織代碼實現輸出兩個數組中相等的元素的?元素可能有基礎數據類型和對象。

遍歷,== 或者 === 判斷便可

11. 爲何要有事件捕獲和事件冒泡兩個階段?

事件捕獲 指的是從document到觸發事件的那個節點,即自上而下的去觸發事件。相反的,事件冒泡 是自下而上的去觸發事件。綁定事件方法的第三個參數,就是控制事件觸發順序是否爲事件捕獲。true,事件捕獲;false,事件冒泡。默認false,即事件冒泡。Jquery的e.stopPropagation會阻止冒泡,意思就是到我爲止,個人爹和祖宗的事件就不要觸發了。
clipboard.png

至於爲何會並存兩種徹底不一樣的觸發順序,是由於IE用的是冒泡,其餘都是捕獲順序。

12. 什麼是事件代理,怎麼判斷是哪一個節點觸發了,target和currentTarget的區別

當網頁中須要觸發事件的對象比較多的時候,爲了不內存泄漏,咱們把事件委託到其父對象上,好比li上的事件委託到ul上,也能夠稱爲交給ul進行代理。

$("ul").on("mouseover",function(e){
    $(e.target).css("background-color","#ddd").siblings().css("background-color","white");
})

e.target能夠判斷事件發生的源節點。
event.target返回觸發事件的元。
event.currentTarget返回綁定事件的元素。

13. 隱藏元素的幾種方法

CSS方法

  • opacity: 0 經過調整透明度從視覺上隱藏元素,元素依舊佔據位置並對網頁的佈局起做用,也會影響用戶交互。
  • visibility: hidden 設置可見或者不可見,被隱藏的元素依然會對網頁佈局起做用,但不會影響用戶交互。
  • diaplsy: none 隱藏元素,確保元素不可見而且連盒模型也不生成,被隱藏的元素不佔據任何空間。
  • position:absolute 配合 top 和 left 屬性,將元素移出可視區域,不會影響佈局,又能讓元素保持可操做。

JS方法

  • DomNode.delete(Node) 經過JS來刪除DOM樹的節點,實現元素隱藏,缺點是若是要再顯示該節點,須要添加該節點
參考文章
JavaScript 深拷貝性能分析 - 前端進階 - SegmentFault 思否
使用slice和concat對數組的深拷貝和淺拷貝 - 白楊-M - 博客園
相關文章
相關標籤/搜索