Javascript語言的設計不夠嚴謹,很多地方一不小心就會出錯。 我們要判斷一個全域物件myObj是否存在,如果不存在,就對它進行宣告。用自然語言描述的演算法如下:
if (myObj不存在){ 声明myObj; }
你可能會覺得,寫出這段程式碼很容易。但實際上,它涉及的語法問題,遠比我們想像的複雜。只有對Javascript語言的實作細節非常清楚,才可能分得清它們的差別。
第一種寫法
根據直覺,你可能覺得可以這樣寫:
if (!myObj) { myObj = { }; }
但是,運行這段程式碼,瀏覽器會直接拋出ReferenceError錯誤,導致運行中斷。請問錯在哪裡?
對了,if語句判斷myObj是否為空時,這個變數還不存在,所以才會報錯。改成下面這樣,就能正確運作了。
if (!myObj) { var myObj = { }; }
為什麼加了一個var以後,就不報錯了?難道這種情況下,if語句做判斷時,myObj就已經存在了嗎?
要回答這個問題,就必須知道Javascript解釋器的工作方式。 Javascript語言是"先解析,後運行",解析時就已經完成了變數聲明,所以上面的程式碼實際上等同於:
var myObj; if (!myObj) { var myObj = { }; }
因此,if語句做判斷時,myObj確實已經存在了,所以就不報錯了。這就是var指令的"代號提升"(hoisting)作用。 Javascript解釋器,只"提升"var指令定義的變量,對不使用var指令、直接賦值的變數不起作用,這就是為什麼不加var會報錯的原因。
第二種寫法
除了var指令,還可以有另一種改寫,也能得到正確的結果:
if (!window.myObj) { myObj = { }; }
window是javascript的頂層對象,所有的全域變數都是它的屬性。所以,判斷myobj是否為空,等同於判斷window物件是否有myobj屬性,這樣就可以避免因為myObj沒有定義而出現ReferenceError錯誤。不過,從程式碼的規範性考慮,最好還是對第二行加上var:
if (!window.myObj) { var myObj = { }; }
或寫成這樣:
if (!window.myObj) { window.myObj = { }; }
第三種寫法
#上面這種寫法的缺點在於,在某些運作環境中(如V8、Rhino),window未必是頂層物件。所以,考慮改寫成:
if (!this.myObj) { this.myObj = { }; }
在全域變數的層次中,this關鍵字總是指向頂層變量,所以就可以獨立於不同的運行環境。
第四種寫法
但是,上面這樣寫可讀性較差,而且this的指向是可變的,容易出錯,所以進一步改寫:
var global = this; if (!global.myObj) { global.myObj = { }; }
用自訂變數global表示頂層對象,就清楚多了。
第五種寫法
也可以使用typeof運算符,判斷myObj是否有定義。
if (typeof myObj == "undefined") { var myObj = { }; }
這是目前使用最廣泛的判斷javascript物件是否存在的方法。
第六種寫法
由於在已定義、但未賦值的情況下,myObj的值直接等於undefined,所以上面的寫法可以簡化:
if (myObj == undefined) { var myObj = { }; }
這裡有兩個地方要注意,首先第二行的var關鍵字不能少,否則會出現ReferenceError錯誤,其次undefined不能加單引號或雙引號,因為這裡比較的是undefined這種資料類型,而不是"undefined"這個字串。
第七種寫法
上面的寫法在"精確比較"(===)的情況下,依然成立:
if (myObj === undefined) { var myObj = { }; }
第八種寫法
根據javascript的語言設計,undefined == null,所以比較myObj是否等於null,也能得到正確結果:
if (myObj == null) { var myObj = { }; }
不過,雖然運行結果正確,但是從語義上看,這種判斷方法是錯的,應該要避免。因為null指的是已經賦值為null的空對象,也就是這個物件其實是有值的,而undefined指的是不存在或沒有賦值的對象。因此,這裡只能使用"比較運算子"(==),如果這裡使用"精確比較運算子"(===),就會出錯。
第九種寫法
也可以使用in運算符,判斷myObj是否為頂層物件的一個屬性:
if (!('myObj' in window)) { window.myObj = { }; }
第十種寫法
最後,使用hasOwnProperty方法,判斷myObj是否為頂層物件的一個屬性:
if (!this.hasOwnProperty('myObj')) { this.myObj = { }; }
總結
以上是javascript如何判斷物件存在的方法實例匯總的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1
強大的PHP整合開發環境

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3漢化版
中文版,非常好用

Atom編輯器mac版下載
最受歡迎的的開源編輯器