關於Web面試的基礎知識點--Javascript(一)

前言

此博客用來記錄刷題時遇到的易錯點和重點內容

1.著名的“null==undefined"

undefined

undefined 的字面意思就是未定義的值,這個值的語義是,希望表示一個變量最原始的狀態,而非人爲操作的結果 。 這種原始狀態會在以下 4 種場景中出現:

  1. 聲明一個變量,但沒有進行賦值
    在這裏插入圖片描述
  2. 訪問對象上不存在的屬性
    在這裏插入圖片描述
  3. 函數定義了形參,但未傳遞實參
    在這裏插入圖片描述
  4. 使用void進行表達式求值
    在這裏插入圖片描述

null

null 的字面意思是 空值 ,這個值的語義是,希望表示 一個對象被人爲的重置爲空對象,而非一個變量最原始的狀態 。
一般有兩種使用場景:

  1. 作爲函數的參數,表示該函數的參數不是對象。
  2. 作爲對象原型鏈的終點。
    在這裏插入圖片描述
    注意: null 有屬於自己的類型 Null,而不屬於Object類型。
    在這裏插入圖片描述
    typeof 之所以會判定爲 Object 類型,是因爲JavaScript 數據類型在底層都是以二進制的形式表示的,二進制的前三位爲 0 會被 typeof 判斷爲對象類型,而 null 的二進制位恰好都是 0 ,因此,null 被誤判斷爲 Object 類型。

null == undefined ???

雖然 undefined 和 null 的語義和場景不同,但總而言之,它們都表示的是一個無效的值。 因此,在JS中對這類值訪問屬性時,都會得到異常的結果。ECMAScript 規範認爲,既然 null 和 undefined 的行爲很相似,並且都表示 一個無效的值,那麼它們所表示的內容也具有相似性,即有
在這裏插入圖片描述
但是:

Number(null); // 0
Number(undefined); // NaN
 
//在比較相等性之前,null 沒有被轉換爲其他類型
null == 0 ; //false

2.假值

在JavaScript中,falsenull0" "undefinedNaN被稱爲假值。

var x = new Boolean();.

1.如果Boolean構造函數的參數不是一個布爾值,則該參數會被轉換成一個布爾值。
2.如果參數是 0, -0, null, false, NaN, undefined, 或者空字符串 (“”),生成的Boolean對象的值爲false。
3.其他任何值,包括任何對象或者字符串”false”, 都會創建一個值爲true的Boolean對象。

var value = Boolean(value);

非布爾值轉化成布爾值,需要直接使用Boolean函數,而不能通過新建Boolean對象。
在這裏插入圖片描述

3.Javascript的數據類型

基本類型:String Null Undefined Number Boolean
複雜類型:Object Array Date Regexp Function
基本包裝類型:Boolean Number String
單體內置對象:Global Math

4.求(99<0 || ‘false’)運行結果的類型

按照一些語言的標準,進行與或邏輯運算之後,返回值只有false和true,所以返回值的數據類型就應該是Boolean。
對於Javascript來說:
與運算:一假則假(false),全真爲真(true)
或運算:全真必爲真(true),前者假直接返回後者(不論後者是什麼數據,原樣輸出)
在這裏插入圖片描述
所以說,答案就是

typeof "false"     //String

5.setTimeout()

setTimeout()是Window對象上的一個方法。setTimeout() 方法用於在指定的毫秒數後調用函數或計算表達式。

var myVar;

function myFunction() {
    myVar = setTimeout(alertFunc, 3000);
}
 
function alertFunc() {
    console.log("Hello!");
}

myFunction()	//調用函數
var myVar;
 
function myFunction() {
    myVar = setTimeout(alertFunc(), 3000);
}
 
function alertFunc() {
    console.log("Hello!");
}

myFunction()	//調用函數

從上面兩段代碼可以看見其中的不同是:setTimeout()函數內部參數。一個傳遞的是要調用的函數名,而另外一個函數傳遞的是一個函數。
運行結果的不同
第一段代碼:
在這裏插入圖片描述
第二段代碼:
在這裏插入圖片描述
當傳遞的參數是函數名的時候,會在設置的時間之後進行輸出。如果以函數進行傳參,會直接執行所傳遞的函數,而無視所設置的毫秒數。
注意:當傳遞的參數用引號進行包裹:
在這裏插入圖片描述
使用引號傳遞函數和直接傳遞函數名的結果是一致的。用引號傳遞函數名,那就是一個字符串了,毫無輸出。

6.變量提升

var a=10
function test(){
    console.log(a)
    var a = 100
    console.log(a)
}
test()

