js的設計缺陷

2021-09-02 17:06:26 字數 1558 閱讀 5173

原文請搜阮一峰

一、js為什麼有缺陷

1。設計階段過於倉促

設計者只用十天時間完成js的設計,而且設計初衷只是為了完成簡單的網頁互動,並沒有考慮複雜應用的需要

2。設計借鑑太雜

設計者本身擅長函式式程式設計,但由於某些原因又需要將js往物件導向上靠。又因為只想做一種簡單的指令碼語言就放棄了『類』的想法,採用prototype繼承模型,使這門語言顯得有點四不像

3。過早的標準化

js的發展太快,乃至沒時間調整設計。語言一經推出市場,立刻被廣泛接受,使用者量**式增長,缺乏乙個積累過程。並且netscape為了與微軟的jscript競爭,強勢申請js的國際標準。使得js在推出一年半後就稱為標準

二、js的幾個設計缺陷

1。不適合開發大型程式

js沒有命名空間(namespace)很難模組化;沒有如何將**分布在多個檔案的規範;允許同名函式重複定義,後面的定義覆蓋前面的定義,很不利於模組化載入

2。js提供的標準函式庫非常小,只能完成一些基本操作

3。全域性變數難以控制

在每個函式裡面都能生成全域性變數,增加了程式的複雜性如:function a() 這裡的b就是全域性變數

4。自動插入行尾分號

js所有語句,都必須以分號結尾。但是,如果你忘記加分號,直譯器會自動加上,有時候會導致難以發現的錯誤比如

function();

}

這裡直譯器會自動在return後面加分號則函式返回undefined。而如果這樣寫

function()

}

則函式返回乙個物件

5。陣列與物件的區分

js中的陣列也屬於物件,所以要辨別乙個物件是不是陣列有點麻煩。douglas crockford的**是這樣的

if(arr && typeof arr ==='object' && typeof arr.length === 'number'

&& !arr.prototypeisenumerable('length'))

其中第二個條件是限制arr首先是個物件,第三個條件arr有自有屬性length並且屬性型別是number(如果是繼承自prototype則型別就是undefined),第四個條件限制這個屬性是預定義屬性而不是使用者定義的,因為,預定義的屬性是不可列舉的,而使用者定義的屬性是可列舉的

6。基本型別的包裝物件

js有三種基本型別:字串、數字、布林值。他們又都有相應的建構函式生成相應的物件。這種設計作用很小,造成混淆不小

typeof 1234;//number

typeof new number(1234); //object

7。其他的一些奇怪設計

包括像null、nan、==與===等都容易產生混淆而又比較雞肋

類的設計缺陷

這是乙個很無意識的錯誤。class example 需求是這樣的。我有乙個輸入,我需要對其進行合法性的檢測,然後給出處理結果。我之前的認知都是,乙個function實現乙個功能,所以自然而然的,我設計出了這樣的乙個class。師傅看了一眼就指出了我其中的問題,如下所示 問題這樣的乙個class,會增...

jbpm設計缺陷

刪除 只能直接刪除流程部署 而沒有提供刪除流程定義的api test public void testdeletedeployment 想要刪除流程定義 根據key得到所有的流程定義,然後遍歷每乙個流程定義,得到流程部署,然後依次刪除 2 根據taskid查詢任務 taskservice.getta...

聊聊CORS的過度設計缺陷

注 本文不講cors原理,且預設你已了解cors,但對其中一些細節抱有同樣的懷疑瀏覽器的同源策略自其誕生以來就一直存在,如何進行跨域hack,一代又一代的前後端都為此費盡了心機。首先可以肯定的是,同源策略的限制是合理的。因為,服務端後台介面就部署在那,任何人只要構造了乙個正確的http請求,都能得到...