中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS的分號可以省掉嗎?

發布時間:2020-07-15 14:37:11 來源:網絡 閱讀:335 作者:Fundebug 欄目:web開發

摘要: JavaScript語言從設計之初就是考慮帶分號的,使用不帶分號的編碼規則就要小心點啦。

背景

最近在項目中開始使用新的編碼規范,一開始ESLint報一大堆錯誤,改得我想砸鍵盤,花了好些時間才適應,下面列出一些代表性的規則:

  • 只能使用單引號
  • 函數定義的圓括號和左大括號之間一定要有空格: function(args) { .. }
  • import語句在大括號之后一定要有空格: import { fa, fb } from moduleC
  • 不用分號!!!

起因

早上在實現一個功能的時候,寫了一個map函數來復用部分代碼。程序運行起來后,沒有執行結果,而且沒有報錯。通過console.log打印數據發現,整個程序執行到map前面就再也不往下走了,很奇怪。因為沒有報錯信息,無法推測具體原因。于是,我將其抽象成非常簡單的代碼來排查。如下所示:

console.log("hello, fundebug")
[1, 2, 3].map(i=>console.log(i))

然后執行看看結果如何:

JS的分號可以省掉嗎?

在項目中沒有報錯,單獨將這段代碼拿出來在瀏覽器控制臺下執行卻報錯了!
這么簡單的代碼為什么會出錯呢?第一反應就是JS引擎將代碼生成語法樹的時候,可能解析不正確。于是,我在第一行末尾加分號測試。

console.log("hello, fundebug");
[1, 2, 3].map(i=>console.log(i))

程序正確執行了:
JS的分號可以省掉嗎?

這讓我更加犯難,如果不加分號會導致程序出錯,那么為什么還會推崇這樣的編碼規范呢?
在網絡上搜索JavaScript關于分號的BUG,發現有非常多關于要不要使用分號的討論。

大宗師Douglas Crockford表示要正確使用分號

引用minhan在扯不完的 JS 分號問題文中的論述:

JSON、JSLint、JSMin和ADSafe 的創造者、ECMA JavaScript 2.0 標準化委員會委員、被JavaScript之父Brendan Eich稱為JavaScript的大宗師、名著《JavaScript: The Good Parts》(中文版《JavaScript語言精粹》)的作者Douglas Crockford直接懟之: 這代碼真尼瑪的瘋狂傻X,我是不會為了這傻X的案例而去降低JSMin的級數; TC39正在考慮將『!』號作為中綴運算符使用,這個代碼不久將來就運行不了。趕緊修復吧,學學怎么正確地使用分號。『!』號并不語句的分隔號,『;』才是。

JSMin處理如下代碼后無法正確執行:

clearMenus()
!isActive && $parent.toggleClass('open')

自動分號插入機制

JavaScript有著自動分號插入的機制(Automatic Semicolon Insertion),簡稱ASI。這是一個輔助性的功能,然后有一些情況要注意:

如果你這樣寫代碼:

return 
a + b

那么自動分號插入后會這樣:

return;
a + b;

更可能導致隱含BUG的狀況是:

a = b + c
(d + e).print()

他不會自動插入分號,因為第二行一括號開始,會被誤認為是函數。

a = b + c(d + e).print();

所以,我剛剛的的代碼在自動插入分號后,應該是這樣:

console.log("hello fundebug")[1,2,3].map(i=>console.log(i))

那么這樣看來,用分號才是最安全的做法咯!

如果你不想用分號,又怕出問題,v2ex上有位童鞋給出了一個速記方案:

如果你寫 JS 代碼不喜歡帶分號,而又搞不清什么時候必須加分號,可以這么做:在以 "("、"[" 、"/"、"+"、"-" 開頭的語句前面都加上一個分號。

我最終的解法是先聲明一個變量來指向這個數組,這樣就可以避免以[開頭,又不使用分號:

let indexArray = [1, 2, 3]
indexArray.map(i=>console.log(i))

關于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了7億+錯誤事件,得到了Google、360、金山軟件、百姓網等眾多知名用戶的認可。歡迎免費試用!

JS的分號可以省掉嗎?

版權聲明

轉載時請注明作者 Fundebug以及本文地址:
https://blog.fundebug.com/ 2018/09/18/js-semicolon-bug/

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿拉善左旗| 汉中市| 漳浦县| 株洲市| 曲阜市| 珲春市| 石河子市| 钦州市| 辽宁省| 班玛县| 翁牛特旗| 芦山县| 元江| 大港区| 靖江市| 增城市| 华坪县| 谢通门县| 长治市| 南雄市| 浦北县| 汝城县| 开封县| 淳安县| 长汀县| 忻州市| 娱乐| 册亨县| 来凤县| 西丰县| 伊吾县| 来宾市| 黄浦区| 天水市| 许昌县| 卢龙县| 德保县| 和顺县| 内江市| 博乐市| 延寿县|