首頁 web前端 js教程 45個JavaScript程式設計注意事項、技巧大全_javascript技巧

45個JavaScript程式設計注意事項、技巧大全_javascript技巧

May 16, 2016 pm 04:14 PM
javascript 技巧 注意事項 程式設計

JavaScript是一個絕冠全球的程式語言,可用於Web開發、行動應用開發(PhoneGap、Appcelerator)、伺服器端開發(Node.js和Wakanda)等等。 JavaScript還是很多新手踏入程式設計世界的第一種語言。既可以用來顯示瀏覽器中的簡單提示框,也可以透過nodebot或nodruino來控制機器人。能夠編寫結構清晰、效能高效的JavaScript程式碼的開發人員,現在已經成了招募市場最受追捧的人。

在這篇文章裡,我將分享一些JavaScript的技巧、秘訣和最佳實踐,除了少數幾個外,不管是瀏覽器的JavaScript引擎,還是伺服器端JavaScript解釋器,均適用。

本文中的範例程式碼,通過了在Google Chrome 30最新版(V8 3.20.17.15)上的測試。

1、第一次賦值變數時務必使用var關鍵字

變數沒有宣告直接賦值得話,預設會作為一個新的全域變量,要盡量避免使用全域變數。

2、使用===取代==

==和!=操作符會在需要的情況下自動轉換資料型別。但===和!==不會,它們會同時比較值和資料類型,這也使得它們要比==和!=快。

複製程式碼 程式碼如下:

[10] === 10    // is false
[10]  == 10    // is true
'10' == 10     // is true
'10' === 10    // is false
[]   == 0     // is true
[] ===  0     // is false
'' == false   // is true but true == "a" is false
'' === false  // is false

3、underfined、null、0、false、NaN、空字串的邏輯結果皆為false
4.行尾使用分號

實務上最好還是使用分號,忘了寫也沒事,大部分情況下JavaScript解釋器都會自動加入。對於為何要使用分號,可參考文章JavaScript中關於分號的真相。

5、使用物件建構器

複製程式碼 程式碼如下:

  function Person(firstName, lastName){
    this.firstName =  firstName;
    this.lastName = lastName;
}
var Saad = new Person("Saad", "Mousliki");

6、小心使用typeof、instanceof和contructor
typeof:JavaScript一元運算符,用於以字串的形式傳回變數的原始類型,注意,typeof null也會傳回object,大多數的物件類型(陣列Array、時間Date等)也會傳回object
contructor:內部原型屬性,可以透過程式碼重寫
instanceof:JavaScript操作符,會在原型鏈中的構造器中搜索,找到則回傳true,否則回傳false
複製程式碼 程式碼如下:

var arr = ["a", "b", "c"];
typeof arr;   // 回傳 "object"
arr instanceof Array // true
arr.constructor();  //[]

7、使用自呼叫函數
函數在建立之後直接自動執行,通常稱之為自呼叫匿名函數(Self-Invoked Anonymous Function)或直接呼叫函數表達式(Immediately Invoked Function Expression )。格式如下:
複製程式碼 程式碼如下:

(function(){
    // 置於此處的程式碼將自動執行
})(); 
(function(a,b){
    var result = a b;
    return result;
})(10,20)

8、從陣列中隨機取得成員

複製程式碼 程式碼如下:

var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var  randomItem = items[Math.floor(Math.random() * items.length)];

9、取得指定範圍內的隨機數
這個功能在產生測試用的假資料時特別有數,例如介與指定範圍內的薪資數。
複製程式碼 程式碼如下:

var x = Math.floor(Math.random() * (max - min 1)) min;

10、產生從0到指定值的數字數組
複製程式碼 程式碼如下:

