① 前端有哪些實(shí)現(xiàn)跨頁面通信的方法?
在前端中,可以使用以下幾種方法實(shí)現(xiàn)跨頁面通信:
localStorage:localStorage 是一種瀏覽器提供的本地存儲方式废岂,可以在同一個(gè)域名下的不同頁面之間共享數(shù)據(jù)。通過監(jiān)聽 storage 事件狱意,可以在一個(gè)頁面修改 localStorage 中的值湖苞,然后在另一個(gè)頁面獲取到變化。
sessionStorage:sessionStorage 類似于 localStorage髓涯,但是它只在當(dāng)前會話窗口內(nèi)有效袒啼,即同一個(gè)標(biāo)簽頁或窗口中共享數(shù)據(jù)。
cookie:cookie 是在客戶端存儲數(shù)據(jù)的一種方式纬纪,可以在同一個(gè)域名下的不同頁面之間共享數(shù)據(jù)蚓再。但是由于安全性和大小限制等原因,通常不推薦用于大量數(shù)據(jù)的存儲包各。
Broadcast Channel API:Broadcast Channel API 是 HTML5 新增的一個(gè) API摘仅,用于實(shí)現(xiàn)跨文檔通信(Cross Document Messaging),即在不同的窗口问畅、標(biāo)簽頁娃属、甚至不同的瀏覽器進(jìn)程之間進(jìn)行通信六荒。通過創(chuàng)建 broadcast channel 對象,可以在多個(gè)文檔之間發(fā)送消息并接收消息矾端。
window.postMessage:window.postMessage 方法也是實(shí)現(xiàn)跨文檔通信的一種方式掏击,可以向其他窗口發(fā)送消息,并接收返回值秩铆。此方法需要在目標(biāo)窗口中監(jiān)聽 message 事件砚亭,并判斷來源窗口是否可信。
以上是一些實(shí)現(xiàn)跨頁面通信的方法殴玛,具體選擇哪種取決于業(yè)務(wù)需求和技術(shù)棧捅膘。
使用 Broadcast Channel API 實(shí)現(xiàn)跨文檔通信的代碼示例如下:
在源窗口中:
// 創(chuàng)建 broadcast channel 對象
const channel = new BroadcastChannel('my_channel');
// 向其他文檔發(fā)送消息
channel.postMessage('Hello from source window!');
在目標(biāo)窗口中:
// 創(chuàng)建 broadcast channel 對象
const channel = new BroadcastChannel('my_channel');
// 監(jiān)聽消息
channel.addEventListener('message', event => {
console.log(`Received message: ${event.data}`);
// 向其他文檔發(fā)送回應(yīng)消息
channel.postMessage('Hello from target window!');
});
在源窗口和目標(biāo)窗口中,都需要創(chuàng)建同名的 broadcast channel 對象滚粟,并通過 postMessage 方法向其他文檔發(fā)送消息寻仗。通常情況下,只有在兩個(gè)文檔中同時(shí)打開同名的 broadcast channel 對象時(shí)凡壤,它們才能相互通信署尤。
在目標(biāo)窗口中,還需要監(jiān)聽 message 事件鲤遥,處理來自源窗口的消息沐寺,并向其他文檔發(fā)送回應(yīng)消息。
- 需要注意的是盖奈,Broadcast Channel API 只支持同源文檔之間的通信混坞,因此在不同的域名下的文檔中是無法實(shí)現(xiàn)跨文檔通信的。另外钢坦,如果將多個(gè) broadcast channel 對象綁定到同一個(gè)頻道(channel)究孕,則它們就可以相互通信了。
② TypeScript 的內(nèi)置數(shù)據(jù)類型有哪些爹凹?
TypeScript 的內(nèi)置數(shù)據(jù)類型包括以下幾種:
布爾類型(boolean):表示邏輯上的 true 或 false 值厨诸。
數(shù)字類型(number):表示數(shù)字,可以是整數(shù)或浮點(diǎn)數(shù)禾酱。
字符串類型(string):表示字符串微酬。
數(shù)組類型(array):表示一組具有相同類型的值的集合。
元組類型(tuple):表示已知元素?cái)?shù)量和類型的數(shù)組颤陶。
枚舉類型(enum):表示一組有名字的常量集合颗管。
任意類型(any):表示任何類型的值。
空類型(void):表示沒有任何返回值的函數(shù)滓走。
null 和 undefined 類型:用于表示空值或未定義的值垦江。
對象類型(object):表示非原始類型的值,例如對象搅方、函數(shù)比吭、數(shù)組等绽族。
never 類型:表示永遠(yuǎn)不存在的值的類型,通常用于表示拋出異绸锰伲或死循環(huán)的函數(shù)吧慢。
unknown 類型:表示任何類型的值,但只允許執(zhí)行受限制的操作慷彤,需要先進(jìn)行類型檢查或類型斷言娄蔼。
以上是 TypeScript 的內(nèi)置數(shù)據(jù)類型,開發(fā)者可以根據(jù)實(shí)際需求來選擇最合適的類型底哗。
③ 什么是虛擬 DOM?使用虛擬 DOM 一定更快嗎锚沸?
虛擬 DOM(Virtual DOM)是一種內(nèi)存中表示頁面結(jié)構(gòu)的 JavaScript 對象跋选,它通過 diff 算法比較前后兩個(gè)虛擬 DOM 的差異,并最小化瀏覽器中實(shí)際 DOM 的操作哗蜈,從而提升頁面渲染性能前标。
使用虛擬 DOM 并不一定更快。雖然虛擬 DOM 可以減少實(shí)際 DOM 操作次數(shù)距潘,但由于需要在 JavaScript 中維護(hù)虛擬 DOM炼列,所以也會帶來一定的開銷。此外音比,對于頁面結(jié)構(gòu)較簡單的應(yīng)用程序俭尖,直接操作實(shí)際 DOM 也可能比使用虛擬 DOM 更快。
因此洞翩,在選擇是否使用虛擬 DOM 時(shí)稽犁,應(yīng)該根據(jù)具體情況進(jìn)行權(quán)衡。如果應(yīng)用程序的頁面結(jié)構(gòu)比較復(fù)雜骚亿、數(shù)據(jù)頻繁變動已亥、交互邏輯較多,那么使用虛擬 DOM 可以有效地提升頁面渲染性能来屠。但如果應(yīng)用程序的頁面結(jié)構(gòu)比較簡單虑椎、數(shù)據(jù)變動較少,那么直接操作實(shí)際 DOM 可能更為簡單高效俱笛。