【前言】
這里有很多雜項知識怜庸,必須的嗽测、非必須的余境、冷門的陕悬、有趣的⌒跄總之學而有益身心梆暮,謂之技多不壓身。本文內(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.exports
或exports
來導出模塊。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. 導入方式:
CommonJS:
require()
是同步的正压,導入的模塊會被緩存,多次導入同一個模塊不會重復執(zhí)行责球。ES Modules:
import
是異步的焦履,模塊的導入是動態(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應用性能和保證可維護性的一個重要工具抵碟。