var numbersArray = [] , max = 100;
for( var i=1; numbersArray.push(i )

11、產生隨機的字母數字字串
複製程式碼 程式碼如下:

  function generateRandomAlphaNum(len) {
    var rdmString = "";
    for( ; rdmString.length     return  rdmString.substr(0, len);

12、打亂數字數組的順序

複製程式碼 程式碼如下:

var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
numbers = numbers.sort(function(){ return Math.random() - 0.5});
/* numbers 陣列將類似 [120, 5, 228, -215, 400, 458, -85411, 122205]  */

這裡使用了JavaScript內建的陣列排序函數,更好的方法是用專門的程式碼來實作(如Fisher-Yates演算法),可以參考StackOverFlow上的這個討論。

13、字串去空格

Java、C#和PHP等語言都實作了專門的字串去空格函數,但JavaScript中是沒有的,可以透過下面的程式碼來為String物件函數一個trim函數:

複製程式碼 程式碼如下:

String.prototype.trim = function(){return this.replace(/^s |s $/g, "");};

新的JavaScript引擎已經有了trim()的原生實作。

14、陣列之間追加

複製程式碼 程式碼如下:

var array1 = [12 , "foo" , {name "Joe"} , -2458];
var array2 = ["Doe" , 555 , 100];
Array.prototype.push.apply(array1, array2);
/* array1 值為  [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] *//

15、物件轉換為陣列
複製程式碼 程式碼如下:

  var argArray = Array.prototype.slice.call(arguments);

16、驗證是否為數字
複製程式碼 程式碼如下:

  function isNumber(n){
    return !isNaN(parseFloat(n)) && isFinite(n);
}

17、驗證是否為陣列
複製程式碼 程式碼如下:

  function isArray(obj){
    return Object.prototype.toString.call(obj) === '[object Array]' ;
}

但如果toString()方法重寫過得話,就行不通了。也可以使用下面的方法:
複製程式碼 程式碼如下:

  Array.isArray(obj); // its a new Array method

如果在瀏覽器中沒有使用frame,也可以用instanceof,但如果上下文太複雜,也有可能出錯。
複製程式碼 程式碼如下:

  var myFrame = document.createElement('iframe');
document.body.appendChild(myFrame);
var myArray = window.frames[window.frames.length-1].Array;
var arr = new myArray(a,b,10); // [a,b,10] 
// myArray 的建構器已經遺失,instanceof 的結果將不正常
// 建構器是不能跨 frame 共享的
arr instanceof Array; // false

18、取得數組中的最大值和最小值
複製程式碼 程式碼如下:

var  numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
var maxInNumbers = Math.max.apply(Math, numbers);
var minInNumbers = Math.min.apply(Math, numbers);

19、清空數組
複製程式碼 程式碼如下:

  var myArray = [12 , 222 , 1000 ]; 
myArray.length = 0; // myArray will be equal to [].

20、不要直接從陣列中delete或remove元素
如果對陣列元素直接使用delete,其實並沒有刪除,只是將元素置為了undefined。數組元素刪除應使用splice。

切忌:

複製程式碼 程式碼如下:

var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];
items.length; // return 11
delete items[3]; // return true
items.length; // return 11
/* items 結果為 [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */

而應:

複製程式碼 程式碼如下:

  var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];
items.length; // return 11
items.splice(3,1) ;
items.length; // return 10
/* items 結果為 [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119]

刪除物件的屬性時可以使用delete。

21、使用length屬性截斷陣列

前面的例子中用length屬性清空數組,同樣還可用它來截斷數組:

複製程式碼 程式碼如下:

  var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ]; 
myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].

同時,如果把length屬性變大,陣列的長度值變會增加,會使用undefined來當新的元素填滿。 length是一個可寫的屬性。
複製程式碼 程式碼如下:

  myArray.length = 10; // the new array length is 10
myArray[myArray.length - 1] ; // undefined

22、在條件中使用邏輯與或

複製程式碼 程式碼如下:

var foo = 10; 
foo == 10 && doSomething(); // is the same thing as if (foo == 10) doSomething();
foo == 5 || doSomething(); // is the same thing as if (foo != 5) doSomething();

邏輯或還可用來設定預設值,例如函數參數的預設值。
複製程式碼 程式碼如下:

function doSomething(arg1){
    arg1 = arg1 || 10; // arg1 will have 10 as a default value if it's not already set
}

23、使得map()函數方法對資料循環
複製程式碼 程式碼如下:

  var squares = [1,2,3,4].map(function (val) { 
    return val * val; 
});
// squares will be equal to [1, 4, 9, 16]

24、保留指定小數位數
複製程式碼 程式碼如下:

  var num =2.443242342;
num = num.toFixed(4);  // num will be equal to 2.4432

注意,toFixec()傳回的是字串,不是數字。

25、浮點計算的問題

複製程式碼 程式碼如下:

  0.1 0.2 === 0.3 // is false
9007199254740992 1 // is equal to 9007199254740992
9007199254740992 2 // is equal to 9007199254740994

為什麼呢?因為0.1 0.2等於0.30000000000000004。 JavaScript的數字都遵循IEEE 754標準構建,在內部都是64位元浮點小數表示,具體可以參見JavaScript中的數字是如何編碼的.

可以透過使用toFixed()和toPrecision()來解決這個問題。

26、透過for-in循環檢查物件的屬性
下面這樣的用法,可以防止迭代的時候進入到物件的原型屬性中。

複製程式碼 程式碼如下:

  for (var name in object) { 
    if (object.hasOwnProperty(name)) {
        // do something with name
    } 
}

27、逗號操作符
複製程式碼 程式碼如下:

  var a = 0;
var b = ( a , 99 );
console.log(a);  // a will be equal to 1
console.log(b);  // b is equal to 99

28、暫時儲存用於計算和查詢的變數
在jQuery選擇器中,可以暫時儲存整個DOM元素。
複製程式碼 程式碼如下:

  var navright = document.querySelector('#right');
var navleft = document.querySelector('#left');
var navup = document.querySelector('#up');
var navdown = document.querySelector('#down');

29、事先檢查傳入isFinite()的參數
複製程式碼 程式碼如下:

  isFinite(0/0) ; // false
isFinite("foo"); // false
isFinite("10"); // true
isFinite(10);   // true
isFinite(undefined);  // false
isFinite();   // false
isFinite(null);  // true,這點當特​​別注意

30、避免在陣列中使用負數做索引
複製程式碼 程式碼如下:

  var numbersArray = [1,2,3,4,5];
var from = numbersArray.indexOf("foo") ;  // from is equal to -1
numbersArray.splice(from,2);    // will return [5]

注意傳給splice的索引參數不要是負數,當是負數時,會從陣列結尾處刪除元素。

31、用JSON來序列化與反序列化

複製程式碼 程式碼如下:

  var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} };
var stringFromPerson = JSON.stringify(person);
/* stringFromPerson 結果為 "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}"   */
var personFromString = JSON.parse(stringFromPerson);
/* personFromString 的值與 person 物件相同  */

32、不要使用eval()或函式建構器
eval()和函數建構器(Function consturctor)的開銷較大,每次調用,JavaScript引擎都要將原始碼轉換為可執行的程式碼。
複製程式碼 程式碼如下:

  var func1 = new Function(functionCode);
var func2 = eval(functionCode);

33、避免使用with()
使用with()可以把變數加入到全域作用域中,因此,如果有其它的同名變量,一來容易混淆,二來值也會被覆寫。

34、不要對陣列使用for-in
避免:

複製程式碼 程式碼如下:

  var sum = 0; 
for (var i in arrayNumbers) { 
    sum = arrayNumbers[i]; 
}

而是:
複製程式碼 程式碼如下:

  var sum = 0; 
for (var i = 0, len = arrayNumbers.length; i     sum = arrayNumbers[i]; 
}

另一個好處是,i和len兩個變數是在for迴圈的第一個宣告中,二者只會初始化一次,這要比下面這種寫法快:
複製程式碼 程式碼如下:

  for (var i = 0; i

35、傳給setInterval()、setTimeout()時使用函數而不是字串
如果傳給setTimeout()和setInterval()一個字串,他們將會用類似於eval方式進行轉換,這肯定會要慢些,因此不要使用:
複製程式碼 程式碼如下:

setInterval('doSomethingPeriodically()', 1000); 
setTimeout('doSomethingAfterFiveSeconds()', 5000);

而是用:
複製程式碼 程式碼如下:

setInterval(doSomethingPeriodically, 1000); 
setTimeout(doSomethingAfterFiveSeconds, 5000);

36、使用switch/case取代一大疊的if/else

當判斷有超過兩個分支的時候使用switch/case要更快一些,而且也更優雅,更利於代碼的組織,當然,如果有超過10個分支,就不要使用switch/case了。

37、在switch/case使用數位區間

其實,switch/case中的case條件,還可以這樣寫:

複製程式碼 程式碼如下:

  function getCategory(age) { 
    var category = ""; 
    switch (true) { 
        case isNaN(age): 
            category = "not an age"; 
            break; 
        case (age >= 50): 
            category = "Old"; 
            break; 
        case (age             category = "Baby"; 
            break; 
        default: 
            category = "Young"; 
            break; 
    }; 
    return category; 

getCategory(5);  // 將回傳 "Baby"

38、使用物件作為物件的原型

下面這樣,便可以給定物件作為參數,來建立以此為原型的新物件:

複製程式碼 程式碼如下:

  function clone(object) { 
    function OneShotConstructor(){};
    OneShotConstructor.prototype = object; 
    return new OneShotConstructor();
}
clone(Array).prototype ;  // []

39、HTML欄位轉換函數
複製程式碼 程式碼如下:

  function escapeHTML(text) { 
    var replacements= {"": ">","&": "&", """: """};                    return text.replace(/[&"]/g, function(character) { 
        return replacements[character]; 
    });
}


40、不要在迴圈內部使用try-catch-finally try-catch-finally中catch部分在執行時會將異常賦給一個變量,這個變數會被建構成一個運行時作用域內的新的變數。

切忌:


複製程式碼 程式碼如下:
  var object = ['foo', 'bar'], i; 
for (i = 0, len = object.length; i     try { 
        // do something that throws an exception
    } 
    catch (e) {  
        // handle exception 
    }
}

而應該:

複製程式碼 程式碼如下:
  var object = ['foo', 'bar'], i; 
try {
    for (i = 0, len = object.length; i         // do something that throws an exception
    }
}
catch (e) {  
    // handle exception 
}

41、使用XMLHttpRequests時注意設定逾時
XMLHttpRequests在執行時,當長時間沒有回應(如出現網路問題等)時,應該中止掉連接,可以透過setTimeout()來完成這個工作:

複製程式碼 程式碼如下:

  var xhr = new XMLHttpRequest ();
xhr.onreadystatechange = function () { 
    if (this.readyState == 4) { 
        clearTimeout(timeout); 
        // do something with response data
    } 

var timeout = setTimeout( function () { 
    xhr.abort(); // call error callback 
}, 60*1000 /* timeout after a minute */ );
xhr.open('GET', url, true); 
xhr.send();

同時要注意的是,不要同時發起多個XMLHttpRequests請求。

42、處理WebSocket的超時

通常情況下,WebSocket連線建立後,如果30秒內沒有任何活動,伺服器端會對連線進行逾時處理,防火牆也可以對單位週期沒有活動的連線進行逾時處理。

為了防止這種情況的發生,可以每隔一定時間,往伺服器發送一則空的訊息。可以透過下面這兩個函數來實現這個需求,一個用於使連接保持活動狀態,另一個專門用於結束這個狀態。

複製程式碼 程式碼如下:

  var timerID = 0;
function keepAlive() {
    var timeout = 15000; 
    if (webSocket.readyState == webSocket.OPEN) { 
        webSocket.send(''); 
    } 
    timerId = setTimeout(keepAlive, timeout); 

function cancelKeepAlive() { 
    if (timerId) { 
        cancelTimeout(timerId); 
    } 
}

keepAlive()函數可以放在WebSocket連接的onOpen()方法的最後面,cancelKeepAlive()放在onClose()方法的最末尾。

43、時間注意原始操作符比函數呼叫快,使用VanillaJS
比如,一般不要這樣:

複製程式碼 程式碼如下:

  var min = Math.min(a,b);
A.push(v);

可以這樣來代替:
複製程式碼 程式碼如下:

  var min = a A[A.length] = v;

44、開發時注意程式碼結構,上線前檢查並壓縮JavaScript程式碼
可以使用JSLint或JSMin等工具來檢查並壓縮程式碼。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用正規表示式去除 PHP 數組中的重複值 使用正規表示式去除 PHP 數組中的重複值 Apr 26, 2024 pm 04:33 PM

使用正規表示式從PHP數組中移除重複值的方法:使用正規表示式/(.*)(.+)/i匹配並取代重複項。遍歷數組元素,使用preg_match檢查匹配情況。如果匹配,請跳過值;否則,將其添加到無重複值的新數組中。

程式設計是乾啥的,學了有什麼用 程式設計是乾啥的,學了有什麼用 Apr 28, 2024 pm 01:34 PM

1、程式設計可用於開發各種軟體和應用程序,包括網站、手機應用程式、遊戲和數據分析工具等。它的應用領域非常廣泛,幾乎涵蓋了所有行業,包括科學研究、醫療保健、金融、教育、娛樂等。 2.學習程式設計可以幫助我們提升問題解決能力和邏輯思考能力。在程式設計過程中,我們需要分析和理解問題,找出解決方案,並將其轉換為程式碼。這種思維方式能夠培養我們的分析和抽象能力,提升我們解決實際問題的能力。

使用 C++ lambda 表達式有哪些注意事項? 使用 C++ lambda 表達式有哪些注意事項? Apr 17, 2024 pm 12:15 PM

使用C++lambda表達式時需注意:小心捕捉變量,避免意外修改。可透過引用或值捕獲變量,引用捕獲用於修改外部變量。 lambda表達式生命週期與捕獲它的函數不同,可能導致記憶體洩漏。考慮使用函數指標或函數物件以優化效能。

編碼的關鍵:為初學者釋放 Python 的力量 編碼的關鍵:為初學者釋放 Python 的力量 Oct 11, 2024 pm 12:17 PM

Python透過其易學性和​​強大功能,是初學者的理想程式設計入門語言。其基礎包括:變數:用於儲存資料(數字、字串、列表等)。資料型態:定義變數中資料的型態(整數、浮點數等)。運算符:用於數學運算和比較。控制流程:控製程式碼執行流程(條件語句、迴圈)。

使用 Python 解決問題:作為初學者,解鎖強大的解決方案 使用 Python 解決問題:作為初學者,解鎖強大的解決方案 Oct 11, 2024 pm 08:58 PM

Python 讓初學者能夠解決問題。

C++ 程式設計謎題片段:激發思維,提升程式設計水平 C++ 程式設計謎題片段:激發思維,提升程式設計水平 Jun 01, 2024 pm 10:26 PM

C++程式設計謎題涵蓋斐波那契數列、階乘、漢明距離、陣列最大值和最小值等演算法和資料結構概念,透過解決這些謎題,可以鞏固C++知識,提升演算法理解和程式設計技巧。

不打架改打球! 《永劫無間》全新模式熱血鬥振球玩法介紹 不打架改打球! 《永劫無間》全新模式熱血鬥振球玩法介紹 Apr 11, 2024 pm 01:52 PM

排位打累了?那就來打球吧!默契配合的隊友,讓對手嚐一口嚐出其不意的滋味!瞬息萬變的戰場,試試看如何巧用技能一招破局! 《永劫無間》在4月11日的更新中上線了一個全新的團隊對抗模式,以下就帶給大家永劫無間熱血鬥振球活動介紹。永劫無間熱血鬥振球玩法一覽簡介:透過各種手段反彈鬥球,擊敗敵人。人數:單排9人,三排6人玩法說明:回合:1、遊戲分為多個回合,每回合開始時,鬥球會出生在場地中央隨機選取一名玩家追擊,玩家使用各種手段擊球會使鬥球提速,被鬥球擊中會扣除體力。 2、單排每人每回合擁有一點體力,三排每人每

揭秘 C:為新程式設計師提供一條清晰簡單的道路 揭秘 C:為新程式設計師提供一條清晰簡單的道路 Oct 11, 2024 pm 10:47 PM

C是初學者學習系統程式設計的理想選擇,它包含以下元件:頭檔、函數和主函數。一個簡單的C程式可以列印“HelloWorld”,需要包含標準輸入/輸出函數聲明的頭文件,並在主函數中使用printf函數來列印。透過使用GCC編譯器可以編譯和執行C程式。掌握基礎後,可以繼續學習資料類型、函數、陣列和文件處理等主題,以成為熟練的C程式設計師。

See all articles