JavaScript ist eine weltweit führende Programmiersprache, die für Webentwicklung, mobile App-Entwicklung (PhoneGap, Appcelerator), serverseitige Entwicklung (Node.js und Wakanda) und mehr verwendet werden kann. JavaScript ist auch die erste Sprache für viele Anfänger, die in die Programmierwelt einsteigen. Sie kann sowohl verwendet werden, um einfache Alert-Boxen im Browser anzuzeigen, als auch um Roboter über nodebot oder nodruino zu steuern. Entwickler, die gut strukturierten, leistungsstarken JavaScript-Code schreiben können, sind heute die begehrtesten Personen auf dem Arbeitsmarkt geworden.

In diesem Artikel teile ich einige JavaScript-Tipps, Tricks und bewährte Methoden. Mit wenigen Ausnahmen gelten sie sowohl für JavaScript-Engines in Browsern als auch für serverseitige JavaScript-Interpreter.

Der Beispielcode in diesem Artikel wurde auf der neuesten Version von Google Chrome 30 (V8 3.20.17.15) getestet.

1. Verwenden Sie immer bei der ersten Zuweisung einer Variablenvarkeyword

Wenn eine Variable zugewiesen wird, ohne deklariert zu werden, wird sie standardmäßig zu einer neuen globalen Variable. Versuchen Sie, die Verwendung globaler Variablen zu vermeiden.

2. Verwenden Sie===anstelle von==

==und!=Der Operator konvertiert bei Bedarf automatisch Datentypen. Aber===und!==nicht. Sie vergleichen sowohl den Wert als auch den Datentyp gleichzeitig, was sie auch [schneller] macht als==und!=, 0, false, NaN und leere Zeichenketten werden im booleschen Kontext alle als false ausgewertet

[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 und leere Zeichenketten werden im booleschen Kontext alle als false ausgewertet

4. Verwenden Sie Semikolons am Ende von Zeilen

Die Wahrheit über Semikolons in JavaScript5. Objektkonstruktoren verwenden。

5. Objektkonstruktoren verwenden

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

6. Seien Sie vorsichtig mittypeof、instanceofundcontructor

  • typeofgibt auch zurücktypeof null, die meisten Objekttypen (Array, Date usw.) geben ebenfalls zurückobject: interne Prototyp-Eigenschaft, kann durch Code überschrieben werdenobject
  • contructor: JavaScript-Operator, durchsucht die Konstruktoren in der Prototypenkette und gibt zurück, wenn gefunden
  • instanceof, andernfalls gibt sie zurücktruefalse
var arr = ["a", "b", "c"];
typeof arr;   // 返回 "object" 
arr instanceof Array // true
arr.constructor();  //[]

7. Selbstaufrufende Funktionen verwenden

Die Funktion wird automatisch sofort nach der Erstellung ausgeführt, üblicherweise als selbstaufgerufene anonyme Funktion oder als sofort aufgerufener Funktionsausdruck (IIFE) bezeichnet. Das Format ist wie folgt:

(function(){
    // 置于此处的代码将自动执行
})();  
(function(a,b){
    var result = a+b;
    return result;
})(10,20)

8. Zufällig ein Element aus einem Array abrufen

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

9. Eine Zufallszahl innerhalb eines angegebenen Bereichs erhalten

Diese Funktion ist besonders nützlich beim Generieren von Fake-Daten für Tests, wie etwa Gehaltszahlen innerhalb eines angegebenen Bereichs.

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

10. Ein Array mit Zahlen von 0 bis zu einem angegebenen Wert generieren

var numbersArray = [] , max = 100;
for( var i=1; numbersArray.push(i++) < max;);  // numbers = [1,2,3 ... 100]

11. Eine zufällige alphanumerische Zeichenkette generieren

function generateRandomAlphaNum(len) {
    var rdmString = "";
    for( ; rdmString.length < len; rdmString  += Math.random().toString(36).substr(2));
    return  rdmString.substr(0, len);
}

12. Die Reihenfolge eines numerischen Arrays mischen

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]  */

Hier wird die in JavaScript integrierte Array-Sortierfunktion verwendet. Ein besserer Weg ist die Verwendung von speziellem Code (wie dem Fisher-Yates-Algorithmus). Siehe die Diskussion auf StackOverflowdiese Diskussion。

13. Leerzeichen aus einer Zeichenkette entfernen

Java, C#, PHP und andere Sprachen verfügen alle über dedizierte Funktionen zum Trimmen von Zeichenketten, aber JavaScript nicht. Sie können den folgenden Code verwenden, um fürStringdem Objekt einetrimFunktion verfolgen:

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

