JS進階之路

【前言】

這里有很多雜項知識怜庸,必須的嗽测、非必須的余境、冷門的陕悬、有趣的⌒跄總之學而有益身心梆暮,謂之技多不壓身。本文內(nèi)容來源于網(wǎng)絡搜索和個人經(jīng)驗绍昂,如有謬誤請評論區(qū)留言啦粹,不勝感激。本文章持續(xù)更新窘游。

《嚴格模式》

除了正常運行模式唠椭,ECMAScript 5添加了第二種運行模式:嚴格模式(strict mode)。顧名思義忍饰,這種模式使得 JavaScript 在更嚴格的條件下運行贪嫂。
與之相反的非嚴格模式,被稱為sloppy mode艾蓝,也稱之為 正常模式力崇。因為翻譯原因,正常模式也被翻譯為 —— 馬虎模式/稀松模式/懶散模式赢织。但這并不是一個官方術(shù)語亮靴,但是你會經(jīng)常見到如上的一些說法,其意義就是指代非嚴格模式于置,即正常模式茧吊。
設立嚴格模式的目的,主要有以下幾個:

  • 消除 JavaScript 語法的一些不合理八毯、不嚴謹之處搓侄,減少一些怪異行為;
  • 消除代碼運行的一些不安全之處,保證代碼運行的安全宪彩;
  • 提高編譯器效率休讳,增加運行速度;
  • 為未來新版本的 JavaScript 做好鋪墊尿孔。
    嚴格模式體現(xiàn)了 JavaScript 更合理俊柔、更安全、更嚴謹?shù)陌l(fā)展方向活合,包括 IE10 在內(nèi)的主流瀏覽器都已經(jīng)支持它雏婶,許多大項目已經(jīng)開始全面擁抱它。另一方面白指,同樣的代碼留晚,在嚴格模式中,可能會有不一樣的運行結(jié)果;一些在正常模式下可以運行的語句错维,在嚴格模式下將不能運行奖地。
    你可以在整個腳本文件使用嚴格模式,或者針對某函數(shù)單獨聲明赋焕。

有何變化参歹?

  • 不允許意外創(chuàng)建全局變量
  • 不允許引起靜默失敗的賦值操作
  • 試圖刪除不可刪除的屬性時會拋出異常
  • 不允許刪除變量或?qū)ο?/li>
  • 不允許刪除函數(shù)
  • 不允許函數(shù)參數(shù)重名
  • 不允許對象屬性重名
  • 不允許使用八進制
  • 不允許使用轉(zhuǎn)義字符
  • 禁止this關鍵字指向全局對象
  • 不能給arguments賦值
  • 不能調(diào)用在作用域 eval() 創(chuàng)建的變量

摘自百度搜索
摘自知乎

《ECMAScript簡介及特性》

什么是ECMAScript

ECMAScript 是一種由 ECMA國際(前身為歐洲計算機制造商協(xié)會)通過 ECMA-262 標準化的腳本程序設計語言。
Ecma國際(Ecma International)是一家國際性會員制度的信息和電信標準組織隆判。1994年之前犬庇,名為歐洲計算機制造商協(xié)會(European Computer Manufacturers Association)。因為計算機的國際化侨嘀,組織的標準牽涉到很多其他國家臭挽,因此組織決定改名表明其國際性。現(xiàn)名稱已不屬于首字母縮略字咬腕。
與國家政府標準機構(gòu)不同欢峰,Ecma國際是企業(yè)會員制的組織。組織的標準化過程比較商業(yè)化郎汪,自稱這種營運方式減少官僚追求效果赤赊。
其實 Ecma國際負責了很多標準的制定,比如有如下這些規(guī)范煞赢。大家可以看到這里面有我們今天的主角抛计,ECMAScript 規(guī)范、 C#語言規(guī)范照筑、 C++/CLI語言規(guī)范等吹截。

ECMAScript 和 JavaScript 的關系

1996 年 11 月,JavaScript 的創(chuàng)造者 Netscape 公司凝危,決定將 JavaScript 提交給標準化組織 ECMA波俄,希望這種語言能夠成為國際標準。次年蛾默,ECMA 發(fā)布 262 號標準文件(ECMA-262)的第一版懦铺,規(guī)定了瀏覽器腳本語言的標準,并將這種語言稱為 ECMAScript支鸡,這個版本就是 1.0 版冬念。
該標準從一開始就是針對 JavaScript 語言制定的,但是之所以不叫 JavaScript牧挣,有兩個原因急前。一是商標,Java 是 Sun 公司的商標瀑构,根據(jù)授權(quán)協(xié)議裆针,只有 Netscape 公司可以合法地使用 JavaScript 這個名字,且 JavaScript 本身也已經(jīng)被 Netscape 公司注冊為商標。二是想體現(xiàn)這門語言的制定者是 ECMA世吨,不是 Netscape澡刹,這樣有利于保證這門語言的開放性和中立性。
因此耘婚,ECMAScript 和 JavaScript 的關系是像屋,前者是后者的規(guī)格,后者是前者的一種實現(xiàn)边篮。

