前些天IEBlog中提到實現互通並不是只靠標准就行,其中舉出了一些關於事實上的標准的考慮——所謂“事實上的標准”,也就是並非標准,但大家都遵循著它去做事情的那麼一種東西。
這些事實上的標准(也寫作“De facto standard”)往往是在某一種事物還沒有標准的時候由當事的各方相互妥協而形成的,——有趣的是,作為妥協的結果,這些“事實上的標准”自身往往和其它的東西並不協調;而真正被稱作“標准”的東西往往是在發生了很多事情之後才產生的,所以幾乎任何地方都有“事實上的標准”和“標准”有些格格不入的感覺。
說了半天廢話,該說正題了:
在本文開頭的那個鏈接中的博文裡,提到了一個關於正則表達式的語法問題:
像是“/]/”這樣的形式,由於“]”本身是“匹配這些字符中的任意一個”的語法中的一部分,故ECMAScript標准中把這樣的形式標記為“無效的表達式”——但是同時這樣的用法由於構成簡單,理解起來也並不容易產生歧義,所以實際上在大部分浏覽器中這麼用都是被認為“有效”的。
當IE9的開發團隊剛開始測試他們的新JavaScript引擎“Chakra”的時候,它們發現有一些本來運行得很好的JavaScript代碼在“Chakra”中不能運行,其中一個原因就是最初“Chakra”是按照ECMAScript標准來實現的,而舊代碼中包含很多像是這樣的在標准中無效的東西——若要兼容,並且“互通”,“Chakra”需要做的就不只是和標准一致,還要能認可這樣的表達式。
這是“實現互通並不是只靠標准就行”的一個好例子。
除了這個以外,JavaScript中一些其它的事實標准,比方說:
在一個字符串中如果在反斜線“\”之後輸入一個換行標記,無論是[LF](\n實際代表的含義),還是[CR](\r實際代表的含義),還是[CR][LF](\r\n實際代表的含義),都會和反斜線一起完全被忽略掉——說“忽略掉”還不夠准確,也許應該說“這種組合會被認為是把一個字符串拆在多行代碼裡”之類的。
如果這樣說還是覺得不好理解(甚至是莫名其妙)的話,通過一些代碼例子就應該比較容易理解了。
比方說,這樣的代碼:
復制代碼 代碼如下:
var s = "This is an\
one line string.";
其實是和
復制代碼 代碼如下:
var s = "This is an" +
" one line string.";
等價的。
而如果寫成
復制代碼 代碼如下:
var s = "This is an
one line string."
就會產生一個語法錯誤,原因是“未結束的字符串”。
剛開始的時候它只是在IE中使用的JScript引擎獨有的一個特性,但是現在幾大主流浏覽器都支持了這種寫法,就像我剛剛提到的,它也是“事實上的標准”之一。
我很有興趣多講一些關於“事實上的標准”的事情,但是無奈這種東西實在是太多了,我只知道其中的很小一部分——而且還常常記不起來,所以今天我也只能寫到這裡了,如果我再想起來什麼的話也許會另外寫篇新博文吧