開篇
最近這個文章很火,列了【合格】前端工程師需要掌握的技能表,看到作者一直不斷自省和學習來保持競爭力,同為前端工程師深感慚愧,故寫下此文簡要回答一下文章裡提到的技術問題,技術一般,大家僅僅當做參考就成,文章很長會分多篇來寫。
傳送門 一名【合格】前端工程師的自檢清單
JavaScript基礎
變數和型別
-
JavaScript
規定了幾種資料型別
7種,根據堆疊儲存方式的不同分為簡單型別和複雜型別- 簡單型別:
string
、number
、boolean
、null
、undefined
、symbol
(ES6新增,表示獨一無二的值) - 複雜型別:
object
- 簡單型別:
-
JavaScript
物件的底層結構是什麼
不甚瞭解,不敢妄言 -
Symbol
型別在實際開發中的應用,手寫Symbol
Symbol
表示一個獨一無二的值,如果我們使用了一個他人提供的物件,要為此物件新增方法,那麼必須保證屬性名不能衝突,使用Symbol
就能很好的保證這一點,Symbol
與任何值都不相等!這個東西瞭解不深,傳送門-ES6標準入門-Symobl -
JavaScript
中的變數具體儲存形式
變數的儲存方式取決於變數的型別是基本型別還是引用型別- 基本型別:以鍵值對的方式儲存在棧記憶體中
- 複雜型別:會在堆記憶體中開闢一塊空間,儲存這個物件的值,並同時在棧記憶體中儲存變數和指向物件的指標
來源
:《JavaScript高階程式設計》69頁
-
基本型別對應的內建物件,以及他們之間的裝箱拆箱操作
這個說的是基本包裝型別,我也理解不深,直接看《JavaScript高階程式設計》119頁 -
理解值型別和引用型別
這個和4一樣,值型別就是基本型別,引用型別就是複雜型別 -
null
和undefined
的區別
null
表示空物件指標,將null賦值給變數,就表示該變數指向空物件
undefined
表示未定義,宣告一個變數但不初始化,那麼它的值就是undefined
null
主要表示一個變數還沒有真正儲存物件的時候,它的值就應該為null
,這是意料之中的空,而undefined
通常表示意料之外的內容,如未初始化的變數,一般來說我們不應該顯式的使用undefined
來源
《JavaScript高階程式設計》24頁 -
至少可以說出三種判斷
JavaScript
資料型別的方式,以及他們的優缺點,如何準確的判斷陣列型別typeof
操作符,可以判斷基本資料型別,對於引用資料型別全都返回Object
instanceof
操作符,obj instanceof Object
檢測Object.prototype
是否存在於引數obj
的原型鏈上,主要用來判斷變數是否是某個建構函式的例項,但是Object
是所有物件的原型,所以在obj instanceof Object
中,無論引數obj
是陣列還是函式都會返回true
constructor
是prototype
物件上的屬性,指向建構函式。根據例項物件尋找屬性的順序,若例項物件上沒有例項屬性或方法時,就去原型鏈上尋找,因此,例項物件也是能使用constructor
屬性的,同樣的這個也只能輸出建構函式
如需判斷基本資料型別,使用
typeof
,判斷引用型別用instanceof
和constructor
,實際上所有引用型別都是物件,只不過建構函式不同罷了,強行判斷引用型別,要麼只是判斷常見的幾種引用型別比如陣列,函式,Date,正則等等,要麼只能輸出建構函式準確判斷陣列型別使用es5提供的方法
Array.isArray(value)
來源
《JavaScript高階程式設計》83頁,一整章 -
可能發生隱式型別轉換的場景以及轉換原則,應如何避免或巧妙應用
隱式轉換一般說的是Boolean
的轉換- Boolean 場景,變數放在if的判斷語句時,如果變數不是布林值,那麼就會發生隱式轉換
- String,非空字串會轉換成
true
,空字串會轉換成false
- Number, 非0會轉換成
true
,0會轉換成false
- Object,任何物件都會轉成
true
- String,非空字串會轉換成
當然
Numebr
也會發生隱式轉換,不過這個一般用不到,也很簡單來源
《JavaScript高階程式設計》26頁 - Boolean 場景,變數放在if的判斷語句時,如果變數不是布林值,那麼就會發生隱式轉換
-
出現小數精度丟失的原因,JavaScript可以儲存的最大數字、最大安全數字,JavaScript處理大數字的方法、避免精度丟失的方法
- 精度丟失原因,說是
JavaScript
使用了IEEE 754
規範,二進位制儲存十進位制的小數時不能完整的表示小數 - 能夠表示的最大數字
Number.MAX_VALUE
等於1.7976931348623157e+308
,最大安全數字Number.MAX_SAFE_INTEGER
等於9007199254740991
- 避免精度丟失
- 計算小數時,先乘100或1000,變成整數再運算
- 如果值超出了安全整數,有一個最新提案,
BigInt
大整數,它可以表示任意大小的整數,注意只能表示整數,而不受安全整數的限制
來源
ES6標準入門、《JavaScript高階程式設計》29頁 - 精度丟失原因,說是
先寫10個吧,太累了,果然,合格不是那麼好達到的,加油吧!!!
github,歡迎issue