持續更新中...
面試傳送門:
面試重點,原生JS,建議去面試之前,把JS從頭到尾過一遍,尤其是裡面的各種方法及其差別
001.Promise原理?
002.then可以鏈式呼叫,多個then時,如何走到下一個then的失敗回撥?
答:
1.返回一個失敗的promise。
2.丟擲一個錯誤(throw new Error())
003.then可以鏈式呼叫,多個then時,如何終止下一個then的呼叫?
答:返回一個處於pending(等待態)狀態的promise
004.js的非同步解決方案有哪些?
答:
- 回撥函式(巢狀,回撥地獄,不優雅)
- Promise
- Generator+co (co可以解決promise巢狀問題,generator+promise(promise巢狀問題))
- async+await:是Generator的語法糖
005.把一個偽陣列變成真實的陣列?
答:
- [...obj],需要保證obj是可迭代的
- Array.from不需要保證obj是否迭代,內部會使它可迭代
006.使用過ES6中哪些新語法(重點 * 熟練使用ES6語法)?
答:
- 結構賦值 [] {}
- 展開運算子(...args)(考察深拷貝,淺拷貝)
- Set:常用於陣列去重
- Map:裡面儲存唯一的值
深拷貝實現的一種方式:JSON.parse(JSON.strinfy(obj));
007.實現深拷貝(重點)淺拷貝?
function deepClone(source) {
const targetObj = source.constructor === Array ? [] : {}; // 判斷複製的目標是陣列還是物件
for (let keys in source) { // 遍歷目標
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === 'object') { // 如果值是物件,就遞迴一下
targetObj[keys] = source[keys].constructor === Array ? [] : {};
targetObj[keys] = deepClone(source[keys]);
} else { // 如果不是,就直接賦值
targetObj[keys] = source[keys];
}
}
}
return targetObj;
}
var str1 = {
arr: [1, 2, 3],
obj: {
key: 'value'
},
fn: function () {
return 1;
}
};
var str3 = deepClone(str1);
console.log(str3 === str1); // false
console.log(str3.obj === str1.obj); // false
console.log(str3.fn === str1.fn); // true
複製程式碼
008.求陣列的交集、並集、差集?
答:
//-----------------------------------------並集
// let arr1 = [1, 2, 3, 4]
// let arr2 = [3, 4, 5, 6]
//並集
// function union(arr1, arr2) {
// // let s1 = new Set(arr1)
// // let s2 = new Set(arr2)
// // let s = new Set([...s1,...s2])
// // return [...s]
// let s = new Set([...arr1,...arr2])
// return [...s]
// }
// console.log(union(arr1,arr2)); //[ 1, 2, 3, 4, 5, 6 ]
//-----------------------------------------交集
// let arr1 = [1, 2, 3, 4]
// let arr2 = [3, 4, 5, 6]
// //交集
// function intersection(arr1,arr2){
// let s1 = new Set(arr1)
// let s2 = new Set(arr2)
// return [...s1].filter(item=>{
// return s2.has(item)
// })
// }
// console.log(intersection(arr1,arr2)) //[ 3, 4 ]
//-----------------------------------------差集
// let arr1 = [1, 2, 3, 4]
// let arr2 = [3, 4, 5, 6]
// function difference(arr1,arr2){
// let s1 = new Set(arr1)
// let s2 = new Set(arr2)
// return [...s1].filter(item=>{
// return !s2.has(item)
// })
// }
// console.log(difference(arr1,arr2)) //[ 1, 2 ]
複製程式碼
009.ES6中的模組化?
答:ES6模組化
ES6 的模組化分為匯出(export) @與匯入(import)兩個模組。
as 的用法
010.模組化的發展流程?
不做深入理解
011.JS中的閉包(重點)
012.瀏覽器事件環 (重點 * 巨集、微任務)
013.ES6新增了哪些內容,簡單說一下
014.對JS原型和原型鏈的理解?
015.對JS作用域和作用域鏈的理解?
016.JS中new究竟做了什麼?
1.建立物件
2.繫結this
3.連結到原型
4.返回物件
JS中 new究竟做了什麼?
017.JS中this到底指向誰?怎麼改變this指向?
誰呼叫了包含this的方法,那麼this就指向誰
JS中的 this 到底指向誰?
改變this,可以用call、apply、bind,他們之間的區別?
JS中改變this的指向 call、apply 和 bind 的區別
018.TS主要是幹什麼的?
簡單地說,TS就是增加了重要的型別檢測機制,新增了很多型別,可以用來寫大型專案。
布林值、數字、字串、陣列、元組、列舉、any、void、null、undefined、never、object、型別斷言
019.JS中的方法(重中之重)
020.JS中的資料型別?
JavaScript中有6種資料型別:數字(number)、字串(string)、布林值(boolean)、undefined、null、物件(Object)。
其中物件型別包括:陣列(Array)、函式(Function)、還有兩個特殊的物件:正則(RegExp)和日期(Date)。