MDN上的polyfill/shim实现有多可靠?



我一直在浏览Mozilla Developer Network (MDN)上的polyfill实现,因为我需要其中一些用于库。我知道shimm .js存在,但我没有使用它

似乎多边形在代码样式上不一致。看起来它们几乎是由社区以一种近乎"wiki"的风格编写的。

String.prototype.contains 为例
if(!('contains' in String.prototype)) {
    String.prototype.contains = function(str, startIndex) {
        return -1 !== String.prototype.indexOf.call(this, str, startIndex);
    }
}

对我来说,像这样实现它似乎更合乎逻辑:

if(!String.prototype.contains) {
    String.prototype.contains = function(str, startIndex) {
        return this.indexOf(str, startIndex) !== -1;
    }
}

考虑到JavaScript是一种大小关键语言(在网络传输中,所有东西都应该尽可能小),我的示例应该有利于MDN上的示例,因为这节省了几个字节。

正如标题所暗示的,我想知道MDN上的代码有多可靠,我是否应该根据需要修改这一点,以便在可能的情况下提供真正干净,微小的实现?

你的问题似乎是关于String.contains()的文章。

是的,MDN是一个wiki,所以它的内容(包括代码示例)的质量可能会有所不同。然而,关于一般web主题的内容(例如与扩展开发相反)通常是相当不错的。然而,你不应该忘记使用常识。

MDN上建议的polyfill和你的版本有三点不同:

  • !('contains' in String.prototype) vs. !String.prototype.contains检查属性是否存在:前者显然更可取。in操作符只是查找一个属性,没有副作用。另一方面,!String.prototype.contains将实际检索该属性的值并将其转换为布尔值。这不仅稍微慢了一些,一些属性值,如0,将被错误地强制到false。你可能不会注意到函数的区别,但这可能成为一个真正的问题,当填充其他属性类型。
  • -1 !== foofoo !== -1的比较:这是一个品味问题,但有些人更喜欢前者的变体。在比较中总是把常量放在第一位的好处是,您不会无意中将比较转换为赋值:当您的意思是-1 == foo时写-1 = foo会导致错误。另一方面,foo = -1而不是foo == -1会成功,注意到代码中的问题可能需要一段时间。显然,如果你选择适应这种风格,你需要在你所有的代码中始终使用它。
  • String.prototype.indexOf.callthis.indexOf:前者防止this对象上的indexOf方法被覆盖。因此,它更接近于本地String.contains()函数的行为。考虑这个例子:
var a = "foo";
a.indexOf = function() {something_weird};
alert(a.contains("f"));

String.contains的本机实现和使用String.prototype.indexOf.call的填充将工作,即使this.indexOf被覆盖-使用this.indexOf的填充将失败。

总的来说,MDN上提供的代码有更多的故障保护。当然,在您的个人场景中是否需要这些并没有给出。然而,放弃它们以节省几个字节是错误的优化方法("过早优化是万恶之源")。就我个人而言,我更喜欢良好的风格而不是效率,除非性能上的差异是已知相关的。

最新更新