Why is this not done by default?
Per qualche ragione, non è stato fatto nelle prime versioni della lingua che ora conosciamo come Javascript. Sfortunatamente, cambiandolo ora si rompono tonnellate di codice esistente, quindi siamo bloccati con esso.
Perché non rendere questo un "errore di attivazione" come una modalità rigorosa? Probabilmente perché la modalità rigorosa si concentra su un piccolo insieme di tipi di errori più insidiosi causati da difetti di progettazione di Javascript, come x = 2
che crea implicitamente proprietà sull'oggetto globale. I bug relativi ai vararg sono fastidiosi, ma non sono mai stati vicini alla parte più fastidiosa della lingua.
Anche perché è molto difficile da implementare. Poiché le funzioni sono valori di prima classe, non c'è nulla che ti impedisca di sostituire una funzione a due argomenti con una funzione a tre argomenti in fase di esecuzione. Se volessimo che il linguaggio imponga il conteggio degli argomenti corretto in tutti i siti di chiamata, dovrebbe iniziare ogni chiamata di funzione in avvio chiedendo alla funzione quanti argomenti attualmente richiede. È probabile che si tratti di un problema di prestazioni e non ti proteggerà da tutto ciò di cui non puoi già proteggerti.
Perché è stato così nei primi tempi? Nessuna idea. Se dovessi indovinare, direi perché questo riduce il numero di cose di cui l'interprete deve tenere traccia.
Is there any use of default varags (in comparison to explicitly stating that a function takes a variable number of arguments)?
Anche "varargs predefiniti" lo sta sottovalutando. Tutte le funzioni sono variadiche, non importa quale. Non puoi nemmeno rinunciarvi. Puoi scegliere di lanciare un errore in fase di esecuzione se non ti piacciono gli argomenti con i quali sei stato chiamato.
Poiché molto meno del 100% delle funzioni del mondo reale richiedono un numero variabile di argomenti, è sicuramente una disfunzione.
Would it make sense to implement this in common libraries so that less users shoot themselves in the foot?
Se ti stai chiedendo se la tua libreria di affermazione debba far valere il conteggio dei suoi argomenti, ciò dipende da molte cose. Ma ce n'è uno in particolare che credo valga nel tuo esempio: assert.ok () potrebbe anche cogliere quell'errore controllando i tipi di argomenti che si aspetta di ottenere (cioè, il secondo argomento dovrebbe essere una stringa), e che probabilmente porterebbe comunque a un messaggio di errore migliore.
In genere preferirei concentrarmi sulla convalida degli argomenti che ti aspetti di ottenere. Anche il controllo esplicito del numero di argomenti non danneggerà, ma sicuramente non è necessario e probabilmente non è mai la priorità assoluta. Se hai diversi argomenti dello stesso tipo o potenzialmente qualsiasi tipo in una riga, in modo tale che i tipi di controllo da soli non lo rilevino, che in genere indica un'API mal progettata piuttosto che una necessità di controllo del conteggio degli argomenti.