45個實用的JavaScript小貼士、小技巧和最佳實踐

翻譯介紹

翻譯標題:45 Useful JavaScript Tips, Tricks and Best Practicesjavascript

翻譯來源:http://modernweb.com/2013/12/23/45-useful-javascript-tips-tricks-and-best-practices/java

若有翻譯不正確的地方,請在下放評論出反饋。web

翻譯正文

  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. undefined, null, 0, false, NaN, '' (空字符串) 轉成布爾值都爲false.
  4. 每行代碼的末尾最好都加上個分號
  5. 最好給對象都添加上構造函數緩存

    function Person(firstName, lastName){
        this.firstName =  firstName;
        this.lastName = lastName;        
    }  
    
    var Saad = new Person("Saad", "Mousliki");
  6. 在使用typeof,instanceofconstructor儘可能當心。
  7. 善用匿名自調用函數(IIFE)app

    (function(){
        // some private code that will be executed automatically
    })();  
    (function(a,b){
        var result = a+b;
        return result;
    })(10,20)
  8. 在一個數組中獲取一個隨機的項目dom

    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. 隨機生成指定長度的字符串this

    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});
  13. 去掉字符串的先後空格

    String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, "");};
  14. 將一個數組添加到另外一個數組

    var array1 = [12 , "foo" , {name "Joe"} , -2458];
    
    var array2 = ["Doe" , 555 , 100];
    Array.prototype.push.apply(array1, array2);
  15. arguments轉換成數組

    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]' ;
    }
  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來刪除數組中的項目

    請使用splice來代替deletel來刪除數組中的項目,使用delete會用undefinedl來替換數組中被刪除的哪一項。

    delete

    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 will be equal to [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154,       119]   */

    splice

    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 will be equal to [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154,       119]   */
  21. 用長度來截取一個字符串

    var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ];  
    myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].
  22. 在條件判斷裏面使用邏輯AND或者OR

    var foo = 10;  
    foo == 10 && doSomething(); // 等效 if (foo == 10) doSomething(); 
    foo == 5 || doSomething(); // 等效 if (foo != 5) doSomething();

    默認值取值

    function doSomething(arg1){ 
        arg1 = arg1 || 10; // 若是arg1沒有被賦值,則取10
    }
  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
  25. 浮點數小數點的問題

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

    你能夠使用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. 當一個變量須要被查詢或者計算的時候,能夠把它緩存起來

    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]
  31. 序列和解析一個JSON

    var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} }; 
    var stringFromPerson = JSON.stringify(person); 
    /* stringFromPerson is equal to "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}"   */ 
    var personFromString = JSON.parse(stringFromPerson);  
    /* personFromString is equal to person object  */
  32. 避免使用 eval() 桌和 Function 構造函數

    var func1 = new Function(functionCode);
    var func2 = eval(functionCode);
  33. 避免使用使用 with()
  34. 避免使用 for-in 來迭代一個數組
  35. 對於setTimeout()setInterval(),最好傳遞函數而不是字符串。
  36. 使用switch/case來替代多重if/else
  37. 把switch/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);  // will return "Baby"
  38. 建立一個對象,而且他的原型是咱們指定的對象。

    function clone(object) {  
        function OneShotConstructor(){}; 
        OneShotConstructor.prototype= object;  
        return new OneShotConstructor(); 
    } 
    clone(Array).prototype ;  // []
  39. 一個 HTML 實體替換函數

    function escapeHTML(text) {  
        var replacements= {"<": "&lt;", ">": "&gt;","&": "&amp;", "\"": "&quot;"};                      
        return text.replace(/[<>&"]/g, function(character) {  
            return replacements[character];  
        }); 
    }
  40. 避免在循環中使用 try-catch-finally

    很差的用法:

    for (i = 0, len = object.length; i <len; 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 <len; i++) {  
            // do something that throws an exception 
        } 
    } 
    catch (e) {   
        // handle exception  
    }
  41. XMLHttpRequests設置定時失效的時間

    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();
  42. 解決 WebSocket的失效時間

    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);  
        }  
    }
  43. 記住使用原生的運算符代替函數調用。使用VanillaJS.

    示例demo
    
    var min = Math.min(a,b); 
    A.push(v);
    
    使用下面代替上面的demo
    
    var min = a < b ? a : b; 
    A[A.length] = v;
  44. 不要忘記在編碼的時候規範美化。在部署的時候用JSLIint和壓縮

  45. JavaScript 是使人敬畏。學習JavaScript最好的資源
相關文章
相關標籤/搜索