1. 程式人生 > 其它 >前端面試題目

前端面試題目

深拷貝的方式:

1.JSON   stringfy  和  parse  ,

這種方式在迴圈引用的時候會報錯,而且對於物件的方法

屬性中undefined、function、symbol這三種類型的值非安全的(包括該物件的屬性迴圈賦值該物件),所以格式化後,就被過濾掉了,而set、map這種資料格式的物件,也並沒有被正確處理,而是處理成了一個空物件。

2. Object.assign(target, source1, source2)

es6新增的方法,可用於物件合併,將源物件的所有可列舉屬性,複製到目標物件上。

這種方式的拷貝,如果源目標物件中某個屬性值是對另一個物件的引用,那麼這個屬性的拷貝仍然是對引用的拷貝。

3. 迭代遞迴方法

不建議寫,迴圈引用可能會造成棧溢位,使用WeakMap可以解決

4.函式庫 lodash,提供 cloneDeep 實現

 

DIFF演算法的過程

不通過第三個變數交換兩個值

解構用法

let a = "hello"; let b = "world"; [a, b] = [b, a]; // { a: 'world', b: 'hello' }

閉包是什麼,閉包的作用,如何解決造成的問題

閉包就是函式訪問到外部作用域的變數,

作用是可以獲得一些私有變數

 

instanceof    typeof     Object.prototype.toString.call()     Array.isArray()

使用typeof可以判斷基本資料型別,但對於物件(進一步區別陣列,物件等)引用資料型別 就有侷限性了,因為無論你怎麼檢測,輸出都是object型別。

instanceof 用於判斷一個變數是否某個物件的例項,instanceof 只能用來判斷物件型別,原始型別不可以。並且所有物件型別 instanceof Object 都是 true

Object.prototype.toString.call() 每一個繼承 Object 的物件都有 toString 方法,如果 toString 方法沒有重寫的話,會返回 [Object type],其中 type 為物件的型別。但當除了 Object 型別的物件外,其他型別直接使用 toString

方法時,會直接返回都是內容的字串,所以我們需要使用call或者apply方法來改變toString方法的執行上下文

Array.isArray()

  • 功能:用來判斷物件是否為陣列

undefined和null

undefined意味著未定義,是最初始的值

【1】聲明瞭一個變數,但沒有賦值

【2】訪問物件上不存在的屬性 

【3】函式定義了形參,但沒有傳遞實參

null 的字面意思是:空值  。這個值的語義是,希望表示 一個物件被人為的重置為空物件,而非一個變數最原始的狀態 。 

 

用一句話總結兩者的區別就是:undefined 表示一個變數自然的、最原始的狀態值,而 null 則表示一個變數被人為的設定為空物件,而不是原始狀態。所以,在實際使用過程中,為了保證變數所代表的語義,不要對一個變數顯式的賦值 undefined,當需要釋放一個物件時,直接賦值為 null 即可。如果需要定義一個變數後面接收物件,那麼就置null

 

useEffect初次渲染不更新

ahook中有已有的hook     useUpdateEffect , 也可以通過useRef設定一個變數為false,然後在初次渲染的時候不執行並把ref置為true

readonly和const區別

readonly修飾符在修飾引用資料型別的時候,在編寫期間不能對這個引用資料型別進行修改,而const是可以的

react哪些部分屬於虛擬dom

JS資料型別:

基本型別:String、Number、Boolean、Null、Undefined、Symbol

引用資料型別(物件型別):物件(Object)、陣列(Array)、函式(Function),還有兩個特殊的物件:正則(RegExp)和日期(Date)。