日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何避免JavaScript開發(fā)者常犯的9個(gè)錯(cuò)誤?

JavaScript 是一種給網(wǎng)頁添加功能和交互的腳本語言,對于使用不同編程語言的初學(xué)者來說很容易理解。有了一些教程,你就可以馬上開始使用它了。

10余年的遷西網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整遷西建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“遷西網(wǎng)站設(shè)計(jì)”,“遷西網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

但很多初學(xué)者都會(huì)犯一些常見的錯(cuò)誤。在這篇文章中,我們將介紹 9 個(gè)常見的錯(cuò)誤(或者說不好的實(shí)踐)以及它們的解決方案,幫助你成為更好的 JavaScript 開發(fā)者。

將賦值操作符(=)和相等操作符(==,===)混為一談

正如名稱所示,賦值操作符是用來給變量賦值的。開發(fā)者常常把它與相等操作符混淆。

舉個(gè)例子:

 
 
 
  1. const name = "javascript";
  2. if ((name = "nodejs")) {
  3. console.log(name);
  4. }
  5. // output - nodejs

本例中,不是比較 name 變量和 nodejs 字符串,而是為 name 賦值 nodejs ,并將 nodejs 輸出到控制臺。

在 JavaScript 中,兩個(gè)等號(==)和三個(gè)等號(===)是比較操作符。

對于上述代碼,可以使用以下方法比較值:

 
 
 
  1. const name = "javascript";
  2. if (name == "nodejs") {
  3. console.log(name);
  4. }
  5. // no output
  6. // OR
  7. if (name === "nodejs") {
  8. console.log(name);
  9. }
  10. // no output

這兩個(gè)比較操作符的區(qū)別是:兩個(gè)等號執(zhí)行寬松的比較,三個(gè)等號執(zhí)行嚴(yán)格的比較。

大致比較時(shí),只比較值。但嚴(yán)格地說,值和數(shù)據(jù)類型都是要比較的。

下面的代碼更好地解釋了這一點(diǎn):

 
 
 
  1. const number = "1";
  2. console.log(number == 1);
  3. // true
  4. console.log(number === 1);
  5. // false

給變量 number 賦值 1 。如果將 number 用雙等號與 1 進(jìn)行比較,會(huì)返回 true,因?yàn)閮蓚€(gè)值都是 1。

然而,在用三個(gè)等號的情況下,因?yàn)槊總€(gè)值的數(shù)據(jù)類型不同,所以返回 false。

預(yù)期的回調(diào)是同步的

在 JavaScript 里,用回調(diào)方法處理異步操作。然而,Promises 和 async/await 是處理異步操作的選擇方法,因?yàn)槎啻位卣{(diào)會(huì)導(dǎo)致回調(diào)地獄。

回調(diào)是不同步的。在延遲執(zhí)行完成操作之后,它們作為一個(gè)函數(shù)被調(diào)用。

例如,全局 setTimeout 接收回調(diào)函數(shù)作為第一個(gè)參數(shù),接收持續(xù)時(shí)間(毫秒)作為第二個(gè)參數(shù):

 
 
 
  1. function callback() {
  2. console.log("I am the first");
  3. }
  4. setTimeout(callback, 300);
  5. console.log("I am the last");
  6. // output
  7. // I am the last
  8. // I am the first

在 300ms 之后,調(diào)用回調(diào)函數(shù)。但是代碼的其余部分在完成前運(yùn)行,因此,最后一個(gè) console.log 將首先運(yùn)行。

開發(fā)者經(jīng)常犯的一個(gè)錯(cuò)誤就是誤解了回調(diào)是同步的,比如,認(rèn)為回調(diào)函數(shù)一個(gè)值用于其他操作。

錯(cuò)誤在于:

 
 
 
  1. function addTwoNumbers() {
  2. let firstNumber = 5;
  3. let secondNumber;
  4. setTimeout(function () {
  5. secondNumber = 10;
  6. }, 200);
  7. console.log(firstNumber + secondNumber);
  8. }
  9. addTwoNumbers();
  10. // NaN

由于 secondNumber 不確定,所以輸出 NaN 。運(yùn)行 firstNumber+secondNumber 的時(shí)候,仍然沒有定義 secondNumber ,因?yàn)?setTimeout 函數(shù)會(huì)在 200ms 之后執(zhí)行回調(diào)。