ES6 與 ECMAScript 2015 的關系

ECMAScript 2015(簡稱 ES2015)這個詞,也是經(jīng)匙喔Γ可以看到的戈轿。它與 ES6 是什么關系呢?
2011 年阵子,ECMAScript 5.1 版發(fā)布后思杯,就開始制定 6.0 版了。因此挠进,ES6 這個詞的原意色乾,就是指 JavaScript 語言的下一個版本。
但是领突,因為這個版本引入的語法功能太多暖璧,而且制定過程當中,還有很多組織和個人不斷提交新功能君旦。事情很快就變得清楚了澎办,不可能在一個版本里面包括所有將要引入的功能。常規(guī)的做法是先發(fā)布 6.0 版金砍,過一段時間再發(fā) 6.1 版局蚀,然后是 6.2 版、6.3 版等等恕稠。
標準委員會最終決定琅绅,標準在每年的 6 月份正式發(fā)布一次,作為當年的正式版本鹅巍。接下來的時間千扶,就在這個版本的基礎上做改動,直到下一年的 6 月份昆著,草案就自然變成了新一年的版本县貌。這樣一來,就不需要以前的版本號了凑懂,只要用年份標記就可以了煤痕。
因此,ES6 既是一個歷史名詞,也是一個泛指摆碉,含義是 5.1 版以后的 JavaScript 的下一代標準塘匣,涵蓋了 ES2015、ES2016巷帝、ES2017 等等忌卤,而 ES2015 則是正式名稱,特指該年發(fā)布的正式版本的語言標準楞泼。
摘自知乎

《CommonJs規(guī)范》

【規(guī)范定義】
每一個文件是一個模塊驰徊,有自己的作用域
在模塊內(nèi)部的module變量代表模塊本身
module.exports屬性代表模塊對外接口

【require規(guī)則】
/表示絕路徑,./表示相對于當前文件的路徑
支持js堕阔、json棍厂、node擴展名,不寫就依次嘗試
不寫路徑名就認為是build-in模塊或者各級node_modules內(nèi)第三方模塊

【require特性】
module被加載的時候執(zhí)行超陆,加載后緩存牺弹;
一旦出現(xiàn)模塊被循環(huán)加載,就只輸出已經(jīng)執(zhí)行的部分时呀,還沒有執(zhí)行的部分就不會輸出
摘自知乎

《CommonJS 和 ES的區(qū)別》

1. 語法差異

  • CommonJS:使用require()函數(shù)來導入模塊张漂,使用module.exportsexports來導出模塊。

  • ES Modules(ESM):使用import語句來導入模塊谨娜,使用export語句來導出模塊航攒。

2. 運行時加載和靜態(tài)加載

  • CommonJS:模塊的導入和導出是在運行時動態(tài)執(zhí)行的,因此在運行時才能確定模塊的依賴關系趴梢。

  • ES Modules:模塊的導入和導出是在代碼靜態(tài)分析階段處理的屎债,這使得在構(gòu)建時就能確定模塊的依賴關系。

3. 瀏覽器支持

  • CommonJS:最初是為服務器端開發(fā)設計的垢油,不適用于瀏覽器環(huán)境盆驹。但是,可以通過工具(如Browserify滩愁、Webpack等)將CommonJS模塊轉(zhuǎn)換為瀏覽器可用的代碼躯喇。

  • ES Modules:現(xiàn)代瀏覽器和Node.js都支持ES模塊,可以直接在瀏覽器中使用<script type="module">標簽導入和使用ES模塊硝枉。

4. 默認導出

  • CommonJS:可以使用module.exports導出一個值廉丽,這個值是模塊的默認輸出。

  • ES Modules:使用export default語法來指定默認導出妻味。

5. 導入方式

  • CommonJSrequire()是同步的正压,導入的模塊會被緩存,多次導入同一個模塊不會重復執(zhí)行责球。

  • ES Modulesimport是異步的焦履,模塊的導入是動態(tài)的拓劝,每次導入都會重新執(zhí)行模塊內(nèi)的代碼。

