06 js發布訂閱模式簡單實現(前端經典面試題(包含JS、CSS、React、瀏覽器等))

时间:2024-04-30 09:48:31 编辑: 来源:

買粉絲lorChange 方法是靜態的。靜態方法僅在創建它們的構造函數中存在,并且不能傳遞給任何子級。由于 freddie 是一個子級對象,函數不會傳遞,所以在 freddie 實例上不存在 freddie 方法:拋出 TypeError 。

1.使用第一次push,obj對象的push方法設置 obj[2]=1;obj.length+=1 2.使用第二次push,obj對象的push方法設置 obj[3]=2;obj.length+=1 3.使用買粉絲nsole.log輸出的時候,因為obj具有 length 屬性和 splice 方法,故將其作為數組進行打印 4.打印時因為數組未設置下標為 0 1 處的值,故打印為empty,主動 obj[0] 獲取為 undefined

undefined { n:2}

首先,a和b同時引用了{ n:2}對象,接著執行到a.x = a = { n:2}語句,盡管賦值是從右到左的沒錯,但是.的優先級比=要高,所以這里首先執行a.x,相當于為a(或者b)所指向的{ n:1}對象新增了一個屬性x,即此時對象將變為{ n:1;x:undefined}。之后按正常情況,從右到左進行賦值,此時執行a ={ n:2}的時候,a的引用改變,指向了新對象{ n:2},而b依然指向的是舊對象。之后執行a.x = { n:2}的時候,并不會重新解析一遍a,而是沿用最初解析a.x時候的a,也即舊對象,故此時舊對象的x的值為{ n:2},舊對象為 { n:1;x:{ n:2}},它被b引用著。后面輸出a.x的時候,又要解析a了,此時的a是指向新對象的a,而這個新對象是沒有x屬性的,故訪問時輸出undefined;而訪問b.x的時候,將輸出舊對象的x的值,即{ n:2}。

在比較相等性,原始類型通過它們的值進行比較,而對象通過它們的引用進行比較。 JavaScript 檢查對象是否具有對內存中相同位置的引用。

我們作為參數傳遞的對象和我們用于檢查相等性的對象在內存中位于不同位置,所以它們的引用是不同的。

這就是為什么 { age: 18 } === { age: 18 } 和 { age: 18 } == { age: 18 } 返回 false 的原因。

所有對象鍵(不包括 Symbols )都會被存儲為字符串,即使你沒有給定字符串類型的鍵。這就是為什么 obj.hasOwnProperty('1') 也返回 true 。

上面的說法不適用于 Set 。在我們的 Set 中沒有 “1” : set.has('1') 返回 false 。它有數字類型 1 , set.has(1) 返回 true 。

這題考察的是對象的鍵名的轉換。

catch 塊接收參數 x 。當我們傳遞參數時,這與變量的 x 不同。這個變量 x 是屬于 catch 作用域的。

之后,我們將這個塊級作用域的變量設置為 1 ,并設置變量 y 的值。現在,我們打印塊級作用域的變量 x ,它等于 1 。

在 catch 塊之外, x 仍然是 undefined ,而 y 是 2 。當我們想在 catch 塊之外的 買粉絲nsole.log(x) 時,它返回 undefined ,而 y 返回 2 。

如何快速搭建一個微服務架構

什么是微服務?

微服務(Microservices Architecture)是一種架構風格,一個大型復雜軟件應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是松耦合的。每個微服務僅關注于完成一件任務并很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。

微服務的概念源于2014年3月Martin Fowler所寫的文章“Microservices” martinfowler.買粉絲/articles/mi…

單體架構(Monolithic Architecture )

企業級的應用一般都會面臨各種各樣的業務需求,而常見的方式是把大量功能堆積到同一個單體架構中去。比如:常見的ERP、CRM等系統都以單體架構的方式運行,同時由于提供了大量的業務功能,隨著功能的升級,整個研發、發布、定位問題,擴展,升級這樣一個“怪物”系統會變得越來越困難。

這種架構模式就是把應用整體打包部署,具體的樣式依賴本身應用采用的語言,如果采用java語言,自然你會打包成war包,部署在Tomcat或者Jetty這樣的應用服務器上,如果你使用spring boot還可以打包成jar包部署。其他還有Rails和Node.js應用以目錄層次的形式打包

上圖:單體架構

大部分企業通過SOA來解決上述問題,SOA的思路是把應用中相近的功能聚合到一起,以服務的形式提供出去。因此基于SOA架構的應用可以理解為一批服務的組合。SOA帶來的問題是,引入了大量的服務、消息格式定義和規范。

