Sembra esserci un'enorme avversione per la creazione di una funzione in JS. Questa avversione
fa sì che le persone cerchino di essere intelligenti e usino trucchi ridicoli solo per mantenere
roba in una riga come sarebbe stata una chiamata di funzione. Ovviamente la funzione
il nome in una chiamata funge anche da documentazione aggiuntiva. Non possiamo allegare un commento
a un'espressione ingannevole perché poi avrebbe vanificato il punto di farlo
quindi lo chiamiamo "js idiom" e all'improvviso è comprensibile.
Javascript è estremamente accessibile, la maggior parte delle persone non mangia le specifiche per colazione come
noi facciamo. Quindi non capiranno mai quali sono le ipotesi nascoste e i casi limite
di un idioma è.
x = x || 'default_value';
Il joe medio non lo capirà o ha memorizzato che è l'idioma per il valore predefinito. Entrambi sono dannosi, infatti il secondo è ancora più dannoso. lui
non capirò le ipotesi e i casi limite qui. Non gli interesserà leggere le specifiche
e capirlo sempre.
Quando guardo quel codice vedo "se è null
o undefined
, quindi impostalo su questo valore predefinito.
tratterà implicitamente anche +0
, -0
, NaN
, false
e ""
come valori non adatti. dovrò
ricordati che 3 mesi da ora in poi che deve cambiare. Probabilmente lo dimenticherò. "
L'ipotesi implicita è estremamente probabile che causi un bug in futuro e quando la tua base di codice è piena di trucchi come
questo allora non c'è alcuna possibilità che tu li tenga tutti nella tua testa ogni volta che stai pensando a cosa
una modifica interesserà. E questo è per il "JS pro", il joe medio avrebbe scritto
il bug anche se i requisiti dovessero accettare un valore falsato all'inizio.
Il tuo nuovo snippet ha una sintassi più familiare ma presenta ancora il problema sopra riportato.
Puoi andare con:
function f(x) {
x = valueOrDefault(x, "default_value");
}
Ora puoi avere una logica molto complessa per gestire i casi limite e il codice cliente sembra ancora bello e leggibile.
Ora, come si fa a distinguere tra funzionalità linguistiche avanzate come passare una funzione come argomento o un trucco intelligente
mi piace || "default"
?
I trucchi intelligenti funzionano sempre sotto alcune ipotesi nascoste che potrebbero essere ignorate quando il codice è stato inizialmente creato. Lo farò
non devo mai modificare un IIFE in qualcos'altro perché un requisito è cambiato, sarà sempre lì. Forse nel 2020, quando posso usare
moduli reali ma sì.
| 0
o la versione di culto cargo ~~num
utilizzata per pavimentazione presuppone limiti di interi con segno positivo e 32 bit.
|| "default"
presuppone che tutti i valori di falsy siano gli stessi di non passare affatto un argomento.
E così via.