Andy Croxall在Ten Oddities And Secrets About JavaScript羅列了他認爲的10個javascript怪異特性。縱觀全文,其實有些特性也並不那麼「怪異」。對於原文我不做翻譯,就順着文章談一下本身的理解吧,但願對讀者有所幫助。javascript
也談談Javascript中的幾個怪異特性(上) - nomospace(挪墨) - Nomospacehtml
1. Null is an Object(Null是一個Object)java
1正則表達式
alert(typeof null); //'object'數組
undefined表明無值的基本類型,null表明無值的引用類型。基本數據類型(number string boolean等等)是引用數據類型的子類(undefined是null的子類)。建議深刻閱讀理解Javascript_02_理解undefined和null。函數
1學習
alert(null instanceof Object); //falsespa
instanceof檢測對象a是否是對象b的實例的原理是:檢測對象b的prototype指向的對象是否在對象a的[[prototype]]鏈上,若在則返回true。因爲null無值,不屬於任何對象,故返回false,具體可參考Javascript Object Layout關係圖。prototype
2. NaN is a Number(NaN是一個Number)翻譯
1
alert(typeof NaN); //'Number'
2
alert(NaN === NaN); //false
根據MDC:The value of Number.NaN is Not-A-Number, same as the value of global object's NaN property. 也就是說NaN是Number的一個屬性,也是全局對象中的一個屬性,Number.NaN與NaN是同樣的。NaN與任何一個數字不相等,而且與NaN自己也不相等。
3. An Array With No Keys == False (空數組等於false)
1
alert(new Array() == false); //true
new Array()的返回值爲[],原表達式至關於[]==false,這個值爲true,具體演變過程見圓心的類型轉換的小樂趣。若是可以理解其中轉化的奧妙,如下幾段代碼的執行結果也都不難解釋。
1
var someVar = 0;
2
alert(someVar == false); //true
1
var someVar = []; //空數組
2
alert(someVar == false); //true
3
if (someVar) alert('hello'); //alert會執行, someVar會被計算爲true值
1
var someVar = 0;
2
alert(someVar == false); //true
3
alert(someVar === false); //false
順便說一句,Array長度的最大值爲4,294,967,295即2^32-1(The maximum length allowed for an array is 4,294,967,295.)
關於類型轉化,推薦擴展閱讀:Twisted logic: understanding truthy & falsy
4. replace() Can Accept a Callback Function(replace函數可接受一個回調函數)
通常咱們會這麼使用replace函數:
1
alert('10 13 21 48 52'.replace(/\d+/g, '*')); //用*來replace全部的數字
實際上,正如標題所言,replace後面接受一個Callback來進行一些額外的操做:
1
alert('10 13 21 48 52'.replace(/\d+/g, function(match) {
2
return parseInt(match) < 30 ? '*' : match;
3
}))//* * * 48 52
對於每一個匹配的數字進行一次三元表達式的操做。
5. Regular Expressions: More Than Just Match and Replace(關於正則表達式,不單單隻有match和replace函數)
除了match和replace函數之外,還可使用test函數,調用方式以下:
1
alert(/\w{3,}/.test('Hello')); //alerts 'true'
以及RegExp對象,具體用法見文檔。
關於正則的學習資料我推薦精通正則表達式。若是不是做科研,熟讀前半本就好了。正則表達式30分鐘入門教程也不錯,常備案頭溫故知新。