Neue JavaScript-Engines verfügen bereits übertrim()native Implementierungen von.

14. Arrays aneinander anhängen

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. Ein Objekt in ein Array umwandeln

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

16. Überprüfen, ob es eine Zahl ist

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

17. Überprüfen, ob es ein Array ist

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

Aber wenntoString()die Methode überschrieben wurde, funktioniert sie nicht. Sie können auch die folgende Methode verwenden:

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

Wenn im Browser keine Frames verwendet werden, können Sie auch verwendeninstanceof, aber wenn der Kontext zu komplex ist, kann es auch fehlschlagen.

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. Maximal- und Minimalwerte in einem Array ermitteln

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. Ein Array leeren

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

20. Nicht direkt aus dem Array löschendeleteoderremoveElemente

Wenn Sie direkt auf Array-Elemente anwendendelete, löscht es nicht wirklich, sondern setzt das Element aufundefined. Um Array-Elemente zu löschen, sollten Sie verwendensplice。

Niemals:

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] */

Stattdessen:

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]

Beim Löschen von Objekteigenschaften können Siedelete。

21. Verwenden Sielengthdie Eigenschaft zum Kürzen eines Arrays

Im vorherigen Beispiel hat die Verwendunglengthder Eigenschaft das Array geleert. Sie können sie auch verwenden, um das Array zu kürzen:

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

Wenn Sie gleichzeitig dielengthEigenschaft vergrößern, wird die Länge des Arrays zunehmen, und es wirdundefinedverwenden, um sie als neue Elemente einzufügen.lengthist eine beschreibbare Eigenschaft.

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

22. Verwenden Sie logisches UND/ODER in Bedingungen

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();

Logisches ODER kann auch verwendet werden, um Standardwerte festzulegen, wie z. B. Standardwerte für Funktionsparameter.

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

23. Machen Siemap()Funktionsmethoden durchlaufen Daten

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

24. Eine bestimmte Anzahl von Dezimalstellen beibehalten

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

Beachten Sie, dasstoFixec()Was zurückgegeben wird, ist eine Zeichenkette, keine Zahl.

25. Probleme bei Gleitkommaberechnungen

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

Warum? Weil 0.1+0.2 gleich 0.30000000000000004 ist. JavaScript-Zahlen werden nach dem IEEE 754-Standard erstellt und sind intern alle 64-Bit-Gleitkommadarstellungen. Einzelheiten finden Sie unterWie Zahlen in JavaScript kodiert werden.

Sie könnentoFixed()undtoPrecision()um dieses Problem zu lösen.

26. Objekteigenschaften mit einer for-in-Schleife prüfen

Die folgende Verwendung kann verhindern, dass die Iteration in die Prototyp-Eigenschaften des Objekts eindringt.

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

27. Kommaoperator

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. Variablen vorübergehend für Berechnung und Nachschlagen speichern

In jQuery-Selektoren können Sie ganze DOM-Elemente vorübergehend speichern.

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

29. Eingehendes vorab prüfenisFinite()parameters

isFinite(0/0) ; // false
isFinite("foo"); // false
isFinite("10"); // true
isFinite(10);   // true
isFinite(undefined);  // false
isFinite();   // false
isFinite(null);  // true,这点当特别注意

30. Vermeiden Sie die Verwendung negativer Zahlen als Indizes in Arrays

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

Beachten Sie: Der übergebene Indexparametersplicedarf nicht negativ sein; wenn er negativ ist, werden Elemente vom Ende des Arrays gelöscht.

31. Verwenden Sie JSON für Serialisierung und Deserialisierung

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. Verwenden Sie nichteval()oder Funktionskonstruktoren

eval()und der Funktionskonstruktor (FunctionKonstruktor) haben erheblichen Overhead; jedes Mal, wenn sie aufgerufen werden, muss die JavaScript-Engine den Quellcode in ausführbaren Code umwandeln.

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

33. Vermeiden Sie die Verwendung vonwith()

Verwendungwith()können Variablen zum globalen Gültigkeitsbereich hinzufügen; wenn es andere Variablen mit demselben Namen gibt, führt das zu Verwirrung und die Werte werden ebenfalls überschrieben.

34. Verwenden Sie for-in nicht für Arrays

Vermeiden:

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

Stattdessen:

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

Ein weiterer Vorteil ist, dassiundlendie beiden Variablen sindforin der ersten Deklaration der Schleife, und beide werden nur einmal initialisiert, was schneller ist als der folgende Ansatz:

for (var i = 0; i < arrayNumbers.length; i++)

35. Übergeben ansetInterval()undsetTimeout()Verwende eine Funktion statt einer Zeichenkette, wenn

Wenn SiesetTimeout()undsetInterval()eine Zeichenkette, verwenden sie eine Methode ähnlich wieevalum sie umzuwandeln, was sicherlich langsamer ist, also verwende nicht:

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

Verwende stattdessen:

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

36. Verwendeswitch/caseanstelle eines großen Stapels vonif/else

Wenn die Bedingung mehr als zwei Verzweigungen hat, verwendeswitch/casees ist schneller, eleganter und besser für die Codeorganisation. Wenn es jedoch mehr als 10 Verzweigungen gibt, verwenden Sie es natürlich nicht.switch/caseit.

37. Inswitch/caseverwenden Sie numerische Bereiche in

Tatsächlich,switch/casein dercaseBedingung, es kann auch so geschrieben werden:

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. Verwenden Sie ein Objekt als Prototyp eines anderen Objekts

Auf die folgende Weise kann ein gegebenes Objekt als Parameter übergeben werden, um ein neues Objekt mit ihm als Prototyp zu erstellen:

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

39. HTML-Feldkonvertierungsfunktionen

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

40. Verwenden Sie try-catch-finally nicht innerhalb von Schleifen

In try-catch-finally weist der Catch-Teil die Ausnahme während der Ausführung einer Variablen zu, und diese Variable wird als neue Variable innerhalb des Laufzeitbereichs angelegt.

Vermeiden:

var object = ['foo', 'bar'], i;  
for (i = 0, len = object.length; i <len; i++) {  
    try {  
        // do something that throws an exception 
    }  
    catch (e) {   
        // handle exception  
    } 
}

Stattdessen:

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. Achten Sie darauf, bei der Verwendung von XMLHttpRequests ein Timeout festzulegen

Wenn XMLHttpRequests ausgeführt werden und über einen längeren Zeitraum keine Antwort erhalten (z. B. wenn Netzwerkprobleme auftreten), sollte die Verbindung abgebrochen werden. Dies kann durchsetTimeout()um dies zu erreichen:

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();

Beachten Sie außerdem, dass Sie nicht mehrere XMLHttpRequests gleichzeitig starten sollten.

42. WebSocket-Timeouts behandeln

Normalerweise wird, nachdem eine WebSocket-Verbindung hergestellt wurde, die Verbindung vom Server wegen Zeitüberschreitung beendet, wenn 30 Sekunden lang keine Aktivität stattfindet, und Firewalls können ebenfalls Verbindungen wegen Zeitüberschreitung trennen, die innerhalb einer Zeiteinheit keine Aktivität aufweisen.

Um dies zu verhindern, können Sie in regelmäßigen Abständen eine leere Nachricht an den Server senden. Dies kann mit den folgenden zwei Funktionen erreicht werden: eine, um die Verbindung am Leben zu erhalten, und die andere speziell, um diesen Zustand zu beenden.

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()Die Funktion kann am Ende der WebSocket-Verbindung platziert werdenonOpen()Methode,cancelKeepAlive()und an dasonClose()äußerste Ende der Methode gesetzt werden.

43. Beachten Sie stets, dass primitive Operatoren schneller als Funktionsaufrufe sind; verwenden Sie VanillaJS

Zum Beispiel sollten Sie dies im Allgemeinen nicht tun:

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

Sie können es durch Folgendes ersetzen:

var min = a < b ? a : b; 
A[A.length] = v;

44. Achten Sie während der Entwicklung auf die Codestruktur und prüfen und komprimieren Sie den JavaScript-Code vor dem Livegang

Vergessen Sie nicht, beim Schreiben von Code einen Code-Beautifier zu verwenden. Verwenden Sie JSLint (ein Werkzeug zur Syntaxprüfung) und minifizieren Sie den Code vor dem Livegang (zum Beispiel mit JSMin). Hinweis: UglifyJS wird inzwischen allgemein für die Code-Minifizierung empfohlen (https://github.com/mishoo/UglifyJS2)

45. JavaScript ist umfangreich und tiefgründig; hier sind einige gute Lernressourcen

  • Code Academy-Ressource: http://www.codecademy.com/tracks/javascript
  • Von Marijn Haverbeke geschriebenEloquent JavaScript:http://eloquentjavascript.net/
  • Von John Resig geschriebenAdvanced JavaScript:http://ejohn.org/apps/learn/

Quelle: http://www.codeceo.com/article/javascript-45-tips.html