es5-shim

ECMAScript 5 compatibility shims for legacy (and modern) JavaScript engines

Github星跟蹤圖

es5-shim Version Badge

npm badge

Build Status
dependency status
dev dependency status

es5-shim.js and es5-shim.min.js monkey-patch a JavaScript context to
contain all EcmaScript 5 methods that can be faithfully emulated with a
legacy JavaScript engine.
Note: As es5-shim.js is designed to patch the native Javascript
engine, it should be the library that is loaded first.

es5-sham.js and es5-sham.min.js monkey-patch other ES5 methods as
closely as possible. For these methods, as closely as possible to ES5
is not very close. Many of these shams are intended only to allow code
to be written to ES5 without causing run-time errors in older engines.
In many cases, this means that these shams cause many ES5 methods to
silently fail. Decide carefully whether this is what you want.
Note: es5-sham.js requires es5-shim.js to be able to work properly.

Tests

The tests are written with the Jasmine BDD test framework.
To run the tests, navigate to /tests/ , or,
simply npm install and npm test.

Shims

Complete tests

  • Array.prototype.every
  • Array.prototype.filter
  • Array.prototype.forEach
  • Array.prototype.indexOf
  • Array.prototype.lastIndexOf
  • Array.prototype.map
  • Array.prototype.slice
  • Array.prototype.some
  • Array.prototype.sort
  • Array.prototype.reduce
  • Array.prototype.reduceRight
  • Array.prototype.push
  • Array.prototype.join
  • Array.isArray
  • Date.now
  • Date.prototype.toJSON
  • Function.prototype.bind
    • :warning: Caveat: the bound function has a prototype property.
    • :warning: Caveat: bound functions do not try too hard to keep you
      from manipulating their arguments and caller properties.
    • :warning: Caveat: bound functions don't have checks in call and
      apply to avoid executing as a constructor.
  • Number.prototype.toFixed
  • Number.prototype.toPrecision
  • Object.keys
  • String.prototype.split
  • String.prototype.trim
  • String.prototype.lastIndexOf
  • String.prototype.replace
    • Firefox (through v29) natively handles capturing groups incorrectly.
  • Date.parse (for ISO parsing)
  • Date.prototype.toISOString
  • parseInt
  • parseFloat
  • Error.prototype.toString
  • Error.prototype.name
  • Error.prototype.message
  • RegExp.prototype.toString

Shams

  • :warning: Object.create

    For the case of simply "begetting" an object that inherits
    prototypically from another, this should work fine across legacy
    engines.

    :warning: The second argument is passed to Object.defineProperties
    which will probably fail either silently or with extreme prejudice.

  • :warning: Object.getPrototypeOf

    This will return "undefined" in some cases. It uses __proto__ if
    it's available. Failing that, it uses constructor.prototype, which
    depends on the constructor property of the object's prototype having
    not been replaced. If your object was created like this, it won't
    work:

      function Foo() {
      }
      Foo.prototype = {};
    

    Because the prototype reassignment destroys the constructor
    property.

    This will work for all objects that were created using
    Object.create implemented with this library.

  • :warning: Object.getOwnPropertyNames

    This method uses Object.keys, so it will not be accurate on legacy
    engines.

  • Object.isSealed

    Returns "false" in all legacy engines for all objects, which is
    conveniently guaranteed to be accurate.

  • Object.isFrozen

    Returns "false" in all legacy engines for all objects, which is
    conveniently guaranteed to be accurate.

  • Object.isExtensible

    Works like a charm, by trying very hard to extend the object then
    redacting the extension.

May fail

  • :warning: Object.getOwnPropertyDescriptor

    The behavior of this shim does not conform to ES5. It should
    probably not be used at this time, until its behavior has been
    reviewed and been confirmed to be useful in legacy engines.

  • :warning: Object.defineProperty

    In the worst of circumstances, IE 8 provides a version of this
    method that only works on DOM objects. This sham will not be
    installed. The given version of defineProperty will throw an
    exception if used on non-DOM objects.

    In slightly better circumstances, this method will silently fail to
    set "writable", "enumerable", and "configurable" properties.

    Providing a getter or setter with "get" or "set" on a descriptor
    will silently fail on engines that lack "defineGetter" and
    "defineSetter", which include all versions of IE.

    https://github.com/es-shims/es5-shim/issues#issue/5

  • :warning: Object.defineProperties

    This uses the Object.defineProperty shim.

  • Object.seal

    Silently fails on all legacy engines. This should be
    fine unless you are depending on the safety and security
    provisions of this method, which you cannot possibly
    obtain in legacy engines.

  • Object.freeze

    Silently fails on all legacy engines. This should be
    fine unless you are depending on the safety and security
    provisions of this method, which you cannot possibly
    obtain in legacy engines.

  • Object.preventExtensions

    Silently fails on all legacy engines. This should be
    fine unless you are depending on the safety and security
    provisions of this method, which you cannot possibly
    obtain in legacy engines.

Example of applying ES compatability shims in a browser project

<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-sham.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.2/es6-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.2/es6-sham.min.js"></script>
<script src="https://wzrd.in/standalone/es7-shim@latest"></script>
<script src="other-libs.js"></script>

主要指標

概覽
名稱與所有者es-shims/es5-shim
主編程語言JavaScript
編程語言HTML (語言數: 3)
平台
許可證MIT License
所有者活动
創建於2010-09-16 05:54:16
推送於2022-11-08 06:12:06
最后一次提交2022-11-07 22:12:01
發布數96
最新版本名稱v4.6.7 (發布於 2022-05-03 12:58:57)
第一版名稱v0.0.1 (發布於 )
用户参与
星數7.1k
關注者數214
派生數893
提交數1k
已啟用問題?
問題數241
打開的問題數38
拉請求數128
打開的拉請求數7
關閉的拉請求數103
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?