Forse non tutti conoscono il test proposto dal servizio meebo, un portale capace di collegarci in qualunque momento al nostro Instant Messaging preferito.
Ne ha parlato Dustin Diaz in un post qualche giorno fa, descrivendo la sua impressione riguardo la giornata trascorsa in meebo e sempre Dustin ha postato il link alla pagina del JavaScript Ninja test.
Appena ho visto quel test avrei voluto pubblicare sul mio blog personale un approfondimento riguardo quelle ambigue, incomplete o imprecise domande… ma ripensandoci forse non sono state scritte a caso, forse la loro natura è appositamente inconsistente, del resto un ninja è solito colpire scavalcando ostacoli più o meno complessi, come tirarsi indietro da quel questionario?
Ci ha pensato kentaromiura tramite un post del suo kenta blog, descrivendo bene i punti in questione e i problemi che presentano come stesse domande.
Ho replicato io, con il link alla pagina inviata a meebo ormai 1 mese fa, non manca che tradurre e descrivere le risposte per tutti i curiosi che conoscono poco l’inglese.
- Quando div.setAttribute(“###”) non è uguale a div.###?
Cristian giustamente fa notare che setAttribute vuole un secondo parametro mentre io ho interpretato in altro modo: setAttribute modifica il DOM mentre un assegnazione diretta modifica un oggetto generico. Essendo ogni istanza dinamica è sempre possibile aggiungere un metodo o parametro a un oggetto, mentre essendo div un elemento è possibile sapere come sia stato rappresentato nel client tramite getAttribute e cambiare valori tramite setAttribute.
Alcuni potrebbero pensare al caso class, dove setAttribute non funziona sul browser Explorer e si è costretti a sfruttare il parametro className, il succo è che sono sempre diversi! - Quale è la differenz tra var x = 3 e x = 3?
Anche questa domanda è ambigua poiché nello scope globale in entrambi i casi si assegna al super oggetto window un parametro di nome x con contenuto uguale a 3. E’ un errore invece comune non usare la parola chiave var all’interno di cicli for, funzioni o codice innestato, poiché per ogni var mancato si creerà una variabile globale, più lenta e meno affidabile (se due funzioni usano una variabile i globale potrebbero comportarsi in modo inaspettato). - Quale è la differenza tra !!(obj1 && obj2) e (obj1 && obj2)?
Lasciati così, scritti come pezzo di codice a se, nessuna… non fanno niente, al limite daranno errore se obj1 oppure obj2 non sono definiti.
In assegnazione invece sono ben diversi, il primo caso assegna un booleano mentre il secondo caso assegna il primo valore false dell’espressione, inteso come 0, stringa vuota, null o booleano false stesso. - Scrivi una sola linea di codice JavaScript capace di concatenare tutte le stringhe passate alla funzione.
Anche qui, cercano un Ninja, ma sprecano preziosi byte inizializzando una variabile.
Le soluzioni sono diverse, a seconda di come viene interpretato il quesito, anche in questo caso imperfetto. La mia è la più semplice, quick and dirty, come piace agli sviluppatori pigri.
function concatenate(){return "".concat.apply("",arguments)};
sfrutta il metodo di stringa concat per ogni parametro passato alla funzione mentre quella di kentaromiura è un pò più articolata.
In alternativa, dato che si richiede che la funzione concateni solo stringhe, ho scritto anche questa variante, capace di filtrare gli argomenti al fine di scartare tutti quelli che non hanno costruttore di tipo String:
function concatenate(){return [].slice.call(arguments).filter(function(v){return v.constructor===String}).join("")};
- Cosa hanno in comune questi due esempi?
Gli esempi mostrati al quinto punto hanno in comune la peculiarità di non fare assolutamente niente.
Nel primo caso si assegna un parametro inutile a un oggetto, dove il contenuto di tale parametro è l’oggetto stesso, in questo caso un elemento della pagina, se presente, preso due volte in modo quindi ridondante.
Nel secondo caso non accade niente lo stesso, l’elemento creato non viene né restituito né appeso al DOM ergo rimarrà in memoria fino alla fine della funzione per poi essere dimenticato dal codice.
Alla luce di tutto questo spero mi sia concesso dire che di ninja, questi quesiti, hanno ben poco.
Mal pensati, mal presentati e soprattutto presentano codice di tutti i giorni.
C’è da dire però che sono domande molto simili a quelle che avreste potuto trovare al V.U.E., ente di certificazione internazionale e ufficiale di Microsoft, Adobe, Zend e altri ancora, test di certificazione che richiedono esperienza ma soprattutto molta attenzione poiché appositamente ingannevoli.
Non sarete né i primi, né gli ultimi, che dopo aver percorso mentalmente un intero pezzo di codice e aver dato la risposta esatta, verrete penalizzati per la stessa a causa di una virgola mancata ma di certo, dopo aver risolto più o meno bene un test di questo tipo, la definizione ninja non sarà la più appropriata, di stranezze, caratteristiche e particolarità ne è pieno ogni linguaggio e la padronanza al 100% non è traguardo facile da raggiungere.
Chi ha quesiti più interessanti e più ninja oriented riguardo il JavaScript, si faccia avanti, per ora spero solo di aver aiutato i meno esperti a capire meglio quel questionario :)