目錄
跨域問題
symbol
什么是事件監(jiān)聽
手寫Promise
原型鏈
轉(zhuǎn)化下劃線命名到駝峰命名
js字符串轉(zhuǎn)數(shù)字的方法
給兩個構(gòu)造函數(shù)A和B,如何實現(xiàn)A繼承B?
如果已經(jīng)有三個promise,A、B和C,想串行執(zhí)行,該怎么寫?
js小題
js加載過程阻塞,解決方法
Event loop事件循環(huán)機制
js大數(shù)轉(zhuǎn)換
手寫repeat方法
手寫bind call apply方法
1.跨域問題
2. symbol
JavaScript基本數(shù)據(jù)類型有6種:Undefined、Null、Boolean、String、Number、Object。
ES6新增了一種數(shù)據(jù)類型:Symbol,表示獨一無二的值,Symbol最大的用途是用來定義對象的唯一屬性名。
ES5的對象屬性名都是字符串,容易造成屬性名的沖突。如使用了一個其他人提供的對象,但又想為其添加新的方法(mixin模式),那么新方法的名字有可能與已有方法產(chǎn)生沖突。因此,需要保證每個屬性的名字都是獨一無二,以防止屬性名的沖突。這就是ES6引入Symbol的原因。
3. 什么是事件監(jiān)聽
addEventListener()方法,用于向指定元素添加事件句柄,它可以更簡單的控制事件,語法為
element.addEventListener(event, function, useCapture);
第一個參數(shù)是事件的類型(如 "click" 或 "mousedown").
第二個參數(shù)是事件觸發(fā)后調(diào)用的函數(shù)。
第三個參數(shù)是個布爾值用于描述事件是冒泡還是捕獲。該參數(shù)是可選的。
事件傳遞有兩種方式,冒泡和捕獲
事件傳遞定義了元素事件觸發(fā)的順序,如果你將P元素插入到div元素中,用戶點擊P元素,
在冒泡中,內(nèi)部元素先被觸發(fā),然后再觸發(fā)外部元素,
捕獲中,外部元素先被觸發(fā),在觸發(fā)內(nèi)部元素,
3.手寫Promise


