避免全局命名空間污染
- 防止全局命名空間被污染莽鸿,我們通常的做法是將代碼包裹成一個 IIFE(Immediately-Invoked Function Expression)耸携,創(chuàng)建獨立隔絕的定義域嫩海。也使得內(nèi)存在執(zhí)行完后立即釋放橱乱。
- IIFE 還可確保你的代碼不會輕易被其它全局命名空間里的代碼所修改(i.e. 第三方庫蒜田,window 引用凭峡,被覆蓋的未定義的關(guān)鍵字等等)。
嚴格模式
ECMAScript 5 嚴格模式可在整個腳本或獨個方法內(nèi)被激活苇本。它對應不同的 javascript 語境會做更加嚴格的錯誤檢查袜茧。嚴格模式也確保了 javascript 代碼更加的健壯,運行的也更加快速瓣窄。
嚴格模式會阻止使用在未來很可能被引入的預留關(guān)鍵字笛厦。
你應該在你的腳本中啟用嚴格模式,最好是在獨立的 IIFE 中應用它俺夕。避免在你的腳本第一行使用它而導致你的所有腳本都啟動了嚴格模式裳凸,這有可能會引發(fā)一些第三方類庫的問題。
變量聲明
- 總是使用 var 來聲明變量劝贸。如不指定 var姨谷,變量將被隱式地聲明為全局變量
- 采用嚴格模式帶來的好處是,當你手誤輸入錯誤的變量名時映九,它可以通過報錯信息來幫助你定位錯誤出處梦湘。
js聲明提前
- javascript會自動將函數(shù)作用域內(nèi)的變量和方法的定義提前(只是提前聲明,賦值還是在原處)
使用嚴格等
- 總是使用 === 精確的比較操作符,避免在判斷的過程中践叠,由 JavaScript 的強制類型轉(zhuǎn)換所造成的困擾言缤。
等同== 和嚴格等===的區(qū)別
- ==, 兩邊值類型不同的時候禁灼,要先進行類型轉(zhuǎn)換管挟,再比較。
如果兩個值具有相同類型弄捕,會進行===比較僻孝,返回===的比較值
如果兩個值不具有相同類型,也有可能返回true
如果一個值是null另一個值是undefined守谓,返回true
如果一個值是string另個是number穿铆,會把string轉(zhuǎn)換成number再進行比較
如果一個值是true,會把它轉(zhuǎn)成1再比較斋荞,false會轉(zhuǎn)成0
- ===荞雏,不做類型轉(zhuǎn)換,類型不同的一定不等平酿。
要是兩個值類型不同凤优,返回false
要是兩個值都是number類型,并且數(shù)值相同蜈彼,返回true
要是兩個值都是stirng筑辨,并且兩個值的String內(nèi)容相同,返回true
要是兩個值都是true或者都是false幸逆,返回true
要是兩個值都是指向相同的Object棍辕,Arraya或者function,返回true
要是兩個值都是null或者都是undefined还绘,返回true
真假判斷
js中以下內(nèi)容為假:
false
null
undefined
0
‘’ (空字符串)
NaN
設(shè)置默認參數(shù)
- 輯操作符 || 和 && 也可被用來返回布爾值楚昭。如果操作對象為非布爾對象,那每個表達式將會被自左向右地做真假判斷蚕甥∧奶妫基于此操作,最終總有一個表達式被返回回來菇怀。這在變量賦值時,是可以用來簡化你的代碼的晌块。例如:如果x不存在且y不存在爱沟,x=1;如果x存在y存在匆背,x = y
this關(guān)鍵字
- 只在對象構(gòu)造器呼伸、方法和在設(shè)定的閉包中使用 this 關(guān)鍵字。this 的語義在此有些誤導。它時而指向全局對象(大多數(shù)時)括享,時而指向調(diào)用者的定義域(在 eval 中)搂根,時而指向 DOM 樹中的某一節(jié)點(當用事件處理綁定到 HTML 屬性上時),時而指向一個新創(chuàng)建的對象(在構(gòu)造器中)铃辖,還時而指向其它的一些對象(如果函數(shù)被 call() 和 apply() 執(zhí)行和調(diào)用時)剩愧。