本文在個人主頁同步更新~
背就完事了
介紹:一些知識點相關的面試題和答案
使用姿勢:看答案前先嘗試回答,看完后把答案收起來檢驗成果~
面試官:JS有哪些資料型別
答:JS有七種資料型別,分別是Number、String、Boolean、Null、Undefined、Symbol、Object,其中Object是參考資料型別,其他都是值型別(基本資料型別),參考資料型別又細分為Function, Array和Object型別,
面試官:如何理解值型別和參考型別
答:值型別占用空間固定,保存在堆疊里面,操作的是值本身;參考型別占用空間不固定,保存在堆中,操作的是指向物件的一個指標,
面試官:如何理解堆(heap)堆疊(stack)
答:堆疊一般存放變數的值,記憶體空間由系統自動分配和釋放;堆一般存放復雜物件,記憶體空間為動態分配,不主動釋放的話,可能會由垃圾回識訓制自動回收,
面試官:Null和Undefined有什么區別
答:null是一個物件指標,但沒有指向任何物件,通過typeof(null)得到的是 Object型別;undefined則是一個空值,通過typeof(undefined)得到的是 Undefined,
面試官:什么是淺拷貝和深拷貝
答:淺拷貝是只復制指向物件的指標,對新舊物件進行操作都會互相影響;而深拷貝則是創建一個新的物件,將原來的值一個個復制過來,與原物件不在同一記憶體地址,
面試官:如何理解Symbol型別,使用場景是什么
答:Symbol的特點就是Symbol型別只能通過Symbol()這個方法回傳得到,且Symbol型別的值是絕對唯一的,使用場景是作為物件屬性的key值,
理解小幫手
介紹:總結性的圖表或筆試題目和決議,讓知識點更容易懂
關于值型別,參考型別和記憶體堆疊和堆的關系
如下圖所示,a,b變數是值型別,c,d變數是參考型別,
在宣告c,d變數時,會先創建相應的物件存放在堆記憶體中,再將其參考地址賦值給變數,
由此,這道常見面試題的答案顯而易見
var a = { test : 10 }
var b = a
a.test = 20
此時b.test=?
關于null,{}和undefined的對比
| 描述 | 資料型別 | 強轉Boolean值 | |
|---|---|---|---|
| null | 指標,指向地址沒有物件 | Object | false |
| {} | 指標,指向空物件 | Object | true |
| undefined | 值,未定義 | Undefined | false |
關于淺拷貝和深拷貝的具體操作
日常大部分的拷貝動作都屬于淺拷貝,包括直接賦值(=), 擴展運算子(...), Array的concat操作, Object的assign操作,
真正的深拷貝方法可以自己進行封裝,回圈判斷每一個子項是否為參考型別,再進行復制,
也可以通過JSON.parse(JSON.stringfy(object))進行深拷貝
// 日常所見的淺拷貝操作
var a = { class: 1, teacher: { name : 'abc' }}
var b = a
var c = {...a}
var d = Object.assign({}, a)
var e = JSON.parse(JSON.stringify(a))
a.class = 2
a.teacher.name = 'bcd'
console.log(a) // 列印結果:{ class: 2, teacher: { name : 'bcd' }}
console.log(b) // 列印結果:{ class: 2, teacher: { name : 'bcd' }}
console.log(c) // 列印結果:{ class: 1, teacher: { name : 'bcd' }}
console.log(d) // 列印結果:{ class: 1, teacher: { name : 'bcd' }}
console.log(e) // 列印結果:{ class: 1, teacher: { name : 'abc' }}
通過以上代碼可以看出..., Object.assign, concat等操作只是第一層用新建的物件包裹住,子屬性物件的參考地址還是和原來一致,
Kane -- 一切都是命運石之門的選擇
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/166506.html
標籤:JavaScript
下一篇:Microsoft Visual Studio 2017 找不到 Visual Studio Installer
