js面試相關(guān)問題2

目錄

  1. 跨域問題

  2. symbol

  3. 什么是事件監(jiān)聽

  4. 手寫Promise

  5. 原型鏈

  6. 轉(zhuǎn)化下劃線命名到駝峰命名

  7. js字符串轉(zhuǎn)數(shù)字的方法

  8. 給兩個構(gòu)造函數(shù)A和B,如何實現(xiàn)A繼承B?

  9. 如果已經(jīng)有三個promise,A、B和C,想串行執(zhí)行,該怎么寫?

  10. js小題

  11. js加載過程阻塞,解決方法

  12. Event loop事件循環(huán)機制

  13. js大數(shù)轉(zhuǎn)換

  14. 手寫repeat方法

  15. 手寫bind call apply方法

  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

1.跨域問題

https://blog.csdn.net/weixin_30650039/article/details/98005318?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242

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主頁中的信息

27. js的強制類型轉(zhuǎn)換

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容