個人理解錯誤之處:執行test函數,第一次調用a進行輸出,但是並未進行a的賦值,在全局找a,a=10,輸出10。最終輸出:10 100
注意:在變量提升中,(以上面的例子爲例)如果在調用a之前並未找到,在全局函數尋找並進行調用。但是有個前提: 局部函數中沒有再次定義a的值
Note:當局部函數中有相同的值,不會找全局參數,在函數內進行變量提升。
最終輸出:
在這裏插入圖片描述

7.Javascript中實現跨域的方式總結

第一種方式:jsonp請求
jsonp的原理是利用<script>標籤的跨域特性,可以不受限制地從其他域中加載資源,類似的標籤還有<img>.

第二種方式:document.domain
這種方式用在主域名相同子域名不同的跨域訪問中

第三種方式:window.name
window的name屬性有個特徵:在一個窗口(window)的生命週期內,窗口載入的所有的頁面都是共享一個window.name的,每個頁面對window.name都有讀寫的權限,window.name是持久存在一個窗口載入過的所有頁面中的,並不會因新頁面的載入而進行重置。

第四種方式:window.postMessage
window.postMessages是html5中實現跨域訪問的一種新方式,可以使用它來向其它的window對象發送消息,無論這個window對象是屬於同源或不同源。

第五種方式:CORS
CORS背後的基本思想,就是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或響應是應該成功還是應該失敗。

第六種方式:Web Sockets
web sockets原理:在JS創建了web socket之後,會有一個HTTP請求發送到瀏覽器以發起連接。取得服務器響應後,建立的連接會使用HTTP升級從HTTP協議交換爲web sockt協議。

8.JavaScript中實現異步編程模式的方法

  1. 回調函數

這是異步編程最基本的方法,優點是簡單、容易理解和部署,缺點是不利於代碼的閱讀和維護,各個部分之間高度耦合(Coupling),流程會很混亂,而且每個任務只能指定一個回調函數。

例:假定有兩個函數f1和f2,後者等待前者的執行結果,如果f1是一個很耗時的任務,可以考慮改寫f1,把f2寫成f1的回調函數。

  1. 事件監聽

任務的執行不取決於代碼的順序,而取決於某個事件是否發生。優點是比較容易理解,可以綁定多個事件,每個事件可以指定多個回調函數,而且可以”去耦合”(Decoupling),有利於實現模塊化。缺點是整個程序都要變成事件驅動型,運行流程會變得很不清晰。

例:爲f1綁定一個事件,當f1發生done事件,就執行f2。

  1. 發佈/訂閱

我們假定,存在一個”信號中心”,某個任務執行完成,就向信號中心”發佈”(publish)一個信號,其他任務可以向信號中心”訂閱”(subscribe)這個信號,從而知道什麼時候自己可以開始執行。這就叫做”發佈/訂閱模式”(publish-subscribe pattern), 又稱”觀察者模式”(observer pattern)。

這種方法的性質與”事件監聽”類似,但是明顯優於後者。因爲我們可以通過查看”消息中心”,瞭解存在多少信號、每個信號有多少訂閱者,從而監控程序的運行。

  1. Promises對象

Promises對象是CommonJS工作組提出的一種規範,目的是爲異步編程提供統一接口。簡單說,它的思想是,每一個異步任務返回一個Promise對象,該對象有一個then方法,允許指定回調函數。回調函數變成了鏈式寫法,程序的流程可以看得很清楚,而且有一整套的配套方法,可以實現許多強大的功能。

9.解釋性語言和編譯性語言

解釋性語言和編譯性語言的定義:

計算機不能直接理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。

翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。

解釋性語言的定義:

解釋性語言的程序不需要編譯,在運行程序的時候才翻譯,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就需要逐行翻譯一次,效率比較低。

現代解釋性語言通常把源程序編譯成中間代碼,然後用解釋器把中間代碼一條條翻譯成目標機器代碼,一條條執行。
常見的解釋性語言: Python、JavaScript、PHP、Shell、MATLAB

編譯性語言的定義:

編譯性語言寫的程序在被執行之前,需要一個專門的編譯過程,把程序編譯成爲機器語言的文件,比如exe文件,以後要運行的話就不用重新翻譯了,直接使用編譯的結果就行了(exe文件),因爲翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高。

常見的編譯型語言:C/C++、Pascal/Object Pascal(Delphi)
在這裏插入圖片描述
圖片原地址

10.Javascript全局

js的全局屬性: Infinity、NAN、undefined

js的全局函數
decodeURI()、decodeURIcomponent()、 encodeURI、encodeURIcomponent()、 scape()、eval()、isFinite()、isNAN()、 Number()、parseFloat()、parseInt()、String()、unescape()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章