1. 全局變量
JS中所有的糟糕特性中,最為糟糕的一個(gè)就是它對(duì)全局變量的依賴(lài)。
許多編程語(yǔ)言都有全局變量,JS的問(wèn)題不僅在于它允許使用全局變量,而在于它依賴(lài)全局變量。JS中沒(méi)有鏈接器(link
),所有的編譯單元都載入一個(gè)公共的全局對(duì)象中。
2. 作用域
JS沒(méi)有提供塊級(jí)作用域,代碼塊中聲明的變量在包含此代碼塊的函數(shù)的任何位置都是可見(jiàn)的。
3. typeof
typeof null ---> 'object'
typeof /a/ ---> 大部分瀏覽器'object',但有小部分會(huì)返回'function'
IE8及更早的版本中,typeof DOM方法返回的是'object'而不是'function'。建議使用in
操作符來(lái)檢測(cè)DOM方法,舉例
// 兼容早期版本的IE瀏覽器
if ('querySelectorAll' in document) {
images = document.querySelectorAll('img');
}
4. parseInt(string
)
parseInt( )是把一個(gè)字符串轉(zhuǎn)換為整數(shù)的函數(shù)。他遇到非數(shù)字時(shí)就會(huì)停止解析。
如果string
第一個(gè)字符是0,那么該字符串會(huì)基于8進(jìn)制而不是10進(jìn)制來(lái)求值。在8進(jìn)制中,0和9都不是數(shù)字,所以parseInt('08')
和parseInt('09')
都產(chǎn)生0作為結(jié)果。
幸運(yùn)的是,parseInt('string', radix)
接受一個(gè)可選參數(shù)radix
,通過(guò)該參數(shù)可以指定轉(zhuǎn)換的基數(shù)。如此一來(lái),parseInt('08', 10)
會(huì)返回8。因此,建議使用該方法時(shí),應(yīng)該總要加上該基數(shù)參數(shù)。
5. 浮點(diǎn)數(shù)
JS中浮點(diǎn)數(shù)之間的計(jì)算是不準(zhǔn)確的,如0.1 + 0.2 不等于 0.3,這是JS中最經(jīng)常報(bào)告的bug。
幸運(yùn)的是,浮點(diǎn)數(shù)中的整數(shù)運(yùn)算時(shí)精確的,所以小數(shù)表現(xiàn)出來(lái)的錯(cuò)誤可以通過(guò)指定精度來(lái)避免。
舉例來(lái)說(shuō),美元可以通過(guò)乘以100而全部轉(zhuǎn)換成美分,然后就可以準(zhǔn)確地將美分相加,它們的和可以再除以100轉(zhuǎn)換成美元。
6. NaN
NaN是一個(gè)特殊的數(shù)量值,他表示的不是一個(gè)數(shù)字,但是
typeof NaN === 'number'
typeof 不能辨別數(shù)字和NaN,而且NaN也不等同自己。
判斷一個(gè)值是否可用作數(shù)字的最佳做法是使用isFinite( )
函數(shù),因?yàn)樗鼤?huì)篩選掉NaN和Infinity。遺憾的是,isFinite( )會(huì)試圖把它的云算數(shù)轉(zhuǎn)換為一個(gè)數(shù)字,所以值事實(shí)上不是一個(gè)數(shù)字,它就不是一個(gè)好的測(cè)試。
你可以自己定義一個(gè)isNumber函數(shù):
var isNumber = function(value) {
return typeof value === 'number'
&& isFinite(value);
};
7. 數(shù)組
JS中沒(méi)有真正的數(shù)組。這也不全是壞事,JS的數(shù)組確實(shí)非常好用,你不必設(shè)置數(shù)組的維度,而且它們永遠(yuǎn)不會(huì)產(chǎn)生越界錯(cuò)誤。但是它們的性能相比真正的數(shù)組可能相當(dāng)糟糕。
使用typeof
不能辨別出數(shù)組和對(duì)象。并且由于不同幀或窗口創(chuàng)建的數(shù)組的構(gòu)造函數(shù)是不同的,所以使用instanceof
方法來(lái)判斷一個(gè)對(duì)象是否為數(shù)組也是不可行的。
下面的方法是一種可靠的數(shù)組檢測(cè)方法:
Object.prototype.toString.call(obj) ===
'[object Array]';
arguments
數(shù)組不是一個(gè)數(shù)組,他只是一個(gè)有著length
成員屬性地對(duì)象。上面的檢測(cè)會(huì)分辨出arguments
并不是一個(gè)數(shù)組。
8. 對(duì)象
JS的對(duì)象永遠(yuǎn)不會(huì)是真的空對(duì)象,因?yàn)樗鼈兛梢詮脑玩溨腥〉贸蓡T屬性。