就算最牛的JavaScript開(kāi)發(fā)者也會(huì)犯錯(cuò)十气。有時(shí)候?qū)е鲁绦虻膱?zhí)行結(jié)果和預(yù)期不一樣砸西,有時(shí)候根本無(wú)法運(yùn)行。這里我總結(jié)了10個(gè)常見(jiàn)的錯(cuò)誤衅疙,我相信不管是初級(jí)還是資深開(kāi)發(fā)者都可能遇到鸳慈。
1.相等混淆
x是否和y相等走芋?x是否為真潘鲫?在JavaScript中溉仑,如何正確地做相等判斷很重要浊竟,但似乎很多人搞不清楚津畸。簡(jiǎn)單概括一下洼畅,主要是下面三種情況:條件判斷(if, &&, etc.),相等操作符(==)徘郭,和嚴(yán)格相等操作符(===)丧肴。
甚至芋浮,有的時(shí)候會(huì)不小心把賦值(=)當(dāng)做相等操作符使用,千萬(wàn)不要搞錯(cuò)了镇草!
避免使用賦值(=)
賦值(=)將右邊的表達(dá)式賦值給左邊的變量梯啤,例如:
var a = 3;
該語(yǔ)句聲明了一個(gè)新的變量a存哲,值為3。
表達(dá)式可以是程序中的任何東西察滑,想象把它類(lèi)比為語(yǔ)言中的名詞贺辰,操作符(+,-,*,/)類(lèi)比為動(dòng)詞魂爪。初學(xué)者一個(gè)常見(jiàn)的錯(cuò)誤就是誤用賦值(=)作為相等判斷符。
if (a=4){...}
代碼并不會(huì)像預(yù)期的執(zhí)行那樣蒋川。
慎用相等操作符
相等操作符(==)和他的雙胞胎不等操作符(!=)非常好用捺球,但也很危險(xiǎn)夕冲,盡量少用歹鱼。接下來(lái)介紹為什么:
0 == '0'
在相等符號(hào)下,0和0是相等的南片!因?yàn)榻忉屍靼l(fā)現(xiàn)左右類(lèi)型不一致疼进,首先做了隱式類(lèi)型轉(zhuǎn)換秧廉。這會(huì)導(dǎo)致各種各樣的問(wèn)題,然后一出錯(cuò)還很難找到問(wèn)題原因嚼锄。
如果你真的想判斷一個(gè)字符串包含的數(shù)字和某個(gè)數(shù)字是否真的相同蔽豺,建議你這么做:
parseInt(0) === parseInt('0')
所以,建議使用嚴(yán)格相等/不等操作符。
0 === '0'
會(huì)返回false濒析。
2.丟失的大括號(hào)
當(dāng)程序變得復(fù)雜啥纸,特別是如果你使用JavaScript對(duì)象來(lái)存儲(chǔ)數(shù)據(jù)的話,大括號(hào)會(huì)越來(lái)越多主经。下面是一段代碼罩驻,但是少了一個(gè)大括號(hào):
{“status”: “OK”,“results”: [{ “id”: 12, “title”: “Coding JavaScript For Dummies”, “author”: “Chris Minnick and Eva Holland”, “publication_date”: ““, “summary_short”: ““, “l(fā)ink”: { “type”: “review”, “url”: ““, “l(fā)ink_text”: “Read the New York Times Reviewof Coding JavaScript For Dummies” }, “awards”: [{ “type”: “Nobel Prize”, “url”: ““, }]}
你能看出來(lái)哪里少了東西嗎惠遏?當(dāng)不確定的時(shí)候节吮,一個(gè)好的編輯器將會(huì)非常有用判耕。Sublime Text有一個(gè)很不錯(cuò)的功能,當(dāng)你把光標(biāo)放在某個(gè)大括號(hào)的時(shí)候帚豪,和它匹配的大括號(hào)會(huì)高亮出來(lái)志鞍。
3.不匹配的引號(hào)
在定義字符串的時(shí)候固棚,你可以自由使用單引號(hào)或則雙引號(hào)此洲。但是呜师,如果一個(gè)字符串單引號(hào)開(kāi)始汁汗,雙引號(hào)結(jié)束就不行了知牌。而且你需要注意本身字符串中的單引號(hào)或則雙引號(hào)斤程。
var movieName = “Popeye’; // error!var welcomeMessage = ‘Thank you, ‘ + firstName + ‘, let’s learn JavaScript!’ // error!
總的來(lái)說(shuō),個(gè)人認(rèn)為是一個(gè)非常靈活且好用的功能沮峡,但是一定要小心亿柑!
缺少必要的圓括號(hào)
該錯(cuò)誤往往在條件語(yǔ)句出錯(cuò)處,特別是有多個(gè)條件的時(shí)候秘症。
if (x > y) && (y < 1000) {...}
如果你注意看乡摹,會(huì)發(fā)現(xiàn)少了括號(hào)采转,正確的應(yīng)該是這樣:
if ((x > y) && (y < 1000)) {...}
4.缺少分號(hào)
JavaScript中的語(yǔ)句都應(yīng)該分號(hào)結(jié)束板熊。但如果這些語(yǔ)句各自占一行干签,那么你不寫(xiě)分號(hào)也沒(méi)關(guān)系容劳。不過(guò)不建議使用闸度,因?yàn)闀?huì)有潛在問(wèn)題竭贩。如果你使用自動(dòng)代碼美化工具可能錯(cuò)誤的將不同行的代碼合并而出錯(cuò)。
最好的策略是都要加分號(hào)莺禁。
5.大寫(xiě)錯(cuò)誤
JavaScript對(duì)大小寫(xiě)敏感留量,你需要對(duì)變量和函數(shù)的命名小心,不能把大小寫(xiě)搞錯(cuò)了哟冬。比如楼熄,Document對(duì)象的getElementById函數(shù)經(jīng)常被寫(xiě)錯(cuò)為getElementByID。
6.在加載前引用
JavaScript的代碼通常是按順序執(zhí)行浩峡,如果你引用了后面才創(chuàng)建的元素將會(huì)報(bào)錯(cuò)孝赫。
document.getElementById(“myDiv”).innerHTML = “This div is my div”;
在腳本執(zhí)行的時(shí)候,瀏覽器還不知道m(xù)yDiv是什么红符。
避免這個(gè)問(wèn)題的方法有很多:
將代碼放到最后,也就是后面
將代碼放到函數(shù)中预侯,并且和body的onload綁定。
function nameMyDiv() {document.getElementById(“myDiv”).innerHTML = “This div is my div”;}
7.濫用保留字做變量名
一個(gè)很難被追蹤的問(wèn)題就是使用保留字做變量名飒货。JavaScript中有超過(guò)60個(gè)保留字。當(dāng)然,你不可能都把它們記住來(lái)避免使用呻惕。最好的方法就是使用更加具有描述性的字符來(lái)命名變量盲泛。
舉個(gè)例子,name是一個(gè)保留字由境。如果你喜歡用name纺阔,那么最好細(xì)化质况,比如firstName,lastName,dogName和nameOfTheWind。
8.作用域問(wèn)題
JavaScript中有函數(shù)作用域和全局作用域。如果你沒(méi)有使用var關(guān)鍵字來(lái)聲明慷嗜,那么它是全局的。為了確保不同作用域的安全隔離,建議使用var。譯者補(bǔ)充:建議使用let奴紧,更加安全,可參考本文:ES6之”let”能替代”var”嗎?。
小編推薦一下我的前端教程學(xué)習(xí)群:657137906,如果你對(duì)前端感興趣或者是想要學(xué)習(xí)前端知識(shí)攀痊,小編歡迎你加入凿叠。小編會(huì)在群中不定期分享干貨炒刁,包括我精心整理的一份前端零基礎(chǔ)教程里伯。歡迎各位初學(xué)和進(jìn)階中的小伙伴。
9.函數(shù)調(diào)用缺少參數(shù)
在JavaScript中,在函數(shù)調(diào)用的時(shí)候少了幾個(gè)參數(shù),有時(shí)候并不會(huì)出錯(cuò)翅溺,但可能達(dá)不到預(yù)期的執(zhí)行結(jié)果叙凡。所以,確保你傳入了足夠的函數(shù)參數(shù)燥撞。
10.從0開(kāi)始
永遠(yuǎn)不要忘記數(shù)組是從0開(kāi)始。
var myArray = new Array();myArray[10] = “List of 10 Common Mistakes”;myArray.length; // 輸出11!