最好的方法是在回調(diào)函數(shù)中執(zhí)行剩余的代碼:

 
 
 
  1. function addTwoNumbers() {
  2. let firstNumber = 5;
  3. let secondNumber;
  4. setTimeout(function () {
  5. secondNumber = 10;
  6. console.log(firstNumber + secondNumber);
  7. }, 200);
  8. }
  9. addTwoNumbers();
  10. // 15

this 指代錯(cuò)誤

在 JavaScript 中,this 是一個(gè)常被誤解的概念。在 JavaScript 使用 this,你需要理解它的作用是什么,這里的 this 跟其他語言中的 this 用法不同。

以下是關(guān)于 this 的常見錯(cuò)誤的示例:

 
 
 
  1. const obj = {
  2. name: "JavaScript",
  3. printName: function () {
  4. console.log(this.name);
  5. },
  6. printNameIn2Secs: function () {
  7. setTimeout(function () {
  8. console.log(this.name);
  9. }, 2000);
  10. },
  11. };
  12. obj.printName();
  13. // JavaScript
  14. obj.printNameIn2Secs();
  15. // undefined

第一個(gè)結(jié)果是 JavaScript ,因?yàn)?this.name 正確地指向?qū)ο蟮?name 屬性。第二個(gè)結(jié)果是 undefined ,因?yàn)?this 未指代對象的屬性(包括 name)。

原因在于 this 依賴于正在調(diào)用該函數(shù)的對象。每個(gè)函數(shù)都有一個(gè) this 變量,但是它的指向由調(diào)用 this 的對象決定。

bj.printName() 的 this 直接指向 obj 。 obj.printNameIn2Secs 的 this 直接指向 obj 。然而,但是 this 在回調(diào)函數(shù) setTimeout 中沒有指向任何對象,因?yàn)闆]有任何對象調(diào)用它。

如果一個(gè)對象調(diào)用 setTimeout ,則執(zhí)行 obj.setTimeout... 。因?yàn)闆]有對象調(diào)用這個(gè)函數(shù),所以使用默認(rèn)對象(即 window )。

window 上沒有 name ,故返回 undefined 。

在 setTimeout 中保留 this 指代的最好方法是使用 bind 、 call 、 apply 或箭頭功能(在 ES6 中引入)。不同于常規(guī)函數(shù),箭頭函數(shù)不創(chuàng)建自己的 this 。

所以,下面的代碼會(huì)保留 this 指代:

 
 
 
  1. const obj = {
  2. name: "JavaScript",
  3. printName: function () {
  4. console.log(this.name);
  5. },
  6. printNameIn2Secs: function () {
  7. setTimeout(() => {
  8. console.log(this.name);
  9. }, 2000);
  10. },
  11. };
  12. obj.printName();
  13. // JavaScript
  14. obj.printNameIn2Secs();
  15. // JavaScript

忽視對象的可變性

JavaScript 對象中的引用數(shù)據(jù)類型不像字符串、數(shù)字等原始數(shù)據(jù)類型。比如,在鍵值對對象中:

 
 
 
  1. const obj1 = {
  2. name: "JavaScript",
  3. };
  4. const obj2 = obj1;
  5. obj2.name = "programming";
  6. console.log(obj1.name);
  7. // programming

obj1 和 obj2 在內(nèi)存中指向相同的地址。

在數(shù)組中:

 
 
 
  1. const arr1 = [2, 3, 4];
  2. const arr2 = arr1;
  3. arr2[0] = "javascript";
  4. console.log(arr1);
  5. // ['javascript', 3, 4]

開發(fā)者經(jīng)常犯的一個(gè)錯(cuò)誤是忽略了 JavaScript 的這個(gè)特性,而這將導(dǎo)致意外的錯(cuò)誤。

