也談談Javascript中的幾個"怪異"特性(上)

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分鐘入門教程也不錯,常備案頭溫故知新。

相關文章
相關標籤/搜索