本文屬於亂侃,个中言語能夠包括語句不通以至語無倫次前後不搭的部份。如激發列位看官的不適請包涵
因而 Array.prototype.flatten
終究變成 Array.prototype.flat
了:https://github.com/tc39/propo…。要領名變成了一個名詞或形容詞。
我置信這不是規範制定者所寧願的(雖然有人 強行 詮釋了一下)。萬惡之源就是這個叫做 Mootools 的庫。我沒有用過,然則聽說在多年之前的外洋被普遍運用。我不想細談其內部細節,有興緻的能夠看谷歌的這篇博文:https://developers.google.com…
實在相似事變之前就發生過一次。題目出在同一個庫身上,雷同的解決方案:Array.prototype.contains
終究變成了 Array.prototype.includes
所謂兼容性就是抗汗青包袱。假如一個新版本閱讀器宣布致使用戶常常閱讀的網站掛掉,他們不會以為這是網站的不對——他們基礎不知道相似 Mootools
這類奇葩的存在。他們只知道:我本來用得好好的,怎樣晉級以後就壞了?從而加固“跟新有風險,晉級需謹慎”的印象,以至構成“晉級恐懼症”。
其他言語或多或少都有一些汗青包袱,非常極重的有如 C++,然則這類編譯型言語一旦被編譯為目的代碼,兼容性包袱便轉拋給了操作系統。而前端代碼不一樣,他們被閱讀器下載到了客戶端詮釋(或預編譯)實行,言語級別的包袱會一向延續下去。言語設計者們已做過了嘗試,比方這個奇異的 'use strict'
,然則它永久不能夠默許開啟。
所以 Mootools
那幫人在擅自擴展原生對象的原型屬性時,有無想到着多是一件會障礙人類文明的生長曆程的嚴重題目呢?
照樣補充申明此次 smoothgate 事宜的啟事。
Firefox 基於 Array.prototype.flatten 發起(舊版本,如今已改成 flat)宣布了支撐該 API 的新版閱讀器,致使了最少一個有名站點湧現了非常。
Firefox 供應的 Array.prototype.flatten
完成並沒有 bug,題目在於網站運用的一個叫 Mootools 的庫。它供應了本身 非規範的 Array.prototype.flatten
版本完成。
Array.prototype.flatten = /* 非規範完成 */;
Mootools
供應的完成跟規範差別,但是這不是題目所在。Mootools
會強迫掩蓋閱讀器原生的 Array.prototype.flatten
完成,依靠 Mootools
的 Array.prototype.flatten
完成的網站並不會由於原生版本和 Mootools
版本不一致而發生題目。
但是不幸的是 Mootools
還做了一件噁心的事變:它會把一切自定義的 Array.prototype
下要領完成複製到 Elements.prototype
下(Elements
是 Mootools
供應的自定義 API)。
for (var key in Array.prototype) {
Elements.prototype[key] = Array.prototype[key];
}
for-in
輪迴只會遍歷 可羅列的(enumerable)的屬性,比方 Array.prototype.sort
、Array.prototype.push
這些原生的要領都是默許不可羅列的(enumerable: false
),新的 Array.prototype.flatten
一樣云云。Mootools
用本身的完成掩蓋了原生的 Array.prototype.flatten
,然則並沒有改變要領的 enumerable
屬性——Array.prototype.flatten
仍然是不可羅列的,致使 Array.prototype.flatten
不會被複制到 Elements.prototype
下。
因而:一切依靠 Elements.prototype.flatten
的代碼悉數掛掉了。有人在 TC39 的官方 github 堆棧發了個 PR 戲謔說發起把 flatten
改名為 smooth
,激發大議論,以至有人信以為真致使事宜更加擴展。因而 Google Update 官博特地發文闢謠。