如果出現(xiàn)這種情況,訪問原始屬性的任何嘗試都會(huì)返回 undefined 或者引發(fā)錯(cuò)誤。

最好的方法是,當(dāng)你想復(fù)制一個(gè)對象的時(shí)候,總是創(chuàng)建一個(gè)新的引用。為了達(dá)到這個(gè)目的,擴(kuò)展運(yùn)算符(在 ES6 中引入的 ... )就是一個(gè)完美的解決方案。

比如,在鍵值對對象中:

 
 
 
  1. const obj1 = {
  2. name: "JavaScript",
  3. };
  4. const obj2 = { ...obj1 };
  5. console.log(obj2);
  6. // {name: 'JavaScript' }
  7. obj2.name = "programming";
  8. console.log(obj.name);
  9. // 'JavaScript'

在數(shù)組中:

 
 
 
  1. const arr1 = [2, 3, 4];
  2. const arr2 = [...arr1];
  3. console.log(arr2);
  4. // [2,3,4]
  5. arr2[0] = "javascript";
  6. console.log(arr1);
  7. // [2, 3, 4]

保存數(shù)組和對象至瀏覽器儲存

使用 JavaScript 的時(shí)候,開發(fā)者可能希望利用 localStorage 來保存值。然而,一個(gè)常見的錯(cuò)誤是直接將數(shù)組和對象保存在 localStorage 中。 localStorage 只接收字符串。

JavaScript 將對象轉(zhuǎn)換成字符串以保來保存,其結(jié)果是對象保存為 [Object Object] ,數(shù)組保存為逗號分隔開的字符串。

比如:

 
 
 
  1. const obj = { name: "JavaScript" };
  2. window.localStorage.setItem("test-object", obj);
  3. console.log(window.localStorage.getItem("test-object"));
  4. // [Object Object]
  5. const arr = ["JavaScript", "programming", 45];
  6. window.localStorage.setItem("test-array", arr);
  7. console.log(window.localStorage.getItem("test-array"));
  8. // JavaScript, programming, 45

在保存這些對象時(shí),很難訪問它們。例如,對于一個(gè)對象,通過 .name 訪問它會(huì)導(dǎo)致錯(cuò)誤。因?yàn)?[Object Object] 現(xiàn)在是一個(gè)字符串,而不包含 name 屬性。

通過使用 JSON.stringify (將對象轉(zhuǎn)換為字符串)和 JSON.parse (將字符串轉(zhuǎn)換為對象),可以更好地保存本地存儲對象和數(shù)組。通過這種方式可以輕松訪問對象。

上述代碼的正確版本為:

 
 
 
  1. const obj = { name: "JavaScript" };
  2. window.localStorage.setItem("test-object", JSON.stringify(obj));
  3. const objInStorage = window.localStorage.getItem("test-object");
  4. console.log(JSON.parse(objInStorage));
  5. // {name: 'JavaScript'}
  6. const arr = ["JavaScript", "programming", 45];
  7. window.localStorage.setItem("test-array", JSON.stringify(arr));
  8. const arrInStorage = window.localStorage.getItem("test-array");
  9. console.log(JSON.parse(arrInStorage));
  10. // JavaScript, programming, 45

不使用默認(rèn)值

為動(dòng)態(tài)變量設(shè)置默認(rèn)值是一個(gè)很好的預(yù)防意外錯(cuò)誤的方法。這里有一個(gè)常見錯(cuò)誤的例子:

 
 
 
  1. function addTwoNumbers(a, b) {
  2. console.log(a + b);
  3. }
  4. addTwoNumbers();
  5. // NaN

由于 a 為 undefined , b 也為 undefined ,因此結(jié)果為 NaN 。你可以使用默認(rèn)值防止類似錯(cuò)誤,比如:

 
 
 
  1. function addTwoNumbers(a, b) {
  2. if (!a) a = 0;
  3. if (!b) b = 0;
  4. console.log(a + b);
  5. }
  6. addTwoNumbers();
  7. // 0

