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


1.如何將集合轉化成數組?

  1. Array.form(arr, mapfn,thisArg)

用於將兩類可以把對象轉換爲真正的數組:類似數組的對象和可遍歷的對象(部署了Iterator接口的,String,ES6新增的Map和Set)。可以傳3個參數,其中第一個是數組,必傳;第二個是一個函數(類似map函數),對數組元素進行操作後再返回數組,可選;第三個是對於this關鍵字的指向,可選。

  1. slice()

可從已有的數組中返回選定的元素。 返回值:返回一個新的數組,包含從startend(不包括該元素)的 arrayObject中的元素。

請注意:該方法並不會修改數組,而是返回一個子數組。如果想刪除數組中的一段元素,應該使用方法 Array.splice()。 所以在這裏就是對集合A應用slice,返回一個新的數組,不對數組做任何改變。

  1. 展開運算符

把A集合的元素展開後,用數組[]承載,返回新的數組。
在這裏插入圖片描述

  1. map()
    返回一個新數組,數組中的元素爲原始數組元素調用函數處理後的值。

map() 方法按照原始數組元素順序依次處理元素。

注意:
(1)map()不會對空數組進行檢測。
(2) map() 不會改變原始數組。
所以map方法返回了一個新的數組,並且數組中每個元素是A裏面的元素。

var ary = [12,23,24,42,1];  
var res = ary.map(function (item,index,input) {  
    return item*10;  
})  
console.log(res);//-->[120,230,240,420,10];  原數組拷貝了一份,並進行了修改
console.log(ary);//-->[12,23,24,42,1];  原數組並未發生變化

2.Event Loop - 1

求運行結果:

console.log("one")
setTimeout(function(){
console.log("two")
},0)
console.log("three")

個人理解:在定時器中設置的時間爲0毫秒,輸出結果應爲:one three two
Note :Event Loop
JavaScript語言就採用Event Loop機制,來解決單線程運行帶來的一些問題。
在這裏插入圖片描述
JS 在執行的過程中會產生執行環境,這些執行環境會被順序的加入到執行棧中。如果遇到異步的代碼,會被掛起並加入到 Task(有多種 task) 隊列中。一旦執行棧爲空,Event Loop 就會從 Task 隊列中拿出需要執行的代碼並放入執行棧中執行,所以本質上來說 JS 中的異步還是同步行爲
回調時,被回調的函數會被放在event loop裏,等待線程裏的任務執行完後才執行event loop裏的代碼。
因此,上述代碼會先把線程裏的執行完後,再執行event loop裏的setTimeout函數。
在這裏插入圖片描述
借鑑資料 : 阮一峯的網絡日誌


3.Event Loop - 2

求運行結果:

console.log(1);
let a = setTimeout(() => {console.log(2)}, 0);
console.log(3);
Promise.resolve(4).then(b => {
console.log(b);
clearTimeout(a);
});
console.log(5);

Output:
在這裏插入圖片描述
執行順序是先執行同步的任務–輸出1,3,5
在執行異步任務:其中異步任務分爲宏任務微任務,微任務優先級高於宏任務。promise.then執行的微任務,輸出4,然後clearTimeout(a)清除了定時器,於是不再打印2。
結果輸出:1,3,5,4


4.不支持冒泡的事件

UI事件

load unload scroll resize

焦點事件

blur focus

鼠標事件

mouseleave mouseenter

JS事件監聽(捕獲&冒泡)


5. 如何阻止事件冒泡

事件綁定&移除&冒泡(如何阻止事件冒泡)


6.比較Ajax和Flash的優劣

Ajax

優勢:

1.可搜索性
2.開放性
3.費用
4.易用性
5.易於開發。

劣勢:

1.它可能破壞瀏覽器的後退功能
2.使用動態頁面更新使得用戶難於將某個特定的狀態保存到收藏夾中

不過這些都有相關方法解決。

Flash

優勢:

1.多媒體處理
2.兼容性
3.矢量圖形
4.客戶端資源調度

劣勢:

1.二進制格式
2.格式私有
3.flash 文件經常會很大,用戶第一次使用的時候需要忍耐較長的等待時間
4.性能問題


7.Promise的狀態

一個Promise可能有三種狀態:

等待(pending已完成(fulfilled已拒絕(rejected

一個promise的狀態只可能從“等待”轉到“完成”態或者“拒絕”態,不能逆向轉換,同時“完成”態和“拒絕”態不能相互轉換。

promise必須實現then方法(可以說,then就是promise的核心),而且then必須返回一個promise,同一個promise的then可以調用多次,並且回調的執行順序跟它們被定義時的順序一致。

then方法接受兩個參數,第一個參數是成功時的回調,在promise由“等待”態轉換到“完成”態時調用,另一個是失敗時的回調,在promise由“等待”態轉換到“拒絕”態時調用。同時,then可以接受另一個promise傳入,也接受一個“類then”的對象或方法,即thenable對象。

Promise對象


8.隱式的類型轉化

題目:
在這裏插入圖片描述
parseInt()函數可解析一個字符串,並返回一個整數。
所以說,number類型的12.34發生隱式轉換爲string

三元運算符,會判斷?前的表達式爲true或者false。所以number類型的0發生了隱式轉換爲boolean

+運算髮生了字符串的隱式轉化。原本number類型的1,和string類型的’1’進行了+運算,連接了字符串。返回’11’。

C選項:
e是js裏面指數的一種表示形式。也就是10的多少次方。
2e1 等價於 2 *(10^1) = 20
2e2 等價於 2 (10^2)= 200
0xaa是16進制的表示方法。相當於十進制的170。
這裏都是number類型,發生了數字的乘法運算:20
170,沒有發生類型轉換


9.JS 解析順序(賦值式函數和聲明式函數)

代碼如下:

var foo=function(x,y){     
return x-y;
}

function foo(x,y){         
return x+y;
}

var num=foo(1,2);

解析如下:

var foo=function(x,y){      //賦值式函數
return x-y;
}
//有名函數,可以單獨定義。
function foo(x,y){         //聲明式函數
return x+y;
}

//實際調用
var num=foo(1,2); //調用賦值式函數  return x-y  爲  -1

在這裏插入圖片描述


10. Node查找某一模塊的順序

在文件/home/somebody/workspace/somemodule.js中第一行引用了一個模塊:require(‘othermodule‘),請問required 的查找模塊的順序:
在這裏插入圖片描述
題目來源

  1. 首先,Node在當前目錄下查找package.json(CommonJS包規範定義的包描述文件),通過JSON.parse()解析出包描述對象,從中取出main屬性指定的文件名進行定位。
    如果文件缺少擴展名,將會進入擴展名分析的步驟。

  2. 而如果main屬性制定的文件名錯誤,或者壓根沒有package.json文件,Node會將index當做默認文件名,然後依次查找index.jsindex.nodeindex.json.

  3. 如果在目錄分析的過程中沒有定位成功任何文件,則自定義模塊進入下一個模塊路徑進行查找。如果模塊路徑數組都被遍歷完畢,依然沒有查找到目標文件,則會拋出查找失敗異常


按照上面的思路,首先應該查找package.json文件,看看裏面有沒有核心模塊,應該是C最先,othermodule不是核心模塊,那麼接着應該進入擴展名分析的步驟,就應該是查找othermodule. js,對應B,緊接着就是以index爲默認文件名,也就是A,再接下來就是上一個文件目錄D了,所以答案是: C B A D


11. 變量回收

在這裏插入圖片描述

變量回收規則

1.全局變量不會被回收

2.局部變量會被回收,也就是函數一旦運行完之後,函數內部的東西就會被銷燬

3.只要被另一個作用域所引用就不會被回收

之所以有3個變量沒有被回收,首先是全局變量中的i ,第二行會覆蓋第一行的賦值,所以只有一個,第二個
是var add ,這個變量定義了一個匿名函數,並賦值給了add,沒有被回收,第三個就是閉包中的變量i,閉包中的局部變量是不會被回收的。

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