多數情況下,SOA的服務直接相互獨立,但是部署在同一個運行環境中(類似于一個Tomcat實例下,運行了很多web應用)。和單體架構類似,隨著業務功能的增多SOA的服務會變得越來越復雜,本質上看沒有因為使用SOA而變的更好。圖1,是一個包含多種服務的在線零售網站,所有的服務部署在一個運行環境中,是一個典型的單體架構。

單體架構的應用一般有以下特點:

微服務架構(Microservices Architecture)

微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務運行在自己的進程中,開發和發布都沒有依賴。不同服務通過一些輕量級交互機制來通信,例如 RPC、HTTP 等,服務可獨立擴展伸縮,每個服務定義了明確的邊界,不同的服務甚至可以采用不同的編程語言來實現,由獨立的團隊來維護。簡單的來說,一個系統的不同模塊轉變成不同的服務!而且服務可以使用不同的技術加以實現!

上圖:微服務架構

微服務設計

那我們在微服務中應該怎樣設計呢。以下是微服務的設計指南:

微服務消息

在單體架構中,不同功能之間通信通過方法調用,或者跨語言通信。SOA降低了這種語言直接的耦合度,采用基于SOAP協議的web服務。這種web服務的功能和消息體定義都十分復雜,微服務需要更輕量的機制。

同步消息 REST

同步消息就是客戶端需要保持等待,直到服務器返回應答。REST是微服務中默認的同步消息方式,它提供了基于HTTP協議和資源API風格的簡單消息格式,多數微服務都采用這種方式(每個功能代表了一個資源和對應的操作)

異步消息 – AMQP, STOMP, MQTT

異步消息就是客戶端不需要一直等待服務應答,有應到后會得到通知。某些微服務需要用到異步消息,一般采用AMQP, STOMP, MQTT 這三種通訊協議

消息格式 – JSON, XML, Thrift, ProtoBuf, Avro

消息格式是微服務中另外一個很重要的因素。SOA的web服務一般采用文本消息,基于復雜的消息格式(SOAP)和消息定義(xsd)。微服務采用簡單的文本協議JSON和XML,基于HTTP的資源API風格。如果需要二進制,通過用到Thrift, ProtoBuf, Avro。

服務約定 – 定義接口 – Swagger, RAML, Thrift IDL

如果把功能實現為服務,并發布,需要定義一套約定。單體架構中,SOA采用WSDL,WSDL過于復雜并且和SOAP緊耦合,不適合微服務。

REST設計的微服務,通常采用Swagger和RAML定義約定。

對于不是基于REST設計的微服務,比如Thrift,通常采用IDL(Interface Definition Languages),比如Thrift IDL。

微服務集成 (服務間通信)

大部分微服務基于RPC、HTTP、JSON這樣的標準協議,集成不同標準和格式變的不再重要。另外一個選擇是采用輕量級的消息總線或者網關,有路由功能,沒有復雜的業務邏輯。下面就介紹幾種常見的架構方式。

點對點方式

點對點方式中,服務之間直接用。每個微服務都開放REST API,并且調用其它微服務的接口。

上圖:通過點對點方式通信

很明顯,在比較簡單的微服務應用場景下,這種方式還可行,隨著應用復雜度的提升,會變得越來越不可維護。這點有些類似SOA的ESB,盡量不采用點對點的集成方式。

API-網關方式

API網關方式的核心要點是,所有的客戶端和消費端都通過統一的網關接入微服務,在網關層處理所有的非業務功能個。通常,網關也是提供REST/HTTP的訪問API。服務端通過API-GW注冊和管理服務。

上圖:通過API-網關暴露微服務

所有的業務接口通過API網關暴露,是所有客戶端接口的唯一入口。微服務之間的通信也通過API網關。\

采用網關方式有如下優勢:

目前,API網關方式應該是微服務架構中應用最廣泛的設計模式。

消息代理方式

微服務也可以集成在異步的場景下,通過隊列和訂閱主題,實現消息的發布和訂閱。一個微服務可以是消息的發布者,把消息通過異步的方式發送到隊列或者訂閱主題下。作為消費者的微服務可以從隊列或者主題共獲取消息。通過消息中間件把服務之間的直接調用解耦。

上圖:異步通信方式

通常異步的生產者/消費者模式,通過AMQP, STOMP, MQTT 等異步消息通訊協議規范。

數據的去中心化

單體架構中,不同功能的服務模塊都把數據存儲在某個中心數據庫中。

每個微服務有自己私有的數據庫,其它微服務不能直接訪問。單體架構,用一個數據庫存儲所有數據

微服務方式,多個服務之間的設計相互獨立,數據也應該相互獨立(比如,某個微服務的數據庫結構定義方式改變,可能會中斷其它服務)。因此,每個微服務都應該有自己的數據

搜索关键词: