10分鐘 JavaScript 簡史

JavaScript

JavaScript 在如今的軟件開發(fā)中已經(jīng)占據(jù)了重要的一席之地【1】,快速的發(fā)展和眾多的衍生社區(qū)(Node、TypeScript、WebAssembly等等)將 JavaScript 推向了新的高度,也產(chǎn)生了新的復(fù)雜度。通過回顧 JavaScript 的演進(jìn)歷史,抓住其發(fā)展脈絡(luò),更好的把握 JavaScript 趨勢(shì)。

1995年

當(dāng)時(shí)的瀏覽器霸主網(wǎng)景公司認(rèn)識(shí)到,死板的瀏覽器內(nèi)容已經(jīng)無法滿足用戶。為了增加瀏覽器的動(dòng)態(tài)能力,公司決定在自己的瀏覽器 Netscape Navigator 中增加腳本語言的能力。網(wǎng)景公司同時(shí)采用兩種思路來完成這一目標(biāo),首先是與 Sun 公司合作,把 Java 語言嵌入到瀏覽器中;同時(shí)還雇用了 Brendan Eich 將 Scheme 語言嵌入到瀏覽器當(dāng)中。但是很快網(wǎng)景公司的管理層認(rèn)為最佳選項(xiàng)是發(fā)明一種新的編程語言。為了應(yīng)對(duì)競(jìng)爭(zhēng),管理層要求 Brendan Eich 快速實(shí)現(xiàn)一個(gè)原型先添加到瀏覽器中(又一個(gè)草率卻意義重大的決定)【2】。于是,JavaScript的故事開始了。

5月

Brendan Eich 在不同的意見和壓力下,僅用了10天時(shí)間就交付了這一創(chuàng)造新腳本語言,將其名為 Mocha 并提交給公司。對(duì)于創(chuàng)造一種編程語言來說,10天時(shí)間實(shí)在太短,以至于存在諸多設(shè)計(jì)缺陷。但這一腳本語言時(shí)至今日歷經(jīng)20余年反而愈加繁榮,我想這其實(shí)已經(jīng)證明了JavaScript語言的優(yōu)點(diǎn)要比缺點(diǎn)要突出得多。JavaScript并非憑空設(shè)計(jì),其諸多特性繼承自Scheme,而 Scheme 與 Lisp 的一種方言(Lisp語言的衍生版本),不難看出 JavaScript 頑強(qiáng)的生命力其實(shí)得益于那源自 Lisp 的堅(jiān)實(shí)的設(shè)計(jì)思想。

9月

處于市場(chǎng)營銷的原因,腳本語言 Mocha 被更名為 LiveScript,以此表示這是一項(xiàng)新發(fā)明(Live)的腳本語言(Script),并嵌入到新版 Netscape 瀏覽器一起發(fā)布。

Netscape瀏覽器

12月

網(wǎng)景與 Sun 達(dá)成合作協(xié)議,LiveScript(或 Mocha)被更名為 JavaScript,定位是瀏覽器中小任務(wù)的腳本語言,同時(shí)大型復(fù)雜的富客戶端應(yīng)用通過 Java(Sun公司發(fā)明的編程語言)來編寫(是的,富客戶端概念在1995年就已經(jīng)形成了)。網(wǎng)景想要借助 Java 語言的名氣,以 Java 的小兄弟姿態(tài)出現(xiàn)在市場(chǎng)當(dāng)中。網(wǎng)景與Sun的同盟目的是構(gòu)筑一個(gè)以瀏覽器為基礎(chǔ),向?qū)I(yè)開發(fā)者提供Java的能力,同時(shí)向非專業(yè)開發(fā)者(non-developer)提供 JavaScript 的便捷(沒錯(cuò),一開始JavaScript 在大家眼中是“外行”用的工具),網(wǎng)景相信二者的協(xié)同效應(yīng)會(huì)帶來更大的增長(這背后的主要?jiǎng)恿€是來自于商業(yè)因素,然后協(xié)同效應(yīng)是否真的產(chǎn)生了1+1>2的效果依然有不同意見)。畢竟微軟就是這么做的,在Windows的平臺(tái)上,C/C++提供了專業(yè)的應(yīng)用開發(fā)能力,同時(shí) Visual Basic為非專業(yè)開發(fā)者提供了便捷的能力。順便一提,同樣是出于商業(yè)因素,JavaScript在設(shè)計(jì)時(shí),被要求語法盡量與 Java 相似。

