Table of Contents
1.如何將集合轉化成數組?
- Array.form(arr, mapfn,thisArg)
用於將兩類可以把對象轉換爲真正的數組:類似數組的對象和可遍歷的對象(部署了Iterator接口的,String,ES6新增的Map和Set)。可以傳3個參數,其中第一個是數組,必傳;第二個是一個函數(類似map函數),對數組元素進行操作後再返回數組,可選;第三個是對於this關鍵字的指向,可選。
- slice()
可從已有的數組中返回選定的元素。 返回值:返回一個新的數組,包含從
start
到end
(不包括該元素)的arrayObject
中的元素。
請注意:該方法並不會修改數組,而是返回一個子數組。如果想刪除數組中的一段元素,應該使用方法Array.splice()
。 所以在這裏就是對集合A應用slice,返回一個新的數組,不對數組做任何改變。
- 展開運算符
把A集合的元素展開後,用數組[]承載,返回新的數組。
- 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
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
對象。
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類型,發生了數字的乘法運算:20170,沒有發生類型轉換
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 的查找模塊的順序:
題目來源
-
首先,Node在當前目錄下查找
package.json
(CommonJS包規範定義的包描述文件),通過JSON.parse()
解析出包描述對象,從中取出main屬性指定的文件名進行定位。
如果文件缺少擴展名,將會進入擴展名分析的步驟。 -
而如果
main
屬性制定的文件名錯誤,或者壓根沒有package.json
文件,Node會將index
當做默認文件名,然後依次查找index.js
、index.node
、index.json
. -
如果在目錄分析的過程中沒有定位成功任何文件,則自定義模塊進入下一個模塊路徑進行查找。如果模塊路徑數組都被遍歷完畢,依然沒有查找到目標文件,則會拋出查找失敗異常
按照上面的思路,首先應該查找package.json
文件,看看裏面有沒有核心模塊,應該是C最先,othermodule
不是核心模塊,那麼接着應該進入擴展名分析的步驟,就應該是查找othermodule. js
,對應B,緊接着就是以index
爲默認文件名,也就是A,再接下來就是上一個文件目錄D了,所以答案是: C B A D
11. 變量回收
變量回收規則
1.全局變量不會被回收
2.局部變量會被回收,也就是函數一旦運行完之後,函數內部的東西就會被銷燬
3.只要被另一個作用域所引用就不會被回收
之所以有3個變量沒有被回收,首先是全局變量中的i ,第二行會覆蓋第一行的賦值,所以只有一個,第二個
是var add ,這個變量定義了一個匿名函數,並賦值給了add,沒有被回收,第三個就是閉包中的變量i,閉包中的局部變量是不會被回收的。