Sembra esserci un'enorme avversione per la creazione di una funzione in JS. Questa avversione fa sì che le persone provino ad essere intelligenti e usano trucchi ridicoli solo per mantenere le cose in una riga come sarebbe stata una chiamata di funzione. Naturalmente il nome della funzione in una chiamata funge anche da documentazione aggiuntiva. Non possiamo allegare un commento a un'espressione complicata perché in tal modo si annullerebbe il punto di farlo, quindi lo chiamiamo semplicemente "idioma" e improvvisamente è comprensibile.
Javascript è estremamente accessibile, la maggior parte delle persone non mangia le specifiche per la colazione come noi. Quindi non capiranno mai quali siano le ipotesi nascoste e i casi limite di un linguaggio.
x = x || 'default_value';
Il joe medio non capirà questo o ha memorizzato che è il linguaggio per valore predefinito. Entrambi sono dannosi, infatti quest'ultimo è ancora più dannoso. Non capirà le ipotesi e i casi limite qui. Non gli interesserà leggere le specifiche e capirle mai.
Quando guardo quel codice che vedere "se è null
o undefined
, quindi impostare a questo valore predefinito. Anche se sarà anche implicitamente il trattamento +0
, -0
, NaN
, false
, e ""
valori come non adatto. Dovrò ricordare che 3 mesi da oggi, quando che i bisogni per cambiare. Probabilmente lo dimenticherò ".
Il presupposto implicito è 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à di tenerli tutti in testa ogni volta che stai pensando a quale modifica avrà effetto. E questo è per "JS pro", il joe medio avrebbe scritto il bug anche se i requisiti dovessero accettare un valore errato per cominciare.
Il tuo nuovo frammento 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 client 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 come || "default"
?
I trucchi intelligenti funzionano sempre con alcune ipotesi nascoste che potrebbero essere ignorate quando il codice è stato inizialmente creato. Non dovrò mai modificare un IIFE in qualcos'altro perché un requisito è cambiato, sarà sempre lì. Forse nel 2020, quando posso usare i moduli attuali, ma sì.
| 0
oppure la versione cargo di culto ~~num
utilizzata per la pavimentazione assume limiti interi positivi e con segno a 32 bit.
|| "default"
presume che tutti i valori di falsità siano gli stessi del non passare affatto un argomento.
E così via.