搜尋
首頁web前端js教程45個JavaScript程式設計注意事項、技巧大全_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
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

See all articles

熱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.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版