最終,網(wǎng)景高調(diào)的發(fā)布了新版本 Netscape ,內(nèi)置了這個(gè)看起來像Java,其實(shí)無關(guān)的腳本語言,一個(gè)新誕生的傳奇:JavaScript【3】。

互聯(lián)網(wǎng)從誕生之初,就是競(jìng)爭(zhēng)最激烈的戰(zhàn)場(chǎng)。網(wǎng)景公司的成功引來了另一家科技巨頭的覬覦,微軟出手了。1995年微軟發(fā)布了Windows 95系統(tǒng),并自帶 IE 瀏覽器,這直接導(dǎo)致了瀏覽器大戰(zhàn)的開始【4】。

1996年

微軟曾放低姿態(tài)向網(wǎng)景尋求合作,如果網(wǎng)景不推出新的 Netscape Navigator 瀏覽器,那么微軟可以在操作系統(tǒng)的市場(chǎng)上做出一些“讓步”。彼時(shí)的網(wǎng)景正是市場(chǎng)的寵兒,對(duì)微軟的提議不屑一顧。面對(duì)心高氣傲的網(wǎng)景,微軟退無可退,瀏覽器的戰(zhàn)爭(zhēng)悄然開始,微軟迅速投入重金進(jìn)行并購和研發(fā)短短時(shí)間變推出了自己的 Internet Explorer 瀏覽器(簡稱IE)。在網(wǎng)景推出 JavaScript(當(dāng)時(shí)名為LiveScript)之后,微軟反編譯了 Netscape Navigator 瀏覽器,并以此創(chuàng)造了自己的瀏覽器腳本語言:JScript。為了避免與 Sun 產(chǎn)生 Java 商標(biāo)問題,微軟將自己的腳本與命名為 JScript,雖然源自Netscape,但 JScript 和 JavaScript 之間的差異可遠(yuǎn)比名字要答多了。導(dǎo)致 JavaScript 與 JScript 之間不兼容的主要原因除了瀏覽器腳本語言沒有統(tǒng)一標(biāo)準(zhǔn)外,還因?yàn)槲④浐途W(wǎng)景為了吸引開發(fā)者,各自在瀏覽器中添加自己認(rèn)為優(yōu)秀的特性。開發(fā)者被迫在自行兼容和拋棄一方之間做出選擇,其結(jié)果是要么成本增加,要么損失用戶。

8月

微軟發(fā)布了支持 JScript 的 Internet Explorer 3.0 ,這也是微軟在瀏覽器市場(chǎng)上真正崛起的開始。

11月

網(wǎng)景公司將未來押在了互聯(lián)網(wǎng),提出以 Java 和 JavaScript 為基石,在互聯(lián)網(wǎng)(Internet)和內(nèi)部網(wǎng)(Intranet)中依托 Netscape 瀏覽器打造一個(gè)統(tǒng)一的開發(fā)和用戶平臺(tái)【5】(如同技術(shù)需要遵循技術(shù)規(guī)律,市場(chǎng)同樣要遵循市場(chǎng)規(guī)律,當(dāng)時(shí)并沒有完成這一計(jì)劃的成熟條件,即便是多年以后Chrome瀏覽器也未能實(shí)現(xiàn)這一愿景,技術(shù)可以成為改變世界的力量,但駕馭這股力量的一定是商業(yè))。IE 瀏覽器的增長帶來的分裂,已經(jīng)威脅到了網(wǎng)景的產(chǎn)品規(guī)劃,作為瀏覽器核心功能的 JavaScript,它的行業(yè)標(biāo)準(zhǔn)成了迫在眉睫的問題。

