全稱 Browser Object Model,瀏覽器對象模型。
JavaScript是由瀏覽器中內置的javascript腳本解釋器程序來執行javascript腳本語言的。
為了便于對瀏覽器的操作,javascript封裝了對瀏覽器的各個對象使得開發者可以方便的操作瀏覽器。
Window 對象是 JavaScript 層級中的頂層對象。
Window 對象代表一個瀏覽器窗口或一個框架。
Window 對象會在 <body> 或 <frameset> 每次出現時被自動創建。
document 對 Document 對象的只讀引用
location 用于窗口或框架的 Location 對象
history 對 History 對象的只讀引用。
document.tilte 設置網頁的標題
moveto() 將窗口左上角的屏幕位置移動到指定的 x 和 y 位置。
moveby() 相對于目前的位置移動。
resizeTo() 調整當前瀏覽器的窗口。
open() 打開新窗口顯示指定的URL(有的瀏覽器中是打一個新的選項卡)
setTimeout(vCode, iMilliSeconds) 超時后執行代碼。
setInterval(vCode, iMilliSeconds) 定時執行代碼,第一次也是先等待,到時再執行。setInterval() 方法可按照指定的周期(以毫秒計)來調用函數或計算表達式。
setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的參數
基本上所有的HTML元素中都可以指定事件屬性。
每個元素支持什么樣事件應查詢文檔。
所有的事件屬性都是以on開頭,后面的是事件的觸發方式,如:
onclick,表示單擊
onkeydown,表示鍵按下
...
鼠標點擊相關:
onclick 在用戶用鼠標左鍵單擊對象時觸發。
ondblclick 當用戶雙擊對象時觸發。
onmousedown 當用戶用任何鼠標按鈕單擊對象時觸發。
onmouseup 當用戶在鼠標位于對象之上時釋放鼠標按鈕時觸發。
鼠標移動相關:
onmouseout 當用戶將鼠標指針移出對象邊界時觸發。
onmousemove 當用戶將鼠標劃過對象時觸發。
焦點相關的:
onblur 在對象失去輸入焦點時觸發。
onfocus 當對象獲得焦點時觸發。
其他:
onchange 當對象或選中區的內容改變時觸發。
onload 在瀏覽器完成對象的裝載后立即觸發。
onsubmit 當表單將要被提交時觸發。
Location 對象是由 JavaScript runtime engine 自動創建的,包含有關當前 URL 的信息。
location中的重要方法:
href屬性 設置或獲取整個 URL 為字符串。
reload() 重新裝入當前頁面
Screen 對象是由 JavaScript runtime engine 自動創建的,包含有關客戶機顯示屏幕的信息。
屬性:
availHeight 獲取系統屏幕的工作區域高度,排除 Microsoft Windows 任務欄。
availWidth 獲取系統屏幕的工作區域寬度,排除 Windows 任務欄。
height 獲取屏幕的垂直分辨率。
width 獲取屏幕的水平分辨率。
示例:
document.write("屏幕工作區: " + screen.availHeight + ", " + screen.availWidth + "<br>");
document.write("屏幕分辨率: " + screen.height + ", " + screen.width + "<br>");
該對象代表整個文檔頁面
對象的集合:
all 獲取頁面所有元素對象
forms 獲取頁面所有表單對象
images 獲取頁面所有圖片對象
links 獲取所有超鏈接或area對象
具體的內容會在學習DOM時學習。
前后端分離這個詞相信大家都聽過,不知道大家是怎么理解的呢。前陣子看項目的時候,有一段實現硬是沒看懂,下面來給大家說一下一段愚蠢的經歷哈。
(我沒正正式式寫過前端,所以如果文章有錯的地方希望可以在評論區友善交流~)
一、交代背景
我一直都知道我現在的這個系統是前后端分離的,我的接口只會返回JSON出去,但我不曾關心前端是怎么處理我的JSON數據的(以及他是怎么跑通和運行的)
在某一天,我在查接口的時候,習慣F12,想直接看一下這個請求返回的JSON數據是什么。但是一看,在network返回的是html格式:
于是,我就很好奇啊,就看一下這個接口是不是我想象中的那個。于是就去找我的接口,看一下是不是真的返回JSON(我還專門Debug了一下,看看是不是真請求到這個接口上了):
得出的結果是:我的接口的確是返回JSON數據,瀏覽器的reponse返回的的確是HTML格式。
于是,我就去找我前端的小伙伴,去問了一下這是怎么搞的。他回復我說:“在瀏覽器看到返回的是頁面,那肯定是你們后端干的呀”
我說:“沒有啊,我Java接口返回的是JSON數據啊,是不是中途你們用node做了些處理啊?”(我之前聽過Node.js,但僅僅是聽過)
他說:“Node.js也是你們后端的啊。”
我一聽,啊?Node.js不是屬于前端的嗎?
二、初識Node.js
在遇到這個事情之前,其實我在知乎已經看了一個帖子,話題名是這個《畢設答辯,老師說node不可能寫后臺怎么辦?》
有興趣的小伙伴可以去了解一下,大多數內容還是挺通俗易懂的:
我在下載Node.js的時候,發現其簡介十分簡潔:
Node.js? is a JavaScript runtime built on Chrome's V8 JavaScript engine.
Node.js? 是一個基于 Chrome V8 引擎 的 JavaScript 運行時。
然后點進去Chrome V8引擎,再看了一下介紹:
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++. It is used in Chrome and in Node.js, among others.
V8是Google的開源高性能JavaScript和WebAssembly引擎,用C ++編寫。它用于Chrome和Node.js等。
看了介紹,一臉懵逼,這是啥玩意啊。下面我來解釋一下
2.1 V8引擎是什么?
眾所周知,JavaScript是解析型語言,我們寫好的JavaScript代碼會由JavaScript引擎去解析,而V8是JavaScript引擎的一種。
總結:V8引擎是JavaScript引擎的一種,這個引擎由C++來編寫的,性能很不錯。
參考資料:
2.2回到Node.js
瀏覽器為了安全,沒有為JavaScript提供一套IO環境,而一門后端語言是肯定能進行網絡通信、文件讀寫(IO)的。
后來,有牛逼的人把V8引擎搬到了服務端上,在V8引擎的基礎上加了網絡通信、IO、HTTP等服務端的函數。取了一個名字叫:Node.js
所以,Node.js是運行在服務端的,只不過在基礎語言是JavaScript。
三、前后端分離入門
回顧一下自己學JavaWeb的歷程:
目前我了解到的前后端分離,首先部署是分離的(至少不會跟Java綁定在一起部署):
Java接口只返回JSON數據:
關于前端這幾大框架:angular/vue/react這幾個我都是沒有寫過的,所以也就不多BB了。我一直想知道的是:前框框架和node是啥關系。問了一下前端的小伙伴,他回復是大致這樣的:
前端現在是講究工程化的,工程化用到了node而已(就是打包編譯那些會用到,項目里面真正跑起來的話是沒有這些東西的)
-----------以下引用摘錄:
Webpack、Less、Sass、Gulp、Bower以及這些工具的插件都是Node上開發的---@知乎陳龍
舉個例子:隨著發展,前端的JavaScript需要依賴的包也非常復雜,類比于Java我們會有Maven,而前端現在有npm (包管理)
參考資料(為什么要使用 npm):
3.1 方式一(Nginx+Server)
OK,現在假設我們用前端(vue/angular/react)開發完,開發環境下將JavaScript編譯/打包完,那我們能得到純靜態的文件。我們可以直接將純靜態文件放到Nginx(CDN)等等地方【只要能夠響應HTTP請求就行】。
如果請求是調用后端服務,則經過Nginx轉發到后端服務器,完成響應后經Nginx返回到瀏覽器。
3.2 方式二(加入Node.js)
在前邊的基礎上加入Node.js,至于為啥要Node.js,一個重要的原因就是:加快首屏渲染速度,解決SEO問題
加入Node.js,此時的請求流程應該是這樣的:
瀏覽器發起的請求經過前端機的Nginx進行分發.
URL請求統一分發到Node Server,在Node Server中根據請求類型從后端服務器上通過RPC服務請求頁面的模板數據,然后進行頁面的組裝和渲染;
API請求則直接轉發到后端服務器,完成響應。
最后
好的,現在問題來了:你是覺得Node.js歸屬在后端還是前端?
歡迎關注頭條號:JAVA大飛哥
覺得收獲的話可以點個關注收藏轉發一波喔,謝謝大佬們支持!
私信本頭條號:發送:“免費資料”就可以獲取微服務、分布式、高并發、高可用,性能優化丶源碼分析等等一些技術資料
最后,每一位讀到這里的Java程序猿朋友們,感謝你們能耐心地看完。希望在成為一名更優秀的Java程序猿的道路上,我們可以一起學習、一起進步!都能贏取白富美,走向架構師的人生巔峰!
年來,從事JavaScript的程序員越來越多,JavaScript的曝光率也越來越高,如果你想轉行試試JavaScript,不妨收下這份面試題及答案,沒準用得上。當然,如果針對這些問題,你有更棒的答案,歡迎移步至評論區。
1、什么是JavaScript?(這是基本題,對很多程序員來說也是送分題!)
JavaScript是客戶端和服務器端腳本語言,可以插入到HTML頁面中,并且是目前較熱門的Web開發語言。同時,JavaScript也是面向對象編程語言。
類似的基本題目還包括:JavaScript都有哪些類型?JavaScript是誰發明的?......
2、列舉Java和JavaScript之間的區別?
Java是一門十分完整、成熟的編程語言。相比之下,JavaScript是一個可以被引入HTML頁面的編程語言。這兩種語言并不完全相互依賴,而是針對不同的意圖而設計的。 Java是一種面向對象編程(OOPS)或結構化編程語言,類似的如C ++或C,而JavaScript是客戶端腳本語言,它被稱為非結構化編程。
3. JavaScript和ASP腳本相比,哪個更快?
JavaScript更快。JavaScript是一種客戶端語言,因此它不需要Web服務器的協助來執行。另一方面,ASP是服務器端語言,因此總是比JavaScript慢。值得注意的是,Javascript現在也可用于服務器端語言(nodejs)。
4、什么是負無窮大?
負無窮大是JavaScript中的一個數字,可以通過將負數除以零來得到。
5、如何將JavaScript代碼分解成幾行嗎?
在字符串語句中可以通過在第一行末尾使用反斜杠“\”來完成
例:document.write("This is \a program");
如果不是在字符串語句中更改為新行,那么javaScript會忽略行中的斷點。
例:
var x=1, y=2,
z=
x+y;
上面的代碼是完美的,但并不建議這樣做,因為阻礙了調試。
6、什么是未聲明和未定義的變量?
未聲明的變量是程序中不存在且未聲明的變量。如果程序嘗試讀取未聲明變量的值,則會遇到運行時錯誤。未定義的變量是在程序中聲明但尚未給出任何值的變量。如果程序嘗試讀取未定義變量的值,則返回未定義的值。
7、如何編寫可動態添加新元素的代碼?
8、什么是全局變量?這些變量如何聲明,使用全局變量有哪些問題?
全局變量是整個代碼長度可用的變量,也就是說這些變量沒有任何作用域。var關鍵字用于聲明局部變量或對象。如果省略var關鍵字,則聲明一個全局變量。
例:// Declare a global globalVariable=“Test”;
使用全局變量所面臨的問題是本地和全局變量名稱的沖突。此外,很難調試和測試依賴于全局變量的代碼。
9、解釋JavaScript中定時器的工作?如果有,也可以說明使用定時器的缺點?
定時器用于在設定的時間執行一段代碼,或者在給定的時間間隔內重復該代碼。這通過使用函數setTimeout,setInterval和clearInterval來完成。
setTimeout(function,delay)函數用于啟動在所述延遲之后調用特定功能的定時器。
setInterval(function,delay)函數用于在提到的延遲中重復執行給定的功能,只有在取消時才停止。
clearInterval(id)函數指示定時器停止。
定時器在一個線程內運行,因此事件可能需要排隊等待執行。
10、ViewState和SessionState有什么區別?
“ViewState”特定于會話中的頁面。
“SessionState”特定于可在Web應用程序中的所有頁面上訪問的用戶特定數據。
11、什么是===運算符?
===被稱為嚴格等式運算符,當兩個操作數具有相同的值而沒有任何類型轉換時,該運算符返回true。
12、說明如何使用JavaScript提交表單?
要使用JavaScript提交表單,請使用
document.form [0] .submit();
document.form [0] .submit()
13、元素的樣式/類如何改變?
可以通過以下方式完成:
document.getElementById(“myText”).style.fontSize=“20?;
或
document.getElementById(“myText”).className=“anyclass”;
14、JavaScript中的循環結構都有什么?
For、While、do-while loops
15、如何在JavaScript中將base字符串轉換為integer?
parseInt() 函數解析一個字符串參數,并返回一個指定基數的整數。parseInt()將要轉換的字符串作為其第一個參數,第二個參數是給定字符串的基礎。
為了將4F(基數16)轉換為整數,所使用的代碼是 :parseInt ("4F", 16);
16、說明“==”和“===”之間的區別?
“==”僅檢查值相等,而“===”是一個更嚴格的等式判定,如果兩個變量的值或類型不同,則返回false。
17、3 + 2 +“7”的結果是什么?
由于3和2是整數,它們將直接相加。由于7是一個字符串,它將會被直接連接,所以結果將是57。
18、說明如何檢測客戶端機器上的操作系統?
為了檢測客戶端機器上的操作系統,應使用navigator.appVersion字符串(屬性)。
19、Javascript中的NULL是什么意思?
NULL用于表示無值或無對象。它意味著沒有對象或空字符串,沒有有效的布爾值,沒有數值和數組對象。
20、delete操作符的功能是什么?
delete操作符用于刪除程序中的所有變量或對象,但不能刪除使用VAR關鍵字聲明的變量。
21、JavaScript中有哪些類型的彈出框?
Alert、Confirm and、Prompt
22、Void(0)怎么用?
Void(0)用于防止頁面刷新,并在調用時傳遞參數“zero”。
Void(0)用于調用另一種方法而不刷新頁面。
23、如何強制頁面加載JavaScript中的其他頁面?
必須插入以下代碼才能達到預期效果:
24、escape字符是用來做什么的?
使用特殊字符(如單引號,雙引號,撇號和&符號)時,將使用轉義字符(反斜杠)。在字符前放置反斜杠,使其顯示。
例:
25、什么是JavaScript Cookie?
Cookie是用來存儲計算機中的小型測試文件,當用戶訪問網站以存儲他們需要的信息時,它將被創建。
26、解釋JavaScript中的pop()方法?
pop()方法與shift()方法類似,但不同之處在于Shift方法在數組的開頭工作。此外,pop()方法將最后一個元素從給定的數組中取出并返回。然后改變被調用的數組。
例:
var cloths=[“Shirt”, “Pant”, “TShirt”];
cloths.pop();
//Now cloth becomes Shirt,Pant
27、在JavaScript中使用innerHTML的缺點是什么?
如果在JavaScript中使用innerHTML,缺點是:內容隨處可見;不能像“追加到innerHTML”一樣使用;即使你使用+=like“innerHTML=innerHTML +'html'”舊的內容仍然會被html替換;整個innerHTML內容被重新解析并構建成元素,因此它的速度要慢得多;innerHTML不提供驗證,因此我們可能會在文檔中插入有效的和破壞性的HTML并將其中斷。
28、break和continue語句的作用?
Break語句從當前循環中退出。
continue語句繼續下一個循環語句。
29、在JavaScript中,dataypes的兩個基本組是什么?
Primitive
Reference types
原始類型是數字和布爾數據類型。引用類型是更復雜的類型,如字符串和日期。
30、如何創建通用對象?
通用對象可以創建為:
var I=new object();
31、operator類型用來做什么?
'Typeof'是一個運算符,用于返回變量類型的字符串描述。
32、哪些關鍵字用于處理異常?
try... Catch-finally用于處理JavaScript中的異常。
33、JavaScript中不同類型的錯誤有幾種?
有三種類型的錯誤:
Load time errors:該錯誤發生于加載網頁時,例如出現語法錯誤等狀況,稱為加載時間錯誤,并且會動態生成錯誤。
Run time errors:由于在HTML語言中濫用命令而導致的錯誤。
Logical Errors:這是由于在具有不同操作的函數上執行了錯誤邏輯而發生的錯誤。
34、在JavaScript中使用的Push方法是什么?
push方法用于將一個或多個元素添加或附加到數組的末尾。使用這種方法,可以通過傳遞多個參數來附加多個元素。
35、什么是JavaScript中的unshift方法?
Unshift方法就像在數組開頭工作的push方法。該方法用于將一個或多個元素添加到數組的開頭。
36、對象屬性如何分配?
屬性按以下方式分配給對象:
obj["class"]=12;
或
obj.class=12;
37、獲得CheckBox狀態的方式是什么?
alert(document.getElementById('checkbox1')。checked);
如果CheckBox被檢查,此警報將返回TRUE。
38、解釋window.onload和onDocumentReady?
在載入頁面的所有信息之前,不運行onload函數。這導致在執行任何代碼之前會出現延遲。
onDocumentReady在加載DOM之后加載代碼。這允許早期的代碼操縱。
39、你將如何解釋JavaScript中的閉包? 什么時候使用?
Closure是與函數返回時保留在內存中的函數相關的本地聲明變量。
例如:
40、一個值如何附加到數組?
可以以給定的方式將值附加到數組:
arr [arr.length]=value;
41、解釋for-in循環?
for-in循環用于循環對象的屬性。
for-in循環的語法是:
在每次循環中,來自對象的一個屬性與變量名相關聯,循環繼續,直到對象的所有屬性都被耗盡。
42、描述JavaScript中的匿名函數?
被聲明為沒有任何命名標識符的函數被稱為匿名函數。一般來說,匿名函數在聲明后無法訪問。
匿名函數聲明:
43、.call()和.apply()之間有什么區別?
函數.call()和.apply()在使用上非常相似,只是有一點區別。當程序員知道函數參數的編號時,使用.call(),因為它們必須在調用語句中被提及為參數。另一方面,當不知道數字時使用.apply(),函數.apply()期望參數為數組。
.call()和.apply()之間的基本區別在于將參數傳遞給函數。它們的用法可以通過給定的例子進行說明。
44、定義事件冒泡?
JavaScript允許DOM元素嵌套在一起。在這種情況下,如果單擊子級的處理程序,父級的處理程序也將執行同樣的工作。
45、什么樣的布爾運算符可以在JavaScript中使用?
“And”運算符(&&),'Or'運算符(||)和'Not'運算符(!)可以在JavaScript中使用。
*運算符沒有括號。
46、一個特定的框架如何使用JavaScript中的超鏈接定位?
可以通過使用“target”屬性在超鏈接中包含所需幀的名稱來實現。
<a href=”newpage.htm” target=”newframe”>>New Page</a>
47、在web-garden和web-farm之間有何不同?
web-garden和web-farm都是網絡托管系統。唯一的區別是web-garden是在單個服務器中包含許多處理器的設置,而web-farm是使用多個服務器的較大設置。
48、如何分配對象屬性?
將屬性分配給對象的方式與賦值給變量值相同。例如,表單對象的操作值以下列方式分配為“‘submit”:Document.form.action=“submit”
49、在JavaScript中讀取和寫入文件的方法是什么?
可以通過使用JavaScript擴展(從JavaScript編輯器運行),打開文件的示例來完成:
fh=fopen(getScriptPath(), 0);
50、在JavaScript中如何使用DOM?
DOM代表文檔對象模型,并且負責文檔中各種對象的相互交互。DOM是開發網頁所必需的,其中包括諸如段落,鏈接等對象。可以操作這些對象以包括添加或刪除等操作,DOM還需要向網頁添加額外的功能。除此之外,API的使用比其他更有優勢。
51、JavaScript中如何使用事件處理程序?
事件是由用戶生成活動(例如單擊鏈接或填寫表單)導致的操作。需要一個事件處理程序來管理所有這些事件的正確執行。事件處理程序是對象的額外屬性。此屬性包括事件的名稱以及事件發生時采取的操作。
52、解釋延遲腳本在JavaScript中的作用?
默認情況下,在頁面加載期間,HTML代碼的解析將暫停,直到腳本停止執行。這意味著,如果服務器速度較慢或者腳本特別沉重,則會導致網頁延遲。在使用Deferred時,腳本會延遲執行直到HTML解析器運行。這減少了網頁加載時間,并且它們的顯示速度更快。
53、JavaScript中的各種功能組件是什么?
JavaScript中的不同功能組件是:
First-class函數:JavaScript中的函數被用作第一類對象。這通常意味著這些函數可以作為參數傳遞給其他函數,作為其他函數的值返回,分配給變量,也可以存儲在數據結構中。
嵌套函數:在其他函數中定義的函數稱為嵌套函數。
54、解釋unshift()方法?
該方法在數組啟動時起作用,與push()不同。 它將所需數量的元素添加到數組的頂部。例如:
輸出如下所示:
[" joseph "," Jane ", " charlie ", " john "]
55、decodeURI()和encodeURI()是什么?
EncodeURl()用于將URL轉換為十六進制編碼。而DecodeURI()用于將編碼的URL轉換回正常。
56、為什么不建議在JavaScript中使用innerHTML?
innerHTML內容每次刷新,因此很慢。 在innerHTML中沒有驗證的余地,因此,更容易在文檔中插入錯誤代碼,從而使網頁不穩定。
57、如何在不支持JavaScript的舊瀏覽器中隱藏JavaScript代碼?
在<script>標簽之后的代碼中添加“<! - ”,不帶引號。
在<script>標簽之前添加“// - >”代碼中沒有引號。
舊瀏覽器現在將JavaScript代碼視為一個長的HTML注釋。而支持JavaScript的瀏覽器則將“<! - ”和“// - >”作為一行注釋。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。