ECMAScript第五版(2009年12月发布)引入了一些新的方法(详见本表 )。 但是,那里还有一些旧的浏览器没有实现这些新的方法。 幸运的是,存在一个方便的脚本(用JavaScript编写) – ES5-shim – 它在不存在的环境中手动实现这些方法。 但是,我不知道如何提供ES5的垫片…我应该只是“给”它的所有浏览器,如下所示: <script src="es5-shim.js"></scipt> 还是应该包含一个支票,以便仅仅“打扰”那些真正需要它的浏览器,如下所示: <script> if ( !Function.prototype.hasOwnProperty( 'bind' ) ) { (function () { var shim = document.createElement( 'script' ); shim.src = 'es5-shim.js'; var script = document.getElementsByTagName( 'script' )[0]; script.parentNode.insertBefore( shim, script ); }()); } </script> (我正在使用Function.prototype.bind来检查浏览器是否实现了所有新的ECMAScript 5方法,根据上面链接的兼容性表,当实现ECMAScript 5方法时, bind是“最后的堡垒”。 当然,为了使这个垫片有效,它必须在所有其他脚本之前执行,这意味着我们希望在页面的早期(在HEAD中,在所有其他SCRIPT元素之前)包含上述SCRIPT元素。 那么,这个第二个例子是一个向浏览器提供ECMAScript 5-shim的好方法吗? 有没有更好的方法来做到这一点?
我写这篇文章的时候, ECMAScript 5已经在最后的草稿中了。 这是由于包含一个严格的模式,这将阻止您分配给全局对象,使用eval和其他限制。 ( John Resig的文章是一个很好的介绍。) 通过在文件(或函数)的顶部包含string“use strict”,可以触发这种神奇的理智保存模式。但是,在较老的环境中,“use strict”是无效的。 如果在严格的环境中添加“严格使用”,而不是在严格的环境下进行testing,那么您可能会留下一个不真正严格的代码的时间炸弹,这个代码在真正达到严格的环境时会被破坏。 哪个环境真的尊重“严格使用”?
垫片和假的有什么区别? 包括es5-shim.min.js和es6-shim.min.js是否足够,还是应该包含es5-sham.min.js和es6-sham.min.js?
所以Safari和Chrome已经开始在他们的beta版中实现一些ES5的东西。 例如Object.create就在其中。 你们有没有人知道是否有网站显示在浏览器中取得的进展? ATM我需要使用Object.freeze,并希望看看哪些浏览器(如果有)支持。
我正在从依靠jQuery过渡到在AngularJS中构build应用程序。 在许多地方build议不要混用jQuery和Angular代码。 我想念的一件事是数组的jQuery $ .map函数。 我知道这可以重新编写使用本地JavaScript 映射函数 ,但是这并不是在所有的浏览器(特别是,IE <V9)中实现。 那么,是否有一个angular的等价物,或者我应该回到写作for (var x = 0; x < foo; x += 1) {…}所以我可以停止包括jQuery? 更新有时候知道要search什么是你所需要的。 贝吉说,“寻找polyfills”。 这里有一个参考指南(来自Modernizr工作人员)的一些资源,用于在旧版浏览器上编写现代代码: HTML5跨浏览器Polyfills
JavaScript不关心你的string是双引号"double"还是单引号'single' 。 ECMAScript 5严格模式的每个例子都通过双引号中的"use strict"来启用。 我可以做以下(单引号): alert(function(){ 'use strict'; return !this; }()); 如果启用了严格模式,则这将返回true;如果不是,则返回false 。
ECMAScript允许我们定义getter或setter如下: [文本/ JavaScript的] var object = { property: 7, get getable() { return this.property + 1; }, set setable(x) { this.property = x / 2; } }; 如果我正在使用一个类,我可以解决这个问题: [文本/ CoffeeScript的] "use strict" Function::trigger = (prop, getter, setter) -> Object.defineProperty @::, get: getter set: setter class Class property: '' @trigger 'getable', -> 'x' member: 0 但是,如果我想直接在对象上定义触发器, […]
ECMAScript5中严格模式编译指示的范围是什么? "use strict"; 我想这样做(主要是因为JSLint没有抱怨): "use strict"; (function () { // my stuff here… }()); 但我不确定是否会破坏其他代码。 我知道,我可以做到这一点,这将编译范围的function… (function () { "use strict"; // my stuff here… }()); 但JSLint抱怨(当“strict”JSLint选项被启用时),因为它认为你在启用“use strict”之前执行的代码。 这是我的问题。 如果我有fileA.js: "use strict"; // do some stuff 和fileB.js: eval( somecodesnippet ); // disallowed by "use strict" 然后按照相同的顺序将它们包含在我的html页面中,这个编译指示是否会被限制到文件中,或者这个编译指示是否会stream入到fileB中,从而阻止了eval的执行?
为什么对象默认不能迭代? 我总是看到与迭代对象有关的问题,常见的解决scheme是迭代对象的属性,并以这种方式访问对象内的值。 这似乎很常见,这使我想知道为什么对象本身不可迭代。 像ES6 for…of这样的语句默认使用对象。 因为这些特性只适用于不包含{}对象的特殊“可迭代对象”,所以我们必须经过这些循环才能使这个对象成为我们想要使用的对象。 for …语句创build一个循环遍历可迭代对象 (包括Array,Map,Set,arguments object等)… 例如使用ES6 生成器function : var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}}; function* entries(obj) { for (let key of Object.keys(obj)) { yield [key, obj[key]]; } } for (let [key, value] of entries(example)) { console.log(key); console.log(value); for (let [key, […]
所以,我正在看什么new Object和Object的定义ES5规范。 出乎我的意料: new Object描述了对象构造函数如何工作的整个algorithm – 处理不同types的值会发生什么。 基本上在非对象上调用ToObject – 在对象上标识,并build立在null和undefined。 Object有一个特殊的第一步为空和未定义的地方,它build立一个对象,然后调用对象基元上的ToObject和身份。 几次阅读说明后 – 看起来完全相同。 不过,从规格上来看,他们做了一些不同的事情 。 例如在Array – 调用new Array被指定为函数调用Array(…)等价于具有相同参数的对象创buildexpression式new Array(…) 。 所以 – new Object和Object什么区别? 为什么他们有不同的指定? 为了方便 – 这是一个链接到规范 。