在IE瀏覽器的巨大壓力下,網(wǎng)景決定將 JavaScript 提交給 ECMA(前身為歐洲計(jì)算機(jī)制造商協(xié)會(huì),后成為ISO標(biāo)準(zhǔn)化組織重要組成部分,專注信息和通信系統(tǒng)標(biāo)準(zhǔn)的建立)進(jìn)行標(biāo)準(zhǔn)化。為推動(dòng)這一進(jìn)程,網(wǎng)景將公開 JavaScript 的實(shí)現(xiàn)標(biāo)準(zhǔn),網(wǎng)景、微軟、IBM、蘋果、Sun 等行業(yè)巨頭均派出代表參與標(biāo)準(zhǔn)制定過程(也許是由于Lisp的前車之鑒,大家都不遠(yuǎn)看到 JavaScript 分裂的情景)。ECMA 為 JavaScript 分配第262號(hào)標(biāo)準(zhǔn),即:ECMA-262。標(biāo)準(zhǔn)的制定工作由 ECMA 的第39號(hào)技術(shù)委員會(huì)負(fù)責(zé),即 Technical Committee 39,簡稱 TC-39。在腳本語言的名稱上,由于行業(yè)巨頭之間存在巨大的商業(yè)分歧,最終選擇了一個(gè)妥協(xié)的名字:ECMAScript。至此,瀏覽器腳本語言標(biāo)準(zhǔn)化的準(zhǔn)備工作終于塵埃落定,

1997年

6月

由互聯(lián)網(wǎng)企業(yè)代表提交建議,TC-39 審核并制定相關(guān)規(guī)范,ECMA以262號(hào)新版本方式發(fā)布的瀏覽器腳本語言 ECMAScript 正式亮相,從此任企業(yè)都可以參考該標(biāo)準(zhǔn)并發(fā)布自己的語言實(shí)現(xiàn)【6】。

ECMAScript 作為標(biāo)準(zhǔn)語言規(guī)范,開發(fā)者和瀏覽器廠商均將其作為重要參考標(biāo)準(zhǔn),很大程度上防止了瀏覽器的分裂,但各家都有自己的 ECMAScript 引擎,尤其是 JavaScript、HTML、CSS 這三者的聯(lián)系,導(dǎo)致不同的瀏覽器仍然存在差異。

互聯(lián)網(wǎng)的日新月異也讓 ECMAScript 需要不斷更新迭代,在瀏覽器快速更新的時(shí)代中,ECMA-262也就不斷更新版本,瀏覽器發(fā)展遲滯的時(shí)候,ECMA-262 也相應(yīng)的沉寂很久。

1998年 6月

ECMAScript 2 發(fā)布,簡稱 ES2。

網(wǎng)景公司開源了 Netscape Navigator 瀏覽器源碼,并創(chuàng)建了 Mozilla 組織。

1999年12月

ECMAScript 3 發(fā)布,簡稱 ES3。

網(wǎng)景公司被AOL收購。

2000年

ECMAScript 4(簡稱:ES4) 的標(biāo)準(zhǔn)提上了工作日程。但此時(shí)在瀏覽器市場(chǎng)上,微軟也已經(jīng)一家獨(dú)大,IE的統(tǒng)治地位已不可撼動(dòng)。壟斷地位的形成讓微軟變得傲慢,既然 IE 的 JScript 已經(jīng)成了瀏覽器的事實(shí)上的標(biāo)準(zhǔn),那為什么還要與 ECMA 合作呢?微軟終于停止了與 ECMA 的合作,參與者們對(duì) ES4 標(biāo)準(zhǔn)的興趣也越來小。

瀏覽器市占率

2003年

TC-39的工作開始陷入停滯狀態(tài)。ECMAScript 標(biāo)準(zhǔn)化工作也鮮被提及。

鑒于新版本的 ECMAScript 不能完整發(fā)布,TC-39 只發(fā)布了一份臨時(shí)性的改進(jìn)報(bào)告?;谶@份報(bào)告,Adobe 推出了 ActionScript,微軟則推出了 JScript.NET。

2004年

Netscape 重組成為 Mozilla 并發(fā)布了 Firefox 瀏覽器。

2005年

真正的突破,來自于Jesse Garrett 發(fā)表的一篇名為 《Ajax: a new approach to Web Application》 的文章,介紹了 JavaScript 中一種革命性的技術(shù)方案:Ajax【7】。

Ajax 的出現(xiàn)重新點(diǎn)燃了大家對(duì) ECMAScript 的興趣。TC-39 恢復(fù)工作,時(shí)隔幾年,一大堆JavaScript的新特性被提交上來。