6. 導入模塊成員的方式

  • CommonJS:模塊成員被復制一份嘉裤,修改不會影響原始模塊郑临。

  • ES Modules:模塊成員在導入時是引用,修改會影響原始模塊屑宠。

7. 循環(huán)依賴處理

  • CommonJS:支持循環(huán)依賴厢洞,但是模塊的導入和導出是在運行時執(zhí)行的,可能會導致一些問題典奉。

  • ES Modules:通過靜態(tài)分析處理循環(huán)依賴躺翻,可以更好地處理這種情況。

綜上所述卫玖,CommonJS主要是在服務器端使用获枝,而ES Modules是現(xiàn)代瀏覽器和Node.js中推薦的模塊系統(tǒng),具有更好的靜態(tài)分析和性能優(yōu)勢骇笔。隨著瀏覽器和Node.js的發(fā)展,ES Modules逐漸取代了CommonJS的地位嚣崭。
摘自知乎

《.mjs文件和普通.js文件的區(qū)別》

  • 默認異步加載:ECMAScript 模塊默認支持異步加載笨触,這有助于提高代碼的執(zhí)行性能。而 CommonJS 模塊默認是同步加載的雹舀。
  • 文件擴展名:雖然這并不是一個技術(shù)上的差異芦劣,但通常約定將 ECMAScript 模塊保存為 .mjs 文件,而將 CommonJS 模塊保存為 .js 文件说榆。這有助于區(qū)分兩種不同類型的模塊虚吟。

【.mjs文件特點】

  • 強制使用嚴格模式:由于在es6以后的版本中必須引用頭部的'use strict'語句來啟動嚴格模式,而.mjs文件默認為嚴格模式签财。這意味著變量聲明必須先進行串慰,不能使用未定義的變量,并且禁止使用eval和arguments唱蒸。
  • es模塊語法:.mjs文件支持es模塊的導入和導出語法(import和export)邦鲫。這種語法相比commonjs規(guī)范中的require()和module.exports更加優(yōu)雅、先進和簡單神汹。
  • 支持動態(tài)導入:.mjs文件支持異步加載實現(xiàn)動態(tài)導入庆捺,可以在運行時按需獲取模塊,而不需要預先配置所有依賴項屁魏。
  • 不允許以下語法:.mjs 文件也不支持commonjs語法(require())和amd語法(define())滔以,因此如果要在一個.mjs文件中使用npm包或其他commonjs模塊,則需要通過一個額外的腳本轉(zhuǎn)換氓拼。

.mjs文件更像是一個現(xiàn)代化的es6程序你画,它已經(jīng)成為了加快javascript web應用性能和保證可維護性的一個重要工具抵碟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撬即,隨后出現(xiàn)的幾起案子立磁,更是在濱河造成了極大的恐慌,老刑警劉巖剥槐,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唱歧,死亡現(xiàn)場離奇詭異,居然都是意外死亡粒竖,警方通過查閱死者的電腦和手機颅崩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕊苗,“玉大人沿后,你說我怎么就攤上這事⌒嗯椋” “怎么了尖滚?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞧柔。 經(jīng)常有香客問我漆弄,道長,這世上最難降的妖魔是什么造锅? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任撼唾,我火速辦了婚禮,結(jié)果婚禮上哥蔚,老公的妹妹穿的比我還像新娘倒谷。我一直安慰自己,他們只是感情好糙箍,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布渤愁。 她就那樣靜靜地躺著,像睡著了一般深夯。 火紅的嫁衣襯著肌膚如雪猴伶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天塌西,我揣著相機與錄音他挎,去河邊找鬼。 笑死捡需,一個胖子當著我的面吹牛办桨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播站辉,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呢撞,長吁一口氣:“原來是場噩夢啊……” “哼损姜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起殊霞,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤摧阅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绷蹲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棒卷,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年祝钢,在試婚紗的時候發(fā)現(xiàn)自己被綠了比规。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拦英,死狀恐怖蜒什,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疤估,我是刑警寧澤灾常,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站铃拇,受9級特大地震影響钞瀑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锚贱,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望关串。 院中可真熱鬧拧廊,春花似錦、人聲如沸晋修。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墓卦。三九已至倦春,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間落剪,已是汗流浹背睁本。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忠怖,地道東北人呢堰。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像凡泣,于是被迫代替她去往敵國和親枉疼。 傳聞我的和親對象是個殘疾皇子皮假,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容