阿恆 於 2006 年 06 月 29 日 10:54 發表 -
分類:
JavaScript Harry Fuecks 在 Site Point 說了一個令他困惑的問題:IE 中的 JavaScript split() 函數並不符合規範。
Fuecks 引述 ECMA-262(即 JavaScript 1.5,參考「用 ECMAScript 寫網頁」)中有關 split() 函式的定義:
若果正規表達式裡面的分隔字元有括號包圍,每當分隔字元被搜尋到,括號中的內容便會被切割出來放到輸出的陣列裡。……
Fuecks 認為這種語法在其他編程語言很常見,例如在 Perl 中:
| 1 | use Data::Dumper; |
| 2 | print Dumper(split(/(:)/, 'a:b:c')); |
輸出是:
| 1 | $VAR1 = 'a'; |
| 2 | $VAR2 = ':'; |
| 3 | $VAR3 = 'b'; |
| 4 | $VAR4 = ':'; |
| 5 | $VAR5 = 'c'; |
這是正確的輸出。在 PHP 中:
| 1 | print_r(preg_split('/(:)/', 'a:b:c', -1, PREG_SPLIT_DELIM_CAPTURE)); |
輸出是:
| 1 | Array ( |
| 2 | [0] => a |
| 3 | [1] => : |
| 4 | [2] => b |
| 5 | [3] => : |
| 6 | [4] => c |
| 7 | ) |
顯然這個也跟規範吻合。在 Python 中:
| 1 | import re |
| 2 | print re.compile('(:)').split('a:b:c') |
輸出是:
| 1 | ['a', ':', 'b', ':', 'c'] |
這也是正確的。在 Firefox 和 Opera 9 中使用 JavaScript:
| 1 | alert( "a:b:c".split(/(:)/) ); |
輸出是:
毫不意外地兩個瀏覽器都輸出了正確的結果。但是到了 IE 手上,這個函數的輸出變成了:
a,b,c
IE 喜歡獨樹一幟的又一例證。