此時(shí) Adobe 公司基于早期的 ES4 草案實(shí)現(xiàn)了自己語言 ActionScript 3,并在 TC-39 會(huì)議上積極推動(dòng) ES4 。Yahoo 作為新晉的 TC-39 成員,沒有趕上 ECMAScript 4 的起草過程,但在審核階段卻起到了決定性作用, Yahoo 派出的參會(huì)代表是 Douglas Crockford,他既是一名非常有影響力的意見領(lǐng)袖,同時(shí)又堅(jiān)決反對(duì) ES4 草案。原因是 ES4 對(duì)于瀏覽器腳本語言來說太大、太復(fù)雜了,他擔(dān)心 ES4 的復(fù)雜最終會(huì)讓這門腳本語言失去控制。當(dāng) Douglas Crockford 提出反對(duì)意見后,TC-39 成員的關(guān)系變得微妙,以 Adobe 為首的改革派希望通過 ECMAScript 4 發(fā)掘新的市場(chǎng)機(jī)會(huì),而以微軟為首的保守派則希望保持現(xiàn)狀,畢竟微軟已經(jīng)處于市場(chǎng)統(tǒng)治地位,對(duì)于變革毫無興趣。所以當(dāng) Douglas Crockford 旗幟鮮明的反對(duì) ECMAScript 4 后,微軟也倒戈向了 Douglas Crockford ,會(huì)議陷入僵局。

在堅(jiān)決抵制了 ES4 推到重來的方式后,Crockford 提出以細(xì)節(jié)優(yōu)化的方法來改善 ECMAScript ,并開始推動(dòng) ES3.1 的草案,其它 TC-39 成員當(dāng)然不愿放棄 ES4,于是貌合神離的 TC-39 成員們?cè)谝粋€(gè)辦公室里同時(shí)著手 2 套標(biāo)準(zhǔn)的制定:ES3.1 和ES4 (彼時(shí)的 ES4 草案已經(jīng)完成,但仍需時(shí)間完善)。

2008年

隨著 Eich(JavaScript之父)發(fā)出的一封郵件,TC-39 最新的會(huì)議決策摘要被傳遞到所有參與者手中,關(guān)鍵決策包括:

  • 放棄ES4,全部成員通力合作,加快 ES 3.1 進(jìn)度,爭(zhēng)取第二年年初實(shí)現(xiàn)兩個(gè)可以互操作的實(shí)現(xiàn)
  • ES3.1 之后的下一步,是共同合作推出新的語法規(guī)范,但在語義和語法上的變化程度上都要比 ES4 更溫和。
  • ES4 中不適合Web程序開發(fā)的提議,將被移除掉,比如:package/namespace/binding。達(dá)成一致的關(guān)鍵詞是:Harmony(和諧)。
  • ES4 中其它提議會(huì)被重新措辭并與ES3、ES3.1 盡量兼容,以爭(zhēng)取 TC-39 的支持。

ES4 歷經(jīng)8年,最終一地雞毛。所有支持 ES4 的人都上了生動(dòng)的一課。此次會(huì)議中出現(xiàn)的關(guān)鍵詞:Harmony(和諧)也成為了ECMAScript 發(fā)展的重要思想。以后各種新提議在未被審核通過前,會(huì)先加入到“Harmony”版本提供給關(guān)聯(lián)者使用。

評(píng)論:
如果你熟悉 ECMAScript 的 4 和 6 兩個(gè)版本,就會(huì)發(fā)現(xiàn) 6 很大程度上是有 4 演變而來,或者說,ES 6 就是當(dāng)年沒能發(fā)布出來的 ES 4。現(xiàn)在來看,ES 6 無疑是巨大的成功,但是回到 2005 年,Douglas Crockford 的擔(dān)憂不無道理,當(dāng)時(shí)的軟件條件還不成熟,不具備在瀏覽器端實(shí)施一種高復(fù)雜度語言的條件,別忘了 JavaScript 是為了什么目的創(chuàng)建的:瀏覽器中的小型應(yīng)用。即使現(xiàn)在,有了像 Node.js、Babel.js、各種網(wǎng)絡(luò)庫的時(shí)代,項(xiàng)目的復(fù)雜度依然是個(gè)難以控制的問題,以至于使用 TypeScript 代替 JavaScript 成為了一種流行方式,我們現(xiàn)在已經(jīng)能夠完全掌控 ECMAScript 了嗎?

