我一直在浏览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 !== foo
与foo !== -1
的比较:这是一个品味问题,但有些人更喜欢前者的变体。在比较中总是把常量放在第一位的好处是,您不会无意中将比较转换为赋值:当您的意思是-1 == foo
时写-1 = foo
会导致错误。另一方面,foo = -1
而不是foo == -1
会成功,注意到代码中的问题可能需要一段时间。显然,如果你选择适应这种风格,你需要在你所有的代码中始终使用它。 -
String.prototype.indexOf.call
与this.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
的填充将失败。