今天繼續談談 js 中的那些面試題
1、js獲取原型的方法?
-
p.proto
-
p.constructor.prototype
-
Object.getPrototypeOf(p)
2、在js中不同進位制數字的表示方式?
-
以 0X、0x 開頭的表示為十六進位制。
-
以 0、0O、0o 開頭的表示為八進位制。
-
以 0B、0b 開頭的表示為二進位制格式。
3、js中整數的安全範圍是多少?
安全整數指的是,在這個範圍內的整數轉化為二進位制儲存的時候不會出現精度丟失,能夠被“安全”呈現的最大整數是 2^53 - 1,
即9007199254740991,在 ES6 中被定義為 Number.MAX_SAFE_INTEGER。最小整數是-9007199254740991,在 ES6 中
被定義為 Number.MIN_SAFE_INTEGER。
如果某次計算的結果得到了一個超過 JavaScript 數值範圍的值,那麼這個值會被自動轉換為特殊的 Infinity 值。如果某次
計算返回了正或負的 Infinity 值,那麼該值將無法參與下一次的計算。判斷一個數是不是有窮的,可以使用 isFinite 函式
來判斷。
4、typeof NaN 的結果是什麼?
NaN 意指“不是一個數字”(not a number),NaN 是一個“警戒值”(sentinel value,有特殊用途的常規值),用於指出
數字型別中的錯誤情況,即“執行數學運算沒有成功,這是失敗後返回的結果”。
typeof NaN; // "number"
NaN 是一個特殊值,它和自身不相等,是唯一一個非自反(自反,reflexive,即 x === x 不成立)的值。而 NaN != NaN
為 true。
5、isNaN 和 Number.isNaN 函式的區別?
函式 isNaN 接收引數後,會嘗試將這個引數轉換為數值,任何不能被轉換為數值的的值都會返回 true,因此非數字值傳入也會
返回 true ,會影響 NaN 的判斷。
函式 Number.isNaN 會首先判斷傳入引數是否為數字,如果是數字再繼續判斷是否為 NaN ,這種方法對於 NaN 的判斷更為
準確。
6、Array建構函式只有一個引數值時的表現?
Array 建構函式只帶一個數字引數的時候,該引數會被作為陣列的預設長度(length),而非只充當陣列中的一個元素。
這樣
創建出來的只是一個空陣列,只不過它的 length 屬性被設定成了指定的值。
建構函式 Array(..) 不要求必須帶 new 關鍵字。不帶時,它會被自動補上。
7、其他值到字串的轉換規則?
規範的 9.8 節中定義了抽象操作 ToString ,它負責處理非字串到字串的強制型別轉換。
(1)Null 和 Undefined 型別 ,null 轉換為 "null",undefined 轉換為 "undefined",
(2)Boolean 型別,true 轉換為 "true",false 轉換為 "false"。
(3)Number 型別的值直接轉換,不過那些極小和極大的數字會使用指數形式。
(4)Symbol 型別的值直接轉換,但是隻允許顯式強制型別轉換,使用隱式強制型別轉換會產生錯誤。
(3)對普通物件來說,除非自行定義 toString() 方法,否則會呼叫 toString()(Object.prototype.toString())
來返回內部屬性 [[Class]] 的值,如"[object Object]"。如果物件有自己的 toString() 方法,字串化時就會
呼叫該方法並使用其返回值。
8、其他的值到布林型別的值得轉換規則?
ES5 規範 9.2 節中定義了抽象操作 ToBoolean,列舉了布林強制型別轉換所有可能出現的結果。
以下這些是假值:
• undefined
• null
• false
• +0、-0 和 NaN
•""
假值的布林強制型別轉換結果為 false。從邏輯上說,假值列表以外的都應該是真值。
9、{} 和 [] 的 valueOf 和 toString 的結果是什麼?
{} 的 valueOf 結果為 {} ,toString 的結果為 "[object Object]"
[] 的 valueOf 結果為 [] ,toString 的結果為 ""
10、什麼是假值物件?
瀏覽器在某些特定情況下,在常規 JavaScript 語法基礎上自己建立了一些外來值,這些就是“假值物件”。假值物件看起來和
普通物件並無二致(都有屬性,等等),但將它們強制型別轉換為布林值時結果為 false 最常見的例子是 document.all,它
是一個類陣列物件,包含了頁面上的所有元素,由 DOM(而不是 JavaScript 引擎)提供給 JavaScript 程式使用。
11、~操作符的作用?
~ 返回 2 的補碼,並且 ~ 會將數字轉換為 32 位整數,因此我們可以使用 ~ 來進行取整操作。
~x 大致等同於 -(x+1)。
12、解析字串中的數字和將字串強制型別轉換為數字的返回結果都是數字,它們之間的區別是什麼?
解析允許字串(如 parseInt() )中含有非數字字元,解析按從左到右的順序,如果遇到非數字字元就停止。而轉換(如 Nu
mber ())不允許出現非數字字元,否則會失敗並返回 NaN。
13、+操作符什麼時候用於字串的拼接?
根據 ES5 規範 11.6.1 節,如果某個運算元是字串或者能夠通過以下步驟轉換為字串的話,+ 將進行拼接操作。如果其
中一個運算元是物件(包括陣列),則首先對其呼叫 ToPrimitive 抽象操作,該抽象操作再呼叫 [[DefaultValue]],以
數字作為上下文。如果不能轉換為字串,則會將其轉換為數字型別來進行計算。
簡單來說就是,如果 + 的其中一個運算元是字串(或者通過以上步驟最終得到字串),則執行字串拼接,否則執行數字
加法。
那麼對於除了加法的運算子來說,只要其中一方是數字,那麼另一方就會被轉為數字。
14、什麼情況下會發生布爾值的隱式強制型別轉換?
(1) if (..) 語句中的條件判斷表示式。
(2) for ( .. ; .. ; .. ) 語句中的條件判斷表示式(第二個)。
(3) while (..) 和 do..while(..) 迴圈中的條件判斷表示式。
(4) ? : 中的條件判斷表示式。
(5) 邏輯運算子 ||(邏輯或)和 &&(邏輯與)左邊的運算元(作為條件判斷表示式)。
15、|| 與 && 操作符的返回值?
|| 和 && 首先會對第一個運算元執行條件判斷,如果其不是布林值就先進行 ToBoolean 強制型別轉換,然後再執行條件
判斷。
對於 || 來說,如果條件判斷結果為 true 就返回第一個運算元的值,如果為 false 就返回第二個運算元的值。
&& 則相反,如果條件判斷結果為 true 就返回第二個運算元的值,如果為 false 就返回第一個運算元的值。
|| 和 && 返回它們其中一個運算元的值,而非條件判斷的結果。
16、Symbol值的強制型別轉換?
ES6 允許從符號到字串的顯式強制型別轉換,然而隱式強制型別轉換會產生錯誤。
Symbol 值不能夠被強制型別轉換為數字(顯式和隱式都會產生錯誤),但可以被強制型別轉換為布林值(顯式和隱式結果
都是 true )。
17、==操作符的強制型別轉換規則?
(1)字串和數字之間的相等比較,將字串轉換為數字之後再進行比較。
(2)其他型別和布林型別之間的相等比較,先將布林值轉換為數字後,再應用其他規則進行比較。
(3)null 和 undefined 之間的相等比較,結果為真。其他值和它們進行比較都返回假值。
(4)物件和非物件之間的相等比較,物件先呼叫 ToPrimitive 抽象操作後,再進行比較。
(5)如果一個操作值為 NaN ,則相等比較返回 false( NaN 本身也不等於 NaN )。
(6)如果兩個操作值都是物件,則比較它們是不是指向同一個物件。如果兩個運算元都指向同一個物件,則相等操作符返回 true,否則,返回 false。
18、如何將字串轉化為數字,例如'12.3b'?
(1)使用 Number() 方法,前提是所包含的字串不包含不合法字元。
(2)使用 parseInt() 方法,parseInt() 函式可解析一個字串,並返回一個整數。還可以設定要解析的數字的基數。當基數的值為 0,或沒有設定該引數時,parseInt() 會根據 string 來判斷數字的基數。
(3)使用 parseFloat() 方法,該函式解析一個字串引數並返回一個浮點數。
(4)使用 + 操作符的隱式轉換。
19、如何將浮點數點左邊的數每三位新增一個逗號,如 12000000.11 轉化為[12,000,000,11]?
function format(number) { return number && number.replace(/(?!^)(?=(\d{3})+\.)/g, ","); }
20、常用正則表示式。
// (1)匹配 16 進位制顏色值 var regex = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g; // (2)匹配日期,如 yyyy-mm-dd 格式 var regex = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/; // (3)匹配 qq 號 var regex = /^[1-9][0-9]{4,10}$/g; // (4)手機號碼正則 var regex = /^1[34578]\d{9}$/g; // (5)使用者名稱正則 var regex = /^[a-zA-Z\$][a-zA-Z0-9_\$]{4,16}$/;