ECMAScript 4 失敗的另一個(gè)原因,依然是商業(yè)問題。Adobe 力推 ECMAScript 4 背后的動(dòng)機(jī),是為了擴(kuò)大 ActionScript 3 的市場(chǎng)份額,彼時(shí)的 Adobe 已經(jīng)通過 Flash 切入到了瀏覽器的市場(chǎng),而 Flash 則是用 ActionScript 語言開發(fā)。微軟會(huì)對(duì)此坐視不理嗎?想想微軟與網(wǎng)景之間的較量,微軟在1996年就投入10億美元來對(duì)抗網(wǎng)景,后來不惜對(duì) Internet Explorer 瀏覽器使用“免費(fèi)”這個(gè)終極殺器,將網(wǎng)景徹底擠出市場(chǎng)。說到底,在商業(yè)利益微軟不會(huì)如此好心幫助競(jìng)爭(zhēng)對(duì)手成長。沒有微軟老大哥的點(diǎn)頭,ES4 根本就沒有機(jī)會(huì)得到市場(chǎng)的認(rèn)可。

2008年

ES4 草案被放棄,TC-39 成員專注于 ES 3.1 工作。

谷歌發(fā)布了 Chrome 瀏覽器。

2009年

ES3.1 完成,并得到 TC-39 全體成員的認(rèn)可,但是在發(fā)布時(shí),遇到名稱問題。ES4 雖然從未正式發(fā)布,但已經(jīng)作為 ECMAScript 的一份草案存在多年,此時(shí)發(fā)布的新版本 ES3.1 編號(hào)卻比舊的 ES4 低。為了避免名字的混亂,委員會(huì)決定將 ES3.1 命名為 ES5 并正式發(fā)布。

ES5 是最為成功的一個(gè) ECMAScript 版本,并且得到了主流瀏覽器的完整支持(實(shí)現(xiàn)全部特性)

  • Firefox 4 (2011)
  • Chrome 19 (2012)
  • Safari 6 (2012)
  • Opera 12.10 (2012)
  • Internet Explorer 10 (2012)

2011年

ECMAScript 5.1 發(fā)布,本次標(biāo)準(zhǔn)更新并沒有增加任何新特性,而是對(duì) ES5 中有爭(zhēng)議的地方進(jìn)行了明確的解釋和定義。因?yàn)闆]有新特性發(fā)布,所以此版本仍簡稱 ES5。

2013年

TC-39 原本計(jì)劃這一年發(fā)布新版本 ECMAScript,代號(hào)為 ECMAScript Harmony 代碼。但是顯然這一版本的野心太大,很難實(shí)現(xiàn),所以 TC-39 決定把它拆成2個(gè)部分

  • 將優(yōu)先級(jí)高的特性加入新版本
  • 其它特性,以后再想辦法加入標(biāo)準(zhǔn)當(dāng)中

為了避免重蹈 ES4 覆轍,ECMAScript 的新版本被命名為: ECMAScript.next。

TC-39 的本意是先發(fā)布一個(gè)中間版本,然后逐步把 Harmony 版本中的特性添加到 ECMAScript.next 中,完成后再使用正式的新名稱。隨著新版本的成熟,ECMAScript.next 這個(gè)名字也被拋棄,轉(zhuǎn)而直接使用 ECMAScript 6 來稱呼這一版本,簡稱 ES6。

2014年

考慮到要將 Harmony 版本中剩余的特性添加到標(biāo)準(zhǔn)當(dāng)中,TC-39 決定將 ECMAScript 6 改名為 ECMAScript 2015,簡稱 ES2015。這是為了給 ECMAScript 快速的版本更新埋下伏筆,以后 TC-39 可以通過年份來區(qū)分不同版本的內(nèi)容。

在改名為 ECMAScript 2015 之前,ES6 的大部分標(biāo)準(zhǔn)已經(jīng)穩(wěn)定下來,而這個(gè)名字也為大眾熟知,并且 ES6 很好的沿襲了 ECMAScript 系列標(biāo)準(zhǔn)的名字,所以習(xí)慣上仍用 ES6 來稱呼這以版本的 ECMAScript。

