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