2015-09-03 12 views
7

In un libro che sto leggendo (JavaScript & JQuery - Interactive Front End di sviluppo da Jon Duckett) c'è un errore interessante o (almeno io la penso così), che non si ferma il codice di lavoro:var i = [0] in un ciclo for, quindi incrementato i ++ - perché funziona?

for (var i = [0]; i < options.length; i++) {   
    addEvent(options[i], 'click', radioChanged);  
} 

Questa è una parte dello script che scorre in tutti i pulsanti di opzione in un modulo e allega un listener di eventi (non importa ciò che fa).

Ma ...

  1. Perché i inizializzati come un array a tutti?

  2. Perché l'incremento funziona?

  3. Perché l'intero ciclo funziona?

Ovviamente se si sostituisce var i = [0] con var i = 0 il codice funziona ancora.

Quando si aggiungono alcuni avvisi per controllare il valore di i in ogni iterazione del ciclo e il tipo di i, al secondo tipo di iterazione di i cambia da oggetto (dopotutto nella prima iterazione è un array) a numero. Questa è una specie di conversione di tipo implicita che non ho mai incontrato finora (e Google non aiuta molto). Qualcuno può spiegare cosa sta succedendo sotto il cofano?

for (var i = [0]; i < options.length; i++) {   
    addEvent(options[i], 'click', radioChanged); 
    alert(i); // --> 1 2 3 ... 
    alert(type of i); // --> object number number ... 
} 

risposta

8

Le specifiche says (§ 11.3.1) che l'operatore ++ converte l'operando ad un numero prima incrementale:

  1. Let oldValue tramite ToNumber (GetValue (lhs)).

Quando chiamato su un oggetto, il funzionamento interno GetValue chiamerà toString(), che, per una matrice, si unirà suoi elementi, tornando '0'.

+0

ok, grazie :) quindi immagino sia una specie di piccolo bug ma non un 'errore' ... – Tadek

+0

@Tadek: È più di una caratteristica confusa. La specifica dice questo in modo che l'incremento di "1" risulterebbe in "2" piuttosto che "11". – SLaks

Problemi correlati