setTimeout實現(xiàn)異步
通過訂閱發(fā)布防止異步不執(zhí)行resolve reject
4.原型鏈
https://www.cnblogs.com/loveyaxin/p/11151586.html
5. 轉(zhuǎn)化下劃線命名到駝峰命名
public static String UnderlineToHump(String para){
StringBuilder result=new StringBuilder();
String a[]=para.split("_");
for(String s:a){
if(result.length()==0){
result.append(s.toLowerCase());
}else{
result.append(s.substring(0, 1).toUpperCase());
result.append(s.substring(1).toLowerCase());
}
}
return result.toString();
}
}
6. js字符串轉(zhuǎn)數(shù)字的方法
https://www.cnblogs.com/langtianya/p/4758491.html
7.給兩個構(gòu)造函數(shù)A和B,如何實現(xiàn)A繼承B?
function A(...) {} A.prototype...
function B(...) {} B.prototype...
A.prototype = Object.create(B.prototype);
8.如果已經(jīng)有三個promise,A、B和C,想串行執(zhí)行,該怎么寫?
// promise
A.then(B).then(C).catch(...)
// async/await
(async ()=>{
await a();
await b();
await c();
})()
9.js小題
Function.prototype.a = 1;
Object.prototype.b = 2;
function A() {}
var a = new A();
console.log(a.a, a.b); // undefined, 2
console.log(A.a, A.b); // 1, 2
https://www.cnblogs.com/everlose/p/12930468.html
10.js加載過程阻塞,解決方法
指定script標簽的async屬性。
如果async="async",腳本相對于頁面的其余部分異步地執(zhí)行(當(dāng)頁面繼續(xù)進行解析時,腳本將被執(zhí)行)
如果不使用async 且 defer="defer":腳本將在頁面完成解析時執(zhí)行
11. Event loop事件循環(huán)機制
https://blog.csdn.net/java_xiaoo/article/details/113666279
12. 微任務(wù)與宏任務(wù)
async function async1() {
console.log('async1 start');//2
await async2();//
console.log('async1 end');//6
}
async function async2() {
console.log('async2');//3
}
console.log('illegalscript start');//1
setTimeout(function() {
console.log('setTimeout');//8
}, 0);
async1();
new Promise(function(resolve) {
console.log('promise1');//4
resolve();
}).then(function() {
console.log('promise2');//7
});
console.log('illegalscript end');//5
https://blog.csdn.net/qq_41681425/article/details/85775077
13. js大數(shù)轉(zhuǎn)換
var a = '123456789';
var b = '9999999999999999912346789123456789';
function add(a,b) {
if (a.length < b.length){
let arr = Array(b.length - a.length).fill(0);
a = arr.join('') + a;
} else {
let arr = Array(a.length - b.length).fill(0);
b = arr.join('') + b
}
a = a.split('').reverse();
b = b.split('').reverse();
let sign = 0;
var newResult = [];
for(let i = 0;i < a.length;i++ ){
let c = a[i]/1 + b[i]/1 + sign;
if (c >= 10){
sign = 1;
newResult.unshift(c%10)
} else {
sign = 0;
newResult.unshift(c)
}
}
let result = newResult.join('');
console.log(result);
}
add(a,b)
https://blog.csdn.net/weixin_41421227/article/details/109521998
14. 手寫repeat方法
function sleep (func,wait,args) {
return new Promise((resolve)=>{
setTimeout(()=>{
func.apply(this,args);
resolve()
},wait)
})
}
function repeat(func, times, wait,args) {
return async function () {
for(i = 0;i<times;i++){
await sleep(func,wait,args)
}
}
}
function alert(){
console.log('hellowWord');
}
const repeatFunc = repeat(alert, 4, 3000);
repeatFunc()
// 調(diào)用這個 repeatFunc ("hellworld"),會alert4次 helloworld, 每次間隔3秒
15. 手寫bind call apply方法
https://my.oschina.net/u/4359458/blog/3224991
https://blog.csdn.net/weixin_34218579/article/details/88068954?utm_term=%E6%89%8B%E5%86%99apply&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-6-88068954&spm=3001.4430
16. 把類數(shù)組對象變?yōu)閿?shù)組
17. 變量生命
18. promise resolve可以傳一個對象嗎
19. 展開數(shù)組
20. es6和es5 變量聲明區(qū)別
21. Object.assign
22. ES5與ES6繼承
23. 手寫compose
24. Object.keys
25. 手寫reduce
26. javascript優(yōu)缺點
1. 什么是JavaScript
JavaScript是一種基于對象(Object)和事件驅(qū)動(Event Driven)并具有相對安全性的客戶端腳本語言。同時也是一種廣泛用于客戶端Web開發(fā)的腳本語言,常用來給HTML網(wǎng)頁添加動態(tài)功能,比如響應(yīng)用戶的各種操作。它最初由網(wǎng)景公司(Netscape)的Brendan Eich設(shè)計,是一種動態(tài)、弱類型、基于原型的語言,內(nèi)置支持類。
2. JavaScript的特點
(1).一種解釋性執(zhí)行的腳本語言。
同其他腳本語言一樣,JavaScript也是一種解釋性語言,其提供了一個非常方便的開發(fā)過程。JavaScript的語法基本結(jié)構(gòu)形式與C、C++、Java十分類似。但在使用前,不像這些語言需要先編譯,而是在程序運行過程中被逐行地解釋。JavaScript與HTML標識結(jié)合在一起,從而方便用戶的使用操作。
(2).一種基于對象的腳本語言。有哪些內(nèi)置對象
其也可以被看作是一種面向?qū)ο蟮恼Z言,這意味著JavaScript能運用其已經(jīng)創(chuàng)建的對象。因此,許多功能可以來自于腳本環(huán)境中對象的方法與腳本的相互作用。
(3).一種簡單弱類型腳本語言。怎么解決浮點數(shù)精度問題
其簡單性主要體現(xiàn)在:首先,JavaScript是一種基于Java基本語句和控制流之上的簡單而緊湊的設(shè)計,從而對于使用者學(xué)習(xí)Java或其他C語系的編程語言是一種非常好的過渡,而對于具有C語系編程功底的程序員來說,JavaScript上手也非常容易;其次,其變量類型是采用弱類型,并未使用嚴格的數(shù)據(jù)類型。
(4).一種相對安全腳本語言。
JavaScript作為一種安全性語言,不被允許訪問本地的硬盤,且不能將數(shù)據(jù)存入服務(wù)器,不允許對網(wǎng)絡(luò)文檔進行修改和刪除,只能通過瀏覽器實現(xiàn)信息瀏覽或動態(tài)交互。從而有效地防止數(shù)據(jù)的丟失或?qū)ο到y(tǒng)的非法訪問。
(5).一種事件驅(qū)動腳本語言。
JavaScript對用戶的響應(yīng),是以事件驅(qū)動的方式進行的。在網(wǎng)頁(Web Page)中執(zhí)行了某種操作所產(chǎn)生的動作,被稱為“事件”(Event)。例如按下鼠標、移動窗口、選擇菜單等都可以被視為事件。當(dāng)事件發(fā)生后,可能會引起相應(yīng)的事件響應(yīng),執(zhí)行某些對應(yīng)的腳本,這種機制被稱為“事件驅(qū)動”。
(6).一種跨平臺性腳本語言。
JavaScript依賴于瀏覽器本身,與操作環(huán)境無關(guān),只要計算機能運行瀏覽器,并支持JavaScript的瀏覽器,就可正確執(zhí)行,從而實現(xiàn)了“編寫一次,走遍天下”的夢想。
3. JavaScript的優(yōu)缺點
(1).JavaScript的優(yōu)點:
<1>.JavaScript減少網(wǎng)絡(luò)傳輸。
在JavaScript這樣的用戶端腳本語言出現(xiàn)之前,傳統(tǒng)的數(shù)據(jù)提交和驗證工作均由用戶端瀏覽器通過網(wǎng)絡(luò)傳輸?shù)椒?wù)器上進行。如果數(shù)據(jù)量很大,這對于網(wǎng)絡(luò)和服務(wù)器的資源來說實在是一種無形的浪費。而使用JavaScript就可以在客戶端進行數(shù)據(jù)驗證。
<2>.JavaScript方便操縱HTML對象。
JavaScript可以方便地操縱各種頁面中的對象,用戶可以使用JavaScript來控制頁面中各個元素的外觀、狀態(tài)甚至運行方式,JavaScript可以根據(jù)用戶的需要“定制”瀏覽器,從而使網(wǎng)頁更加友好。
<3>.JavaScript支持分布式運算。
JavaScript可以使多種任務(wù)僅在用戶端就可以完成,而不需要網(wǎng)絡(luò)和服務(wù)器的參與,從而支持分布式的運算和處理。
(2).JavaScript的局限性:
<1>.各瀏覽器廠商對JavaScript支持程度不同
目前在互聯(lián)網(wǎng)上有很多瀏覽器,如Firefox、Internet Explorer、Opera等,但每種瀏覽器支持JavaScript的程度是不一樣的,不同的瀏覽器在瀏覽一個帶有JavaScript腳本的主頁時,由于對JavaScript的支持稍有不同,其效果會有一定的差距,有時甚至?xí)@示不出來。
<2>.“Web安全性”對JavaScript一些功能犧牲。
當(dāng)把JavaScript的一個設(shè)計目標設(shè)定為“Web安全性”時,就需要犧牲JavaScript的一些功能。因此,純粹的JavaScript將不能打開、讀寫和保存用戶計算機上的文件。其有權(quán)訪問的唯一信息就是該JavaScript所嵌入的那個Web主頁中的信息