Errori comuni JavaScript
- Pagina precedente Best Practices JS
- Pagina successiva Prestazioni JS
Questo capitolo indica alcuni errori comuni in JavaScript.
L'uso imprevisto dell'operatore di assegnamento
Se il programmatore usa if
L'uso imprevisto dell'operatore di assegnazione nella=
)) invece dell'operatore di confronto (=====
)), i programmi JavaScript possono produrre alcuni risultati imprevisti.
Questa if
La frase restituisce false
Come previsto), perché x non è uguale a 10:
var x = 0; if (x == 10)
Questa if
La frase restituisce true
Forse non come previsto), perché 10 è true:
var x = 0; if (x = 10)
Questa if
La frase restituisce false
Forse non come previsto), perché 0 è false:
var x = 0; if (x = 0)
L'assegnazione sempre restituisce il valore assegnato.
Spero di confronti deboli
In confronti deboli, il tipo di dati non è importante. Questa if
La frase restituisce true
:
var x = 10; var y = "10"; if (x == y)
In confronti rigorosi, il tipo di dati è davvero importante. Questa if
La frase restituisce false
:
var x = 10; var y = "10"; if (x === y)
Un errore comune è dimenticare di switch
La frase utilizza confronti rigorosi:
Questa switch
La frase mostrerà la finestra di dialogo:
var x = 10; switch(x) { case 10: alert("Hello"); }
Questa switch
La frase non mostrerà la finestra di dialogo:
var x = 10; switch(x) { case "10": alert("Hello"); }
Somma e concatenazione ingannevoli
SommaPerNumerico。
Concatenazione (Concatenation)PerStringa。
In JavaScript, entrambi gli operatori utilizzano lo stesso +
Operatore.
Per questo, sommare numeri come numeri produce risultati diversi da sommarli come stringhe:
var x = 10 + 5; // Il risultato in x è 15 var x = 10 + "5"; // Il risultato in x è "105"
Se si sommano due variabili, è difficile prevedere il risultato:
var x = 10; var y = 5; var z = x + y; // Il risultato in z è 15 var x = 10; var y = "5"; var z = x + y; // Il risultato in z è "105"
Il punto fluttuante ingannevole
Tutti i numeri in JavaScript vengono salvati come 64 bitNumeri a virgola mobile (Floats)。
Tutti i linguaggi di programmazione, inclusi JavaScript, hanno difficoltà a gestire i valori a virgola mobile:
var x = 0.1; var y = 0.2; var z = x + y // Il risultato in z non sarà 0.3
Per risolvere il problema sopra, usa le operazioni di moltiplicazione e divisione:
Esempio
var z = (x * 10 + y * 10) / 10; // Il risultato in z sarà 0.3
Nuova riga di comando per stringhe JavaScript
JavaScript ti permette di spezzare una frase in due righe:
Esempio 1
var x = "Hello World!";
Ma, fare una nuova riga di comando nel mezzo di una stringa non è corretto:
Esempio 2
var x = "Hello World!";
Esempio 3
var x = "Hello \", World!";
Punto e virgola fuori posto
Per un punto e virgola sbagliato, questo blocco di codice eseguirà sempre indipendentemente dal valore di x:
if (x == 19); { // blocco di codice }
Fai una nuova riga di comando per il comando return
Chiudere automaticamente le frasi alla fine della riga è il comportamento predefinito di JavaScript.
Ecco perché i due esempi seguenti restituiscono lo stesso risultato:
Esempio 1
function myFunction(a) { var power = 10 return a * power }
Esempio 2
function myFunction(a) { var power = 10; return a * power; }
JavaScript ti permette anche di spezzare una frase in due righe.
Ecco perché l'esempio 3 restituirà lo stesso risultato:
Esempio 3
function myFunction(a) { var power = 10; return a * power; }
Ma, se si mette return
Cosa succede se si cambia riga di comando per due righe?
Esempio 4
function myFunction(a) { var power = 10; return a * power; }
Questa funzione restituirà undefined
!
Perché? Perché JavaScript pensa che tu voglia:
Esempio 5
function myFunction(a) { var power = 10; return; a * power; }
Spiegazione
Se una frase non è completa:
var
JavaScript completerà questa frase leggendo la riga successiva:
power = 10;
Ma poiché questa frase è completa:
return
JavaScript chiuderà automaticamente questa frase:
return;
Questo accade perché, in JavaScript, chiudere (terminare) una frase con un punto e virgola è opzionale.
JavaScript chiude automaticamente return
una frase, perché è già una frase completa.
Quindi, non dovresti mai return
Esegui una nuova riga di comando.
Accedi all'array tramite l'indice di nome
很多编程语言支持带有命名索引的数组。
带有命名索引的数组被称为关联数组(或散列)。
JavaScript 不支持带有命名索引的数组。
在 JavaScript 中,数组使用数字索引:
Esempio
var person = []; person[0] = "Bill"; person[1] = "Gates"; person[2] = 46; var x = person.length; // person.length 将返回 3 var y = person[0]; // person[0] 将返回 "Bill"
在 JavaScript 中,对象使用命名索引。
如果您使用命名索引,那么在访问数组时,JavaScript 会将数组重新定义为标准对象。
在自动重定义之后,数组方法或属性将产生未定义或非正确的结果:
Esempio
var person = []; person["firstName"] = "Bill"; person["lastName"] = "Gates"; person["age"] = 46; var x = person.length; // person.length 将返回 0 var y = person[0]; // person[0] 将返回 undefined
用逗号来结束定义
对象和数组定义中的尾随逗号在 ECMAScript 5 中是合法的。
对象实例:
person = {firstName:"Bill", lastName:"Gates", age:62,}
数组实例:
points = [35, 450, 2, 7, 30, 16,];
警告!!
Internet Explorer 8 会崩溃。
JSON 不允许尾随逗号。
JSON:
person = {firstName:"Bill", lastName:"Gates", age:62}
JSON:
points = [35, 450, 2, 7, 30, 16];
Undefined 不是 Null
JavaScript 对象、变量、属性和方法可以是未定义的。
此外,空的 JavaScript 对象的值可以为 null
。
这可能会使测试对象是否为空变得有点困难。
您可以通过测试类型是否为 undefined
,测试对象是否存在:
Esempio
if (typeof myObj === "undefined")
Ma non puoi testare se l'oggetto è null
perché se l'oggetto è undefined, verrà lanciato un errore:
Errato:
if (myObj === null)
Per risolvere questo problema, devi testare se l'oggetto è null
invece di undefined.
Ma questo ancora causerebbe un errore:
Errato:
if (myObj !== null && typeof myObj !== "undefined")
Quindi, prima di testare non null, devi testare undefined:
Corretto:
if (typeof myObj !== "undefined" && myObj !== null)
aspetta un contesto di blocco
JavaScript noncrea un nuovo contesto di scope per ogni blocco di codice.
Molti linguaggi di programmazione lo fanno, ma JavaScript Non è così。
pensare che questo codice restituirà undefined
è un errore comune dei nuovi sviluppatori JavaScript:
Esempio
for (var i = 0; i < 10; i++) { // Blocco di codice } return i;
- Pagina precedente Best Practices JS
- Pagina successiva Prestazioni JS