更新時(shí)間:2022-12-27 14:57:29 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1478次
1. JS 有哪些數(shù)據(jù)類型?
根據(jù) JavaScript 中的變量類型傳遞方式,分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型兩大類七種。
基本數(shù)據(jù)類型包括Undefined、Null、Boolean、Number、String、Symbol (ES6新增)六種。 引用數(shù)據(jù)類型只有Object一種,主要包括對(duì)象、數(shù)組和函數(shù)。
判斷數(shù)據(jù)類型采用typeof操作符,有兩種語法:
typeof 123;//語法一
typeof("123");//語法二
(1)typeof(null)返回object;
(2)null == undefined返回true,因?yàn)閡ndefined派生自null;
(3)null === undefined返回false。
2. 基本數(shù)據(jù)類型和引用數(shù)據(jù)類型有什么區(qū)別?
(1)兩者作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí):
基本數(shù)據(jù)類型傳入的是數(shù)據(jù)的副本,原數(shù)據(jù)的更改不會(huì)影響傳入后的數(shù)據(jù)。
引用數(shù)據(jù)類型傳入的是數(shù)據(jù)的引用地址,原數(shù)據(jù)的更改會(huì)影響傳入后的數(shù)據(jù)。
(2)兩者在內(nèi)存中的存儲(chǔ)位置:
基本數(shù)據(jù)類型存儲(chǔ)在棧中。
引用數(shù)據(jù)類型在棧中存儲(chǔ)了指針,該指針指向的數(shù)據(jù)實(shí)體存儲(chǔ)在堆中。
3. 判斷數(shù)據(jù)類型的方法有哪些?
(1)利用typeof可以判斷數(shù)據(jù)的類型;
(2)A instanceof B可以用來判斷A是否為B的實(shí)例,但它不能檢測(cè) null 和 undefined;
(3)B.constructor == A可以判斷A是否為B的原型,但constructor檢測(cè) Object與instanceof不一樣,還可以處理基本數(shù)據(jù)類型的檢測(cè)。不過函數(shù)的 constructor 是不穩(wěn)定的,這個(gè)主要體現(xiàn)在把類的原型進(jìn)行重寫,在重寫的過程中很有可能出現(xiàn)把之前的constructor給覆蓋了,這樣檢測(cè)出來的結(jié)果就是不準(zhǔn)確的。
(4)Object.prototype.toString.call()。Object.prototype.toString.call() 是最準(zhǔn)確最常用的方式。
4. 淺拷貝與深拷貝有何區(qū)別?如何實(shí)現(xiàn)?
淺拷貝只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身。
淺拷貝的實(shí)現(xiàn)方式有:(1)Object.assign():需注意的是目標(biāo)對(duì)象只有一層的時(shí)候,是深拷貝; (2)擴(kuò)展運(yùn)算符;
深拷貝就是在拷貝數(shù)據(jù)的時(shí)候,將數(shù)據(jù)的所有引用結(jié)構(gòu)都拷貝一份。
深拷貝的實(shí)現(xiàn)方式有: (1)手寫遍歷遞歸賦值; (2)結(jié)合使用JSON.parse()和0JSON.stringify()方法。
5. var、let、const的區(qū)別是什么?
var、let、const都是用于聲明變量或函數(shù)的關(guān)鍵字。其區(qū)別在于:
var | let | const | |
作用域 | 函數(shù)作用域 | 塊級(jí)作用域 | 塊級(jí)作用域 |
作用域內(nèi)聲明提升 | 有 | 無(時(shí)性死區(qū)) | 無 |
是否可重復(fù)聲明 | 是 | 否 | 否 |
是否可重復(fù)賦值 | 是 | 是 | 否(量) |
初始化時(shí)是否必需賦值 | 否 | 否 | 是 |
6. 什么是執(zhí)行上下文和執(zhí)行棧?
變量或函數(shù)的執(zhí)行上下文,決定了它們的行為以及可以訪問哪些數(shù)據(jù)。
每個(gè)上下文都有一個(gè)關(guān)聯(lián)的變量對(duì)象,而這個(gè)上下文中定義的所有變量和函數(shù)都存在于這個(gè)對(duì)象上(如DOM中全局上下文關(guān)聯(lián)的便是window對(duì)象)。
每個(gè)函數(shù)調(diào)用都有自己的上下文。當(dāng)代碼執(zhí)行流進(jìn)入函數(shù)時(shí),函數(shù)的上下文被推到一個(gè)執(zhí)行棧中。
在函數(shù)執(zhí)行完之后,執(zhí)行棧會(huì)彈出該函數(shù)上下文,在其上的所有變量和函數(shù)都會(huì)被銷毀,并將控制權(quán)返還給之前的執(zhí)行上下文。 JS的執(zhí)行流就是通過這個(gè)執(zhí)行棧進(jìn)行控制的。
7. 什么是作用域和作用域鏈?
作用域可以理解為一個(gè)獨(dú)立的地盤,可以理解為標(biāo)識(shí)符所能生效的范圍。
作用域最大的用處就是隔離變量,不同作用域下同名變量不會(huì)有沖突。
ES6中有全局作用域、函數(shù)作用域和塊級(jí)作用域三層概念。
當(dāng)一個(gè)變量在當(dāng)前塊級(jí)作用域中未被定義時(shí),會(huì)向父級(jí)作用域(創(chuàng)建該函數(shù)的那個(gè)父級(jí)作用域)尋找。如果父級(jí)仍未找到,就會(huì)再一層一層向上尋找,直到找到全局作用域?yàn)橹埂_@種一層一層的關(guān)系,就是作用域鏈 。
8. 什么是原型、原型鏈?
原型:JS聲明構(gòu)造函數(shù)(用來實(shí)例化對(duì)象的函數(shù))時(shí),會(huì)在內(nèi)存中創(chuàng)建一個(gè)對(duì)應(yīng)的對(duì)象,這個(gè)對(duì)象就是原函數(shù)的原型。構(gòu)造函數(shù)默認(rèn)有一個(gè)prototype屬性,prototype的值指向函數(shù)的原型。同時(shí)原型中也有一個(gè)constructor屬性,constructor的值指向原函數(shù)。
通過構(gòu)造函數(shù)實(shí)例化出來的對(duì)象,并不具有prototype屬性,其默認(rèn)有一個(gè)__proto__屬性,proto的值指向構(gòu)造函數(shù)的原型對(duì)象。在原型對(duì)象上添加或修改的屬性,在所有實(shí)例化出的對(duì)象上都可共享。
當(dāng)在實(shí)例化的對(duì)象中訪問一個(gè)屬性時(shí),首先會(huì)在該對(duì)象內(nèi)部尋找,如找不到,則會(huì)向其proto指向的原型中尋找,如仍找不到,則繼續(xù)向原型中proto指向的上級(jí)原型中尋找,直至找到或Object.prototype為止,這種鏈狀過程即為原型鏈。
以上就是“面試前必看的經(jīng)典JS常見面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)