此外,可以在 ES6 中這樣使用默認(rèn)值:

 
 
 
  1. function addTwoNumbers(a = 0, b = 0) {
  2. console.log(a + b);
  3. }
  4. addTwoNumbers();
  5. // 0

此示例雖小,但強(qiáng)調(diào)了默認(rèn)值的重要性。

另外,如果沒有提供期望,開發(fā)者可以提供一個(gè)錯(cuò)誤或者警告信息。

變量命名錯(cuò)誤

是的,開發(fā)者還是會(huì)犯這個(gè)錯(cuò)誤。命名是困難的,但開發(fā)人員沒有其他選擇。注解和命名變量一樣,都是編程的好習(xí)慣。

比如:

 
 
 
  1. function total(discount, p) {
  2. return p * discount
  3. }

變量 discount 沒問題,但是 p 或者 total 呢?是什么的 total ?最好是:

 
 
 
  1. function totalPrice(discount, price) {
  2. return discount * price
  3. }

對變量進(jìn)行適當(dāng)?shù)拿浅V匾?,因?yàn)樵谔囟ǖ臅r(shí)間和將來,可能有別的開發(fā)者使用這個(gè)代碼庫。

適當(dāng)?shù)孛兞繒?huì)讓貢獻(xiàn)者很容易理解項(xiàng)目是如何運(yùn)行的。

檢查布爾值

 
 
 
  1. const isRaining = false
  2. if(isRaining) {
  3. console.log('It is raining')
  4. } else {
  5. console.log('It is not raining')
  6. }
  7. // It is not raining

上面的示例中是一種常見的檢查 Boolean 值的方法,但是在測試某些值時(shí)還是出現(xiàn)了錯(cuò)誤。

在 JavaScript 中,比較 0 和 false 會(huì)返回 true ,比較 1 和 true 會(huì)返回 true 。這就是說,如果 isRaining 是 1,那么它就是 true 。

這常在對象中出現(xiàn)錯(cuò)誤,比如:

 
 
 
  1. const obj = {
  2. name: 'JavaScript',
  3. number: 0
  4. }
  5. if(obj.number) {
  6. console.log('number property exists')
  7. } else {
  8. console.log('number property does not exist')
  9. }
  10. // number property does not exist

盡管存在 number 屬性,但 obj.number 返回 0 ,這是一個(gè)假值,因此執(zhí)行了 else 代碼。

所以,除非你確定了要使用的值的范圍,否則你應(yīng)該測試布爾值和對象中的屬性:

 
 
 
  1. if(a === false)...
  2. if(object.hasOwnProperty(property))...

使人迷惑的添加和連接

在 JavaScript 中,加號( + )有兩種功能:相加和連接。相加是針對數(shù)字,而連接是針對字符串。有些開發(fā)者經(jīng)常誤用這個(gè)操作符。

比如:

 
 
 
  1. const num1 = 30;
  2. const num2 = "20";
  3. const num3 = 30;
  4. const word1 = "Java"
  5. const word2 = "Script"
  6. console.log(num1 + num2);
  7. // 3020
  8. console.log(num1 + num3);
  9. // 60
  10. console.log(word1 + word2);
  11. // JavaScript

將字符串和數(shù)字相加時(shí),JavaScript 會(huì)把數(shù)字轉(zhuǎn)換成字符串。而數(shù)字相加時(shí),則進(jìn)行數(shù)學(xué)運(yùn)算。

總結(jié)

除了上面羅列出的,肯定還有更多錯(cuò)誤(小錯(cuò)誤或大錯(cuò)誤)。所以,你需要知道最新的語言發(fā)展動(dòng)態(tài)。

學(xué)習(xí)和避免這些錯(cuò)誤將有助于你構(gòu)建更好、更可靠的 Web 應(yīng)用程序和工具。


新聞名稱:如何避免JavaScript開發(fā)者常犯的9個(gè)錯(cuò)誤?
當(dāng)前鏈接:http://www.5511xx.com/article/codsdic.html