前端面試題目
深拷貝的方式:
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
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)。