ajavascript
年末了,又到了跳槽季啦,該刷題走起了。這裏總結了一些被問到可能會懵逼的面試真題,有須要的能夠看下~css
DNS 是什麼-- Domain Name System,域名系統,做爲域名和IP地址相互映射的一個分佈式數據庫。前端
瀏覽器根據自定義的規則,提早去解析後面可能用到的域名,來加速網站的訪問速度。簡單來說就是提早解析域名,以避免延遲。java
<link rel="dns-prefetch" href="//wq.test.com">
這個功能有個默認加載條件,全部的a標籤的href都會自動去啓用DNS Prefetching,也就是說,你網頁的a標籤href帶的域名,是不須要在head裏面加上link手動設置的。但a標籤的默認啓動在HTTPS不起做用。git
這時要使用 meta裏面http-equiv來強制啓動功能。程序員
<meta http-equiv="x-dns-prefetch-control" content="on">
咱們常常說get請求參數的大小存在限制,而post請求的參數大小是無限制的。這是一個錯誤的說法,實際上HTTP 協議從未規定 GET/POST 的請求長度限制是多少。對get請求參數的限制是來源與瀏覽器或web服務器,瀏覽器或web服務器限制了url的長度。爲了明確這個概念,咱們必須再次強調下面幾點:github
第一步,經過使用 pushState + ajax 實現瀏覽器無刷新前進後退,當一次 ajax 調用成功後咱們將一 條 state 記錄加入到 history 對象中。web
第二步,一條 state 記錄包含了 url、title 和 content 屬性,在 popstate 事件中能夠 獲取到這個 state 對象,咱們可 以使用 content 來傳遞數據。第三步,咱們經過對 window.onpopstate 事件監聽來響應瀏覽器 的前進後退操做。面試
使用 pushState 來實現有兩個問題,一個是打開首頁時沒有記錄,咱們可使用 replaceState 來將首頁的記錄替換,另外一個問 題是當一個頁面刷新的時候,仍然會向服務器端請求數據,所以若是請求的 url 須要後端的配 合將其重定向到一個頁面。ajax
更多參考:http://blog.chenxu.me/post/detail?id=ed4f0732-897f-48e4-9d4f-821e82f17fad
也就是說,無論 Proxy 怎麼修改默認行爲,你總能夠在 Reflect 上獲取 默認行爲。
全部 typeof 返回值爲 "object" 的對象(如數組)都包含一個內部屬性 [[Class]](我 們能夠把它看做一個內部的分類,而非傳統的面向對象意義上的類)。這個屬性沒法直接訪問, 通常經過 Object.prototype.toString(..) 來查看。例如:
Object.prototype.toString.call( [1,2,3] ); // "[object Array]"
Object.prototype.toString.call( /regex-literal/i ); //"[object RegExp]"
多數狀況下,對象的內部[[class]]屬性和建立該對象的內建原生構造函數相對應,不過也不老是這樣。2.基本類型值的[[class]]屬性
雖然Null()和Undefined()這樣的原生構造函數並不存在,可是內部[[class]]屬性仍然是「Null」和「Undefined」。
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
其餘基本類型值的狀況有所不一樣:
console.log(Object.prototype.toString.call("abc")); //[object String]
console.log(Object.prototype.toString.call(42)); //[object Number]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
基本類型值被各自的封裝對象自動包裝,因此他們的內部[[class]]屬性分別爲「String」,「Number」和「Boolean」。3.封裝對象
因爲基本類型值沒有.length和.toString()這樣的屬性和方法,須要經過封裝對象才能訪問,此時Javascript引擎會自動爲基本類型值包裝一個封裝對象。
//封裝對象包裝
var b = 'abc';
console.log(b.length);
console.log(b.toUpperCase());
```js
通常不直接使用封裝對象(即經過new操做建立基本類型值),優先考慮使用「abc」和「42」這樣的基本類型值,而不是new String("abc") 和 new Number(42)。4.拆封
若是想要獲得封裝對象中的基本類型值,可使用valueOf()函數。
```js
//封裝對象的拆封
var s = new String( "abc" );
var n = new Number( 42 );
var b = new Boolean( true );
console.log(s.valueOf());
console.log(n.valueOf());
console.log(b.valueOf());
堆和棧的概念存在於數據結構中和操做系統內存中。在數據結構中,棧中數據的存取方式爲 先進後出。而堆是一個優先隊列,是按優先級來進行排序的,優先級能夠按照大小來規定。徹底 二叉樹是堆的一種實現方式。在操做系統中,內存被分爲棧區和堆區。棧區內存由編譯器自動分 配釋放,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。堆區內存一 般由程序員分配釋放,若程序員不釋放,程序結束時可能由垃圾回收機制回收。
詳細資料能夠參考:《什麼是堆?什麼是棧?他們之間有什麼區別和聯繫?》
函數 isNaN 接收參數後,會嘗試將這個參數轉換爲數值,任何不能被轉換爲數值的的值都會返 回 true,所以非數字值傳入也會返回 true ,會影響 NaN 的判斷。
函數 Number.isNaN 會首先判斷傳入參數是否爲數字,若是是數字再繼續判斷是否爲 NaN ,這種方法對於 NaN 的判斷更爲準確。
(1) if (..) 語句中的條件判斷表達式。(2) for ( .. ; .. ; .. ) 語句中的條件判斷表達式(第二個)。(3) while (..) 和 do..while(..) 循環中的條件判斷表達式。(4) ? : 中的條件判斷表達式。(5) 邏輯運算符 ||(邏輯或)和 &&(邏輯與)左邊的操做數(做爲條件判斷表達式)。
已在做用域中聲明但尚未賦值的變量,是 undefined 的。相反,尚未在做用域中聲明 過的變量,是 undeclared 的。對於 undeclared 變量的引用,瀏覽器會報引用錯誤,如 ReferenceError: b is not defined 。可是咱們可使用 typeof 的安全防範機制來避免 報錯,由於對於 undeclared(或者 not defined )變量,typeof 會返回 "undefined"。
function getType(value) {
// 判斷數據是 null 的狀況
if (value === null) {
return value + "";
}
// 判斷數據是引用類型的狀況
if (typeof value === "object") {
let valueClass = Object.prototype.toString.call(value),
type = valueClass.split(" ")[1].split("");
type.pop();
return type.join("").toLowerCase();
} else {
// 判斷數據是基本數據類型的狀況和函數的狀況
return typeof value
}
}
最後
歡迎加我微信(winty230),拉你進技術羣,長期交流學習...
歡迎關注「前端Q」,認真學前端,作個專業的技術人...