2015年

ECMAScript2015 正式發(fā)布,簡稱ES2015,俗稱 ES6。

此后,TC-39 兌現(xiàn)了之前的承諾,開始將 Harmony 版本中的特性一點(diǎn)點(diǎn)加入到標(biāo)準(zhǔn)當(dāng)中。因此,TC-39 每年都會(huì)發(fā)布新版本的 ECMAScript,但每次的改動(dòng)都很小。

2016年

ECMAScript 2016 發(fā)布,簡稱 ES2016。

鑒于 ECMAScript 新版本的快速發(fā)布模式,TC-39 進(jìn)行了一次標(biāo)準(zhǔn)采納方案的修訂。每個(gè)向 TC-39 提交的提議(proposal)都必須經(jīng)過4個(gè)階段【8】才能加入到正式標(biāo)準(zhǔn)當(dāng)中。

  • stage-0: 想法
  • stage-1: 提議
  • stage-2: 慘案
  • stage-3: 候選
  • stage-4: 完成

當(dāng)一個(gè)提議達(dá)到 stage-4 的時(shí)候,很大概率會(huì)在下一個(gè) ECMAScript 版本當(dāng)中作為標(biāo)準(zhǔn)發(fā)布出去,當(dāng)然最終決定權(quán)在 TC-39。這樣做的好處是 ECMAScript 的進(jìn)度是清晰可見的,而且正式標(biāo)準(zhǔn)是可以預(yù)期的。當(dāng) stage-4 積累了足夠的提議后, TC-39 可以直接將 stage-4 中的提議打包發(fā)布成下一版本標(biāo)準(zhǔn),然后清空 stage-4 等待新提議的進(jìn)階。

2017年

ECMAScript 2017 發(fā)布,簡稱 ES2017

2018年

ECMAScript 2018 發(fā)布,簡稱 ES2018

2019年

ECMAScript 2019 發(fā)布,簡稱 ES2019

2020年

ECMAScript 2020 發(fā)布,簡稱 ES2020

尾聲

ECMAScript 是一種標(biāo)準(zhǔn),它有不同的版本:

  • ES5
  • ES2015(ES6)
    ...
  • ES2020
    ...

各家廠商參考標(biāo)準(zhǔn)實(shí)現(xiàn)自己的語言引擎:

  • 谷歌,Chrome瀏覽其的 v8
  • Mozilla,F(xiàn)irefox瀏覽器的 SpiderMonkey
  • 蘋果,Safari瀏覽器的 JavaScriptCore
  • 微軟,IE瀏覽器的 Chakra
  • 微軟,Edge瀏覽器 v8-fork
  • Node v8-fork

通過語言引擎支持對(duì)應(yīng)的編程語言,比如:

  • JavaScript
  • ActionScript
  • JScript

JavaScript 是其中最成功的語言,以至于 JavaScript 幾乎和 ECMAScript 畫上了等號(hào)。如今的 JavaScript 已經(jīng)無處不在,無論它下一步的發(fā)展是什么,希望 JavaScript 社區(qū)不要忘記 TC-39 的核心精神:Harmony。很多優(yōu)秀的社區(qū)和語言因?yàn)榉至?、因?yàn)椴荒苋谌肷鐓^(qū)導(dǎo)致沒落,Lisp、Haskell等等前車之鑒,值得喜愛 JavaScript 的人引以為戒(Rust 似乎也開始出問題)。謙虛、包容是成就一門語言和社區(qū)最大的特征。

參考:
【1】https://www.tiobe.com/tiobe-index/javascript/
【2】http://speakingjs.com/es5/ch04.html
【3】https://web.archive.org/web/20080213171613/http://wp.netscape.com/newsref/pr/newsrelease67.html
【4】https://en.wikipedia.org/wiki/Browser_wars#First_Browser_War:_1995-2001
【5】https://web.archive.org/web/19981203070212/http://cgi.netscape.com/newsref/pr/newsrelease289.html
【6】https://www.ecma-international.org/publications/standards/Ecma-262.htm
【7】https://web.archive.org/web/20190226075734/https://adaptivepath.org/ideas/ajax-new-approach-web-applications/
【8】https://tc39.es/process-document/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容