目錄
1、第一次為變數賦值時務必使用var關鍵字
2、使用===取代==
3、underfined、null、0、false、NaN、空字串的邏輯結果皆為false
4、行尾使用分號
5、使用物件建構器
6、小心使用typeof、instanceof和contructor
7、使用自呼叫函數
8、從陣列中隨機取得成員
9、取得指定範圍內的隨機數
10、產生從0到指定值的數字數組
11、產生隨機的字母數字字串
12、打亂數字數組的順序
13、字串去空格
14、陣列之間追加
15、物件轉換為陣列
26、通过for-in循环检查对象的属性
27、逗号操作符
28、临时存储用于计算和查询的变量
29、提前检查传入isFinite()的参数
30、避免在数组中使用负数做索引
31、用JSON来序列化与反序列化
32、不要使用eval()或者函数构造器
33、避免使用with()
34、不要对数组使用for-in
35、传给setInterval()和setTimeout()时使用函数而不是字符串
36、使用switch/case代替一大叠的if/else
37、在switch/case中使用数字区间
38、使用对象作为对象的原型
39、HTML字段转换函数
40、不要在循环内部使用try-catch-finally
41、使用XMLHttpRequests时注意设置超时
42、处理WebSocket的超时
43、时间注意原始操作符比函数调用快,使用VanillaJS
44、开发时注意代码结构,上线前检查并压缩JavaScript代码
45、JavaScript博大精深,这里有些不错的学习资源
首頁 web前端 js教程 JavaScript 45個開發技巧

JavaScript 45個開發技巧

Feb 24, 2017 pm 01:17 PM

JavaScript是一個絕冠全球的程式語言,可用於網路開發、行動應用程式開發(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++) < max;);  // numbers = [1,2,3 ... 100]
登入後複製

11、產生隨機的字母數字字串

function generateRandomAlphaNum(len) {
    var rdmString = "";
    for( ; rdmString.length < len; rdmString  += Math.random().toString(36).substr(2));
    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) === &#39;[object Array]&#39; ;
}
登入後複製

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

Array.isArray(obj); // its a new Array method
登入後複製

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

var myFrame = document.createElement(&#39;iframe&#39;);
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 ,&#39;a&#39; , 2 , 5478 , &#39;foo&#39; , 8852, , &#39;Doe&#39; ,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 ,&#39;a&#39; , 2 , 5478 , &#39;foo&#39; , 8852, , &#39;Doe&#39; ,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(&#39;#right&#39;); 
var navleft = document.querySelector(&#39;#left&#39;); 
var navup = document.querySelector(&#39;#up&#39;); 
var navdown = document.querySelector(&#39;#down&#39;);
登入後複製

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 :&#39;Saad&#39;, 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()和函数构造器(Functionconsturctor)的开销较大,每次调用,JavaScript引擎都要将源代码转换为可执行的代码。

var func1 = new Function(functionCode);
var func2 = eval(functionCode);
登入後複製
登入後複製

32、不要使用eval()或者函数构造器

eval()和函数构造器(Functionconsturctor)的开销较大,每次调用,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 < len; i++) {  
    sum += arrayNumbers[i];  
}
登入後複製


另外一个好处是,i和len两个变量是在for循环的第一个声明中,二者只会初始化一次,这要比下面这种写法快:

for (var i = 0; i < arrayNumbers.length; i++)
登入後複製

35、传给setInterval()和setTimeout()时使用函数而不是字符串

如果传给setTimeout()和setInterval()一个字符串,他们将会用类似于eval方式进行转换,这肯定会要慢些,因此不要使用:

setInterval(&#39;doSomethingPeriodically()&#39;, 1000);  
setTimeout(&#39;doSomethingAfterFiveSeconds()&#39;, 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 <= 20):  
            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 = [&#39;foo&#39;, &#39;bar&#39;], i;  
for (i = 0, len = object.length; i <len; i++) {  
    try {  
        // do something that throws an exception 
    }  
    catch (e) {   
        // handle exception  
    } 
}
登入後複製

而应该:

var object = [&#39;foo&#39;, &#39;bar&#39;], i;  
try { 
    for (i = 0, len = object.length; i <len; 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(&#39;GET&#39;, url, true);  
xhr.send();
登入後複製

同时需要注意的是,不要同时发起多个XMLHttpRequests请求。

42、处理WebSocket的超时

通常情况下,WebSocket连接创建后,如果30秒内没有任何活动,服务器端会对连接进行超时处理,防火墙也可以对单位周期没有活动的连接进行超时处理。

为了防止这种情况的发生,可以每隔一定时间,往服务器发送一条空的消息。可以通过下面这两个函数来实现这个需求,一个用于使连接保持活动状态,另一个专门用于结束这个状态。

var timerID = 0; 
function keepAlive() { 
    var timeout = 15000;  
    if (webSocket.readyState == webSocket.OPEN) {  
        webSocket.send(&#39;&#39;);  
    }  
    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 < b ? a : b; 
A[A.length] = v;
登入後複製

44、开发时注意代码结构,上线前检查并压缩JavaScript代码

别忘了在写代码时使用一个代码美化工具。使用JSLint(一个语法检查工具)并且在上线前压缩代码(比如使用JSMin)。注:现在代码压缩一般推荐 UglifyJS (http://www.php.cn/)

45、JavaScript博大精深,这里有些不错的学习资源

  • Code Academy资源:http://www.php.cn/

  • Marjin Haverbekex编写的Eloquent JavaScript:http://www.php.cn/

  • John Resig编写的Advanced JavaScript:http://www.php.cn/

 以上就是JavaScript 开发的45个技巧的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數

See all articles