2013-06-20 31 views
2

的填充工具/墊片實現我一直在尋找通過Mozilla開發者網絡(MDN),因爲我需要一些這些爲圖書館的填充工具實現。 我知道shim.js存在,但我沒有使用它。的可靠性如何在MDN

看來,polyfills不在代碼風格一致。它幾乎看起來似乎是由社區以幾乎「維基」風格編寫的。

就拿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,我應該修改這個必要提供非常乾淨,微小的實現中可能嗎?

回答

9

看來,你的問題是指the article on String.contains()

是,MDN是維基因此它的內容的質量(包括代碼的例子)可以變化。但是,一般網站主題的內容(例如與擴展開發相對)通常相當不錯。不過,你不應該忘記使用常識。

的填充工具建議在MDN和您的版本爲三點不同:

  • !('contains' in String.prototype)!String.prototype.contains檢查屬性是否存在:前者顯然是可取的。 in運營商僅查找屬性,沒有副作用。另一方面,!String.prototype.contains將實際檢索該屬性的值並將其轉換爲布爾值。這不僅是稍微慢一些,一些屬性值如0將被錯誤地強制爲false。您可能不會注意到與函數的不同之處,但在填充其他屬性類型時,這可能會成爲一個真正的問題。
  • -1 !== foo的比較與foo !== -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上提供的代碼有幾個故障保險箱。當然,這些在你個人的場景中是否需要。但是,放棄它們以節省幾個字節是優化的錯誤方法(「過早優化是萬惡之源」)。就個人而言,我更喜歡好的風格而不是效率,除非已知性能差異是相關的。

+0

All valid points points!謝謝! – series0ne

+0

只是出於興趣,如果你看一下Object.is的polyfill,那麼if(!Object.is){//實現}就是這樣......那麼爲什麼不能像你指出的那樣呢...... if(!(「is 「in Object)){//實現}? – series0ne

+1

@ series0ne:正如我所說 - 這是一個wiki;)查看歷史,String.contains()'polyfill是由[Nfroidure]編寫的(https://developer.mozilla.org/en-US/profiles/ Nfroidure),'Object.is()',然而[Waldo](https://developer.mozilla.org/en-US/profiles/Waldo)。不同的人。 –