本文目錄一覽:
javascript有哪些不合理的設計缺陷
一、為什麼Javascript有設計缺陷?
這裡有三個客觀原因,導致Javascript的設計不夠完善。
1. 設計階段過於倉促
Javascript的設計,其實只用了十天。而且,設計師是為了向公司交差,本人並不願意這樣設計(參見《Javascript誕生記》)。
另一方面,這種語言的設計初衷,是為了解決一些簡單的網頁互動(比如,檢查”用戶名”是否填寫),並沒有考慮複雜應用的需要。設計者做夢也想不到,Javascript將來可以寫出像Gmail這種極其龐大複雜的網頁。
2. 沒有先例
Javascript同時結合了函數式編程和面向對象編程的特點,這很可能是歷史上的第一例。而且直到今天為止,Javascript仍然是世界上唯一使用Prototype繼承模型的主要語言。這使得它沒有設計先例可以參考。
3. 過早的標準化
Javascript的發展非常快,根本沒有時間調整設計。
1995年5月,設計方案定稿;10月,解釋器開發成功;12月,向市場推出,立刻被廣泛接受,全世界的用戶大量使用。Javascript缺乏一個從小到大、慢慢積累用戶的過程,而是連續的爆炸式擴散增長。大量的既成網頁和業餘網頁設計者的參與,使得調整語言規格困難重重。
更糟的是,Javascript的規格還沒來及調整,就固化了。
1996年8月,微軟公司強勢介入,宣布推出自己的腳本語言Jscript;11月,為了壓制微軟,網景公司決定申請Javascript的國際標準;1997年6月,第一個國際標準ECMA-262正式頒布。
也就是說,Javascript推出一年半之後,國際標準就問世了。設計缺陷還沒有充分暴露就成了標準。相比之下,C語言問世將近20年之後,國際標準才頒布。
二、Javascript的10個設計缺陷
1. 不適合開發大型程序
Javascript沒有名稱空間(namespace),很難模塊化;沒有如何將代碼分布在多個文件的規範;允許同名函數的重複定義,後面的定義可以覆蓋前面的定義,很不利於模塊化載入。
2. 非常小的標準庫
Javascript提供的標準函數庫非常小,只能完成一些基本操作,很多功能都不具備。
3. null和undefined
null屬於對象(object)的一種,意思是該對象為空;undefined則是一種數據類型,表示未定義。
typeof null; // object
typeof undefined; // undefined
兩者非常容易混淆,但是含義完全不同。
var foo;
alert(foo == null); // true
alert(foo == undefined); // true
alert(foo === null); // false
alert(foo === undefined); // true
在編程實踐中,null幾乎沒用,根本不應該設計它。
4. 全局變數難以控制
Javascript的全局變數,在所有模塊中都是可見的;任何一個函數內部都可以生成全局變數,這大大加劇了程序的複雜性。
a = 1;
(function(){
b=2;
alert(a);
})(); // 1
alert(b); //2
5. 自動插入行尾分號
Javascript的所有語句,都必須以分號結尾。但是,如果你忘記加分號,解釋器並不報錯,而是為你自動加上分號。有時候,這會導致一些難以發現的錯誤。
比如,下面這個函數根本無法達到預期的結果,返回值不是一個對象,而是undefined。
function(){
return
{
i=1
};
}
原因是解釋器自動在return語句後面加上了分號。
function(){
return;
{
i=1
};
}
6. 加號運算符
+號作為運算符,有兩個含義,可以表示數字與數字的和,也可以表示字元與字元的連接。
alert(1+10); // 11
alert(“1″+”10”); // 110
如果一個操作項是字元,另一個操作項是數字,則數字自動轉化為字元。
alert(1+”10″); // 110
alert(“10″+1); // 101
這樣的設計,不必要地加劇了運算的複雜性,完全可以另行設置一個字元連接的運算符。
7. NaN
NaN是一種數字,表示超出了解釋器的極限。它有一些很奇怪的特性:
NaN === NaN; //false
NaN !== NaN; //true
alert( 1 + NaN ); // NaN
與其設計NaN,不如解釋器直接報錯,反而有利於簡化程序。
8. 數組和對象的區分
由於Javascript的數組也屬於對象(object),所以要區分一個對象到底是不是數組,相當麻煩。Douglas Crockford的代碼是這樣的:
if ( arr
typeof arr === ‘object’
typeof arr.length === ‘number’
!arr.propertyIsEnumerable(‘length’)){
alert(“arr is an array”);
}
9. == 和 ===
==用來判斷兩個值是否相等。當兩個值類型不同時,會發生自動轉換,得到的結果非常不符合直覺。
“” == “0” // false
0 == “” // true
0 == “0” // true
false == “false” // false
false == “0” // true
false == undefined // false
false == null // false
null == undefined // true
” \t\r\n” == 0 // true
因此,推薦任何時候都使用”===”(精確判斷)比較符。
10. 基本類型的包裝對象
Javascript有三種基本數據類型:字元串、數字和布爾值。它們都有相應的建構函數,可以生成字元串對象、數字對象和布爾值對象。
new Boolean(false);
new Number(1234);
new String(“Hello World”);
與基本數據類型對應的對象類型,作用很小,造成的混淆卻很大。
alert( typeof 1234); // number
alert( typeof new Number(1234)); // object
關於Javascript的更多怪異行為,請參見Javascript Garden和wtfjs.com。
三、如何看待Javascript的設計缺陷?
既然Javascript有缺陷,數量還不少,那麼它是不是一種很糟糕的語言?有沒有前途?
回答是Javascript並不算糟糕,相反它的編程能力很強大,前途很光明。
首先,如果遵守良好的編程規範,加上第三方函數庫的幫助,Javascript的這些缺陷大部分可以迴避。
其次,Javascript目前是網頁編程的唯一語言,只要互聯網繼續發展,它就必然一起發展。目前,許多新項目大大擴展了它的用途,node.js使得Javascript可以用於後端的伺服器編程,coffeeScript使你可以用python和ruby的語法,撰寫Javascript。
最後,只要發布新版本的語言標準(比如 ECMAscript 5),就可以彌補這些設計缺陷。當然,標準的發布和標準的實現是兩回事,上述的很多缺陷也許會一直伴隨到Javascript存在的最後一天。
《JavaScript設計模式》pdf下載在線閱讀全文,求百度網盤雲資源
《JavaScript設計模式》百度網盤pdf最新全集下載:
鏈接:
?pwd=i1tg 提取碼:i1tg
簡介:《JavaScript設計模式》共分六篇四十章,首先討論了幾種函數的編寫方式,體會JavaScript在編程中的靈活性;然後講解了面向對象編程的知識,其中討論了類的創建、數據的封裝以及類之間的繼承;最後探討了各種模式的技術,如簡單工廠模式,包括工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式,以及外觀模式,包括適配器模式。本書還講解了幾種適配器、代理模式、裝飾者模式和MVC模式,討論了如何實現對數據、視圖、控制器的分離。在講解MVP模式時,討論了如何解決數據與視圖之間的耦合,並實現了一個模板生成器;講解MVVM模式時,討論了雙向綁定對MVC的模式演化。
javascript要學多久?
從0基礎到勉強能用,只求入門的話2-3個月綽綽有餘,但是要精通的話肯定是需要花更多時間日積月累了,選擇培訓的話是要參與一些項目聯練習的,因為JavaScript很多技巧不通過項目這樣比較大的歷練是用不上的。千鋒官網每日更新最新軟體開發基礎知識內容,鞏固日常學習中的基礎技能。更有免費的軟體開發視頻教程幫助學員快速學習。 千鋒教育就有線上免費的軟體開發公開課,。
Web前端培訓多長時間,只能說簡單入門在五到六個月,真正要達到精通級別的話,需要天賦跟經驗的積累。正所謂,一入前端深似海,從此回首無邊界。活到老,學到老。只要步入了前端開發你就會發現,前端真的是要一直不停的學,不停的學。千鋒教育集團目前已與國內4000多家企業建立人才輸送合作,與500多所大學建立實訓就業合作,每年為各大企業輸送上萬名移動開發工程師,每年有數十萬名學員受益於千鋒教育組織的技術研討會、技術培訓課、網路公開課及免費教學視頻。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/192664.html