2014-05-07 8 views
6

Guardando tra la prima riga di codice nel file di JS minimizzato e unminified di Bootstrap, c'è una discrepanza immediata:Perché i minifigure di Javascript convertono da === a ==?

// bootstrap.js 
if (typeof jQuery === 'undefined') { ... } 

vs.

// bootstrap.min.js 
if("undefined"==typeof jQuery)... 

(Guardate voi stessi: bootstrap.js e bootstrap.min.js)

Sono confuso perché questo è permesso. La mia (forse ingenua) comprensione è che === è sempre un guadagno in termini di prestazioni e spesso impedisce risultati inattesi (falsi confronti con 0 o "", ad esempio). Sembrerebbe che i piccoli guadagni in filesize siano persi nelle prestazioni e il potenziale per risultati errati. Qualcuno può far luce qui?

+0

'typeof' restituisce sempre una stringa, quindi' === 'non è necessario. Il minificatore o qualche altro processore su cui è stato eseguito il file avrebbe potuto riconoscerlo. Non c'è alcun potenziale per un risultato errato, e anche se questa linea dovesse funzionare abbastanza spesso da essere un collo di bottiglia, qualsiasi differenza di prestazioni sarebbe JITted away. – user2357112

+0

Tutti rispondono senza comprendere completamente la domanda. – ndugger

+5

@NickDugger che non è vero; la domanda è abbastanza chiara. Il vantaggio prestazionale di '===' è rilevante solo quando gli operandi non sono dello stesso tipo. – Pointy

risposta

5

Nel particolare codice che si sta citando, è sicuro perché i tipi di entrambi gli operandi sono invarianti, ed entrambi sono stringhe. Non è possibile risparmiare sulle prestazioni perché non sarà mai necessario alcun tipo di coercizione. Pensate a == come qualcosa di simile a questo:

function ==(a, b) { // obviously this is fake 
    if (a === b) return true; 
    // type coercion ... 
} 

Inoltre, personalmente penso che si dovrebbe usare === oltre == a causa delle semantiche differenze e non a causa di prestazioni. Micro-ottimizzazioni del genere non sono importanti per la stragrande maggioranza del codice scritto dalla maggior parte delle persone. (E 'un po' ironico nel fatto che il controllo per la presenza di jQuery è stato fatto con un confronto typeof, che è di per sé un discutibile-prezioso micro-ottimizzazione.) oops che era sbagliato :)

+0

Bella risposta! Volevo solo chiarire qualcun altro che potrebbe aver avuto problemi a leggere lo pseudo-codice che '// type coercion' è il _de facto_' else', non una descrizione di cosa sta succedendo sopra. – Impirator

+0

@Imperatore oh sì, buon punto. L'ho scritto così per sottolineare che il lavoro è finito se i valori sono uguali secondo le regole di '===' confronto. – Pointy

0

typeof sarà sempre restituisce una stringa, quindi non è necessario preoccuparsi della conversione del tipo. In definitiva, questo non salva molto nel file o nella sua esecuzione, ma questo è considerato un presupposto sicuro.

Problemi correlati