De facto standard 世界上不可思议的事实标准

前些天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引擎独有的一个特性,但是现在几大主流浏览器都支持了这种写法,就像我刚刚提到的,它也是“事实上的标准”之一。

我很有兴趣多讲一些关于“事实上的标准”的事情,但是无奈这种东西实在是太多了,我只知道其中的很小一部分——而且还常常记不起来,所以今天我也只能写到这里了,如果我再想起来什么的话也许会另外写篇新博文吧

(0)

相关推荐

  • De facto standard 世界上不可思议的事实标准

    前些天IEBlog中提到实现互通并不是只靠标准就行,其中举出了一些关于事实上的标准的考虑--所谓"事实上的标准",也就是并非标准,但大家都遵循着它去做事情的那么一种东西. 这些事实上的标准(也写作"De facto standard")往往是在某一种事物还没有标准的时候由当事的各方相互妥协而形成的,--有趣的是,作为妥协的结果,这些"事实上的标准"自身往往和其它的东西并不协调:而真正被称作"标准"的东西往往是在发生了很多事情之

  • 世界上最NB的人!

    有这么一个人.出身于贫苦的农村,但是天赋异秉,谈吐幽默深沉,交游极广, 自6岁起  每时刻身边至少有3个漂亮MM在追.  16岁出国到斯坦福大学深造,第一次上课时,老师介绍当今世界的八大数学难题,并且将  其写在黑板上.因为他迟到了,以为黑板上的题是老师留的作业.于是3天后他将这些题的  答案交给老师,并且说:"您怎么出了这么多的作业,我足足做了3天才做完." 老师目  瞪口呆!当今世界的八大数学难题就这样被解决了.  17岁回国参加世界大学 生运动会获得田径十项全能冠军.20岁博士即

  • 世界上最短的数字判断js代码

    我们知道JavaScript提供了typeof运算符,因此最容易想到的是用typeof来判断是否是number类型 function isNumber(obj) { return typeof obj === 'number' } 这个函数对于整数和浮点数都没有问题,但对于NaN值也返回true这让人感到不爽,毕竟用isNumber判断通过后谁也不会用NaN去做算术运算. 那改进一下,用Object.prototype.toString试试 function isNumber(obj) { re

  • C#异步的世界(上)

    前言 新进阶的程序员可能对async.await用得比较多,却对之前的异步了解甚少.本人就是此类,因此打算回顾学习下异步的进化史. 本文主要是回顾async异步模式之前的异步,下篇文章再来重点分析async异步模式. APM APM 异步编程模型,Asynchronous Programming Model 早在C#1的时候就有了APM.虽然不是很熟悉,但是多少还是见过的.就是那些类是BeginXXX和EndXXX的方法,且BeginXXX返回值是IAsyncResult接口. 在正式写APM示

  • 创造世界上最简单的 PHP 开发模式第1/5页

    /*************************************/ /* author:大龄青年 /* email :wenadmin@sina.com /* from: http://blog.csdn.net/hahawen /*************************************/ php 作为"最简单"的 Web 脚本语言, 在国内的市场越来越大,phper 越来越多,但是感觉大多数人好像没有考虑到模式问题,什么样的设计模式才是最优的,才是最适合

  • 世界上最健康的作息时间表分享

    7:30:起床.英国威斯敏斯特大学的研究人员发现,那些在早上5:22―7:21 分起床的人,其血液中有一种能引起心脏病的物质含量较高,因此,在7:21之后起床对身体健康更加有益. 打开台灯."一醒来,就将灯打开,这样将会重新调整体内的生物钟,调整睡眠和醒来模式."拉夫堡大学睡眠研究中心教授吉姆·霍恩说. 喝一杯水.水是身体内成千上万化学反应得以进行的必需物质.早上喝一杯清水,可以补充晚上的缺水状态. 7:30―8:00:在早饭之前刷牙."在早饭之前刷牙可以防止牙齿的腐蚀,因为

  • Redis集群方案

    前段时间搞了搞Redis集群,想用做推荐系统的线上存储,说来挺有趣,这边基础架构不太完善,因此需要我们做推荐系统的自己来搭这个存储环境,就自己折腾了折腾.公司所给机器的单机性能其实挺给力,已经可以满足目前的业务需求,想做redis集群主要有以下几点考虑: 1.扩展性,scale-out,以后数据量变得很大之后,不至于推到重来,redis虽然可以开启虚拟内存功能,单机也能提供超过物理内存上限的容量,但频繁在内存和硬盘间swap页会大大降低其性能,有点儿违背redis的设计初衷. 2.redis是一

  • golang常用库之gorilla/mux-http路由库使用详解

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:golang自带路由介绍 golang自带路由库 http.ServerMux ,实际上是一个 map[string]Handler,是请求的url路径和该url路径对于的一个处理函数的映射关系.这个实现比较简单,有一些缺点: 不支持参数设定,例如/user/:uid 这种泛型类型匹配无法很友好的支持REST模式,无

  • Java时间处理第三方包Joda Time使用详解

    目录 引言 Joda-Time体验 依赖 创建日期 日期格式化 日期计算 兼容JDK日期 引言 Joda-Time provides a quality replacement for the Java date and time classes.Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.t

  • JavaScript-世界上误解最深的语言分析

    JavaScript,是世界上最流行的编程语言之一.事实上世界上的每一台个人电脑都安装并在频繁使用至少一个JavaScript解释器.JavaScript的流行完全是由于他在WWW脚本语言领域中的地位决定的. Despite its popularity, few know that JavaScript is a very nice dynamic object-oriented general-purpose programming language. How can this be a s

随机推荐