javascript - 编写 ECMAScript5 兼容代码

标签 javascript jquery jscript ecmascript-5

我想用 JavaScript/JScript/ECMAScript 构建一个库...无论你想怎么调用它,它将针对现代标准(HTML5、CSS3、ESv5),并记住任何支持该标准的浏览器!现在我知道已经有很多有用的库了,例如 jQuery 和 MooTools。当然它们很棒,而且我已经在必要的地方使用它们,但我不应该仅仅因为它很流行而被迫与其他开发人员一样追赶潮流!

因此,为了解决以下问题,我们不要关心 jQuery 和 MooTools 等第三方库。让我们开始讨论 JavaScript/JScript/ECMAScript 的本质。

首先,我在此之前问过一个问题( What's the difference between JavaScript, JScript & ECMAScript? ),因为我不知道有什么区别。

幸运的是,我得出了以下结论:

ECMAScript 是语言规范。 JavaScript 和 JScript 是 ECMAScript 的方言。

JavaScript 是 Mozilla 对 ECMAScript 的实现。

JScript 是 Microsoft 对 ECMAScript 的实现。

好吧,这是一个很好的简单答案,不是吗?但以下是由此产生的一些问题:

  1. 非 Mozilla 浏览器是否支持“JavaScript”,支持程度如何?
  2. 非 Microsoft 浏览器是否支持“JScript”,支持程度如何?

基于这两个问题,我做了一些挖掘,并在 IE9、FF14 和 GC19 上进行了简单的测试。

这是测试代码:

<!DOCTYPE html>
<html>
    <head>
        <title>HTML 5 Template</title>
        <script language="JavaScript1.3">
            jsver = "1.3";
        </script>
        <script language="JavaScript1.4">
            jsver = "1.4";
        </script>
        <script language="JavaScript1.5">
            jsver = "1.5";
        </script>
        <script language="JavaScript1.6">
            jsver = "1.6";
        </script>
        <script language="JavaScript1.7">
            jsver = "1.7";
        </script>
        <script language="JavaScript1.8">
            jsver = "1.8";
        </script>
        <script type="text/javascript">
            document.write("<B>Your browser supports JavaScript version " + jsver + ".</B>")
        </script>
    </head>
    <body>
    </body>
</html>

结果为:IE9 = JSv1.3、FF14 = JSv1.8、GC19 = JSv1.7

好的,然后我运行了这个测试,测试 ECMAScript 版本 5 支持: http://kangax.github.com/es5-compat-table/#showold

再次使用相同的浏览器(IE9、FF14、GC19),ESv5 似乎得到了很好的支持!

现在棘手的事情来了!我有微软背景,使用 C#、ASP.NET 等语言编写软件,所以自然地,我选择的 IDE 是 Visual Studio(目前是 2010 年)。当我查看 JavaScript 智能感知时,我会看到 ActiveXObject、Array、Object 等内容。

  1. 我应该信任 VS2010 的智能感知吗?
  2. 在哪里可以找到 ESv5 支持的对象和功能的引用?
  3. 如何检测浏览器是否支持特定对象或功能?
  4. 有没有比 VS2010 更好的工具可以帮助我编写兼容的 ESv5 代码?
  5. 重写现有对象(例如对象、数字、 bool 值等)的实现是否安全,或者我应该扩展现有的实现吗?

最后,关于 jQuery。假设我懒得自己编写核心合规性和功能,我可以只编写我的库来坐在 jQuery 之上...还是这只是一个逃避?

最佳答案

1) 不。当然,它不会仅限于有效的 ECMAScript。

2) http://kangax.github.com/es5-compat-table/总是有用的。

3) 您只需检查它是否已定义即可。例如

typeof(Array.isArray) === 'function'; // true in newer browsers, false in IE8

4) 最好的办法是阅读规范!在代码中使用 "use strict"; 还会捕获某些类型的错误,这是一个很好的做法。有关严格模式的更多说明,请访问 http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/

5)我当然不会替换原来的对象。如果您要扩展属性,我首先会仔细检查是否尚不存在兼容的实现。例如。 PrototypeJS 添加了(在浏览器实现它之前)一个 document.getElementsByClassName。当浏览器开始原生实现它时,他们发现使用 Prototype 的网站仍在使用基于 JS 的缓慢版本。修复方法只是将 Prototype 的定义包装在 if (document.getElementsByClassName == undefined) { }

关于javascript - 编写 ECMAScript5 兼容代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12053831/

相关文章:

windows - 如何隐藏 cmd.exe 和 cscript 命令提示符?

javascript - 如何在启用 "Private Browsing"的 iPhone 上检测用户?

javascript - 根据匹配的 id 组合两个对象列表

javascript - Jssor 列表 slider 和 X-Editable

jquery - 当 contentDocument 工作时,contents() 返回空

JavaScript Excel.Application ActiveX cell.Value 返回 "date"类型的值,其原型(prototype)中没有 toString()

exception - JavaScript中的ATL COM错误信息

javascript - Web SDK child_changed 可以返回 promise 吗?

javascript - Gherkin - 维持场景之间的状态

javascript - JSRender 在循环内使用 "this"变量?