摘要:然而不幸的是還做了一件惡心的事情它會把所有自定義的下方法實現(xiàn)復制到下是提供的自定義。有人在的官方倉庫發(fā)了個戲謔說建議把改名為,引發(fā)大討論,甚至有人信以為真導致事件越發(fā)擴大。于是官博專門發(fā)文辟謠。
本文屬于亂侃,其中語言可能包含語句不通甚至顛三倒四前后不搭的部分。如引起各位看官的不適請見諒
于是 Array.prototype.flatten 終于變成 Array.prototype.flat 了:https://github.com/tc39/propo...。方法名變成了一個名詞或形容詞。
我相信這不是標準制定者所情愿的(雖然有人 強行 解釋了一下)。萬惡之源就是這個叫做 Mootools 的庫。我沒有用過,但是聽說在多年以前的國外被廣泛使用。我不想細談其內(nèi)部細節(jié),有興趣的可以看谷歌的這篇博文:https://developers.google.com...
其實類似事情之前就發(fā)生過一次。問題出在同一個庫身上,相同的解決方案:Array.prototype.contains 最終變成了 Array.prototype.includes
所謂兼容性就是抗歷史包袱。如果一個新版本瀏覽器發(fā)布導致用戶經(jīng)常瀏覽的網(wǎng)站掛掉,他們不會認為這是網(wǎng)站的不對——他們根本不知道類似 Mootools 這種奇葩的存在。他們只知道:我原來用得好好的,怎么升級之后就壞了?從而加固“跟新有風險,升級需謹慎”的印象,甚至形成“升級恐懼癥”。
其他語言或多或少都有一些歷史包袱,異常沉重的有如 C++,但是這類編譯型語言一旦被編譯為目標代碼,兼容性包袱便轉(zhuǎn)拋給了操作系統(tǒng)。而前端代碼不一樣,他們被瀏覽器下載到了客戶端解釋(或預編譯)執(zhí)行,語言級別的包袱會一直持續(xù)下去。語言設計者們已經(jīng)做過了嘗試,比如這個神奇的 "use strict",但是它永遠不可能默認開啟。
所以 Mootools 那幫人在私自擴展原生對象的原型屬性時,有沒有想到著可能是一件會阻礙人類文明的發(fā)展進程的嚴重問題呢?
還是補充說明這次 smoothgate 事件的緣由。
Firefox 基于 Array.prototype.flatten 提議(舊版本,現(xiàn)在已經(jīng)改為 flat)發(fā)布了支持該 API 的新版瀏覽器,導致了至少一個著名站點出現(xiàn)了異常。
Firefox 提供的 Array.prototype.flatten 實現(xiàn)并沒有 bug,問題在于網(wǎng)站使用的一個叫 Mootools 的庫。它提供了自己 非標準的 Array.prototype.flatten 版本實現(xiàn)。
Array.prototype.flatten = /* 非標準實現(xiàn) */;
Mootools 提供的實現(xiàn)跟標準不同,然而這不是問題所在。Mootools 會強制覆蓋瀏覽器原生的 Array.prototype.flatten 實現(xiàn),依賴 Mootools 的 Array.prototype.flatten 實現(xiàn)的網(wǎng)站并不會因為原生版本和 Mootools 版本不一致而產(chǎn)生問題。
然而不幸的是 Mootools 還做了一件惡心的事情:它會把所有自定義的 Array.prototype 下方法實現(xiàn)復制到 Elements.prototype 下(Elements 是 Mootools 提供的自定義 API)。
for (var key in Array.prototype) { Elements.prototype[key] = Array.prototype[key]; }
for-in 循環(huán)只會遍歷 可枚舉的(enumerable)的屬性,例如 Array.prototype.sort、Array.prototype.push 這些原生的方法都是默認不可枚舉的(enumerable: false),新的 Array.prototype.flatten 同樣如此。Mootools 用自己的實現(xiàn)覆蓋了原生的 Array.prototype.flatten,但是并沒有改變方法的 enumerable 屬性——Array.prototype.flatten 仍然是不可枚舉的,導致 Array.prototype.flatten 不會被復制到 Elements.prototype 下。
于是:所有依賴 Elements.prototype.flatten 的代碼全部掛掉了。有人在 TC39 的官方 github 倉庫發(fā)了個 PR 戲謔說建議把 flatten 改名為 smooth,引發(fā)大討論,甚至有人信以為真導致事件越發(fā)擴大。于是 Google Update 官博專門發(fā)文辟謠。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/95312.html
摘要:第四章總結(jié)最后的章節(jié)其實是一些自學路上的建議與避免小白走錯路的坑。結(jié)語感謝作者的分享,也看出作者在行業(yè)的豐富經(jīng)驗,同時此書確實很適合小白閱讀,閱讀輕松而且沒有太多專業(yè)性詞匯,讓很多人都能對有一個大致的概念。 博客 貓叔的博客 前言 年前部門一次性購買了一批書,我知道這次我應該會被指派閱讀一些偏向于管理類的書籍,但是沒想到美女領(lǐng)導直接給了我這本書《快速轉(zhuǎn)行做產(chǎn)品經(jīng)理》,其實一開始我有點...
摘要:關(guān)鍵字是用拋異常來實現(xiàn)的,這樣就能提前脫離代碼塊了。通常的異常有三類。于是我們要知道拋異常為什么慢咋解決的和都是很快很快的,畢竟只是幾個地址操作,慢的是這一步,這里要讓取得當前的一大串填充進去,開銷約為個的程度。 另載于 http://www.qingjingjie.com/blogs/11 熟悉Scala的人知道返回值是代碼塊的最后一句,一般不能提前返回。return關(guān)鍵字是用拋異常...
摘要:還有一點比較重要的是,如何在快速迭代的軟件開發(fā)周期內(nèi),去解放生產(chǎn)力。于是就會大量涌現(xiàn)很多優(yōu)秀的開源框架和擴展庫,去解決現(xiàn)實生活中的實際問題。而這一切都是在朝著提高開發(fā)效率,降低維護成本而前進。結(jié)合書中的觀點去總結(jié)和思考。 關(guān)于 Vue.js showImg(https://segmentfault.com/img/bVbk73v?w=252&h=253); 簡單小巧的核心(代碼壓縮后大...
摘要:還有一點比較重要的是,如何在快速迭代的軟件開發(fā)周期內(nèi),去解放生產(chǎn)力。于是就會大量涌現(xiàn)很多優(yōu)秀的開源框架和擴展庫,去解決現(xiàn)實生活中的實際問題。而這一切都是在朝著提高開發(fā)效率,降低維護成本而前進。結(jié)合書中的觀點去總結(jié)和思考。 關(guān)于 Vue.js showImg(https://segmentfault.com/img/bVbk73v?w=252&h=253); 簡單小巧的核心(代碼壓縮后大...
閱讀 1532·2021-11-17 09:33
閱讀 3118·2021-10-13 09:39
閱讀 2791·2021-10-09 10:01
閱讀 2532·2021-09-29 09:35
閱讀 4050·2021-09-26 10:01
閱讀 3593·2019-08-26 18:37
閱讀 3243·2019-08-26 13:46
閱讀 1972·2019-08-26 13:39