Dichiarazione di una funzione senza parametri denominati che accetta almeno 1 argomento

1

Dire che ho una funzione il cui primo parametro viene utilizzato in modo diverso a seconda di quanti argomenti vengono passati. In questo caso, è più semplice elaborare l'oggetto arguments nel suo insieme all'interno della definizione della funzione invece di dare al parametro un nome esplicito da trattare che potrebbe essere semanticamente non corretto a seconda di quanti argomenti ci sono, e quindi dover correggilo dopo il fatto. Tuttavia, dopo aver definito la funzione, desidero la sua proprietà length per indicare che richiede almeno un argomento.

Un punto nel caso la seguente funzione:

function validateSlice() {
  const range = [...arguments].map(Number)

  if (range.length < 1 || 3 < range.length) {
    throw new TypeError('expected between 1 and 3 arguments')
  }

  if (range.some(isNaN)) {
    throw new TypeError('arguments must be numeric')
  }

  switch (range.length) {
  case 1: return [0, ...range, 1]
  case 2: return [...range, 1]
  case 3:
    if (range[2] === 0) {
      throw new RangeError('slice step cannot be zero')
    }

    return range
  }
}

Si suppone che restituisca un array di length === 3 contenente [start, stop, step] , ma il primo argomento potrebbe essere stop o start a seconda di quanti argomenti vengono passati.

La mia preoccupazione è che il controllo di validateSlice.length restituisca 0 poiché nella definizione non ci sono parametri con nome, ma questo è semanticamente scorretto. Nella convenzione JavaScript, questa proprietà indica la quantità minima di argomenti richiesti per la funzione. Tuttavia, è complicato dover fare qualcosa del genere:

Object.defineProperty(validateSlice, 'length', { configurable: true, value: 1 })

E fornire un parametro denominato inutilizzato sembra superfluo o addirittura fuorviante per la manutenzione (e alcune condizioni di sfilacciamento), e per il motivo sopra riportato, dato che il suo utilizzo dipende dalla quantità di argomenti passati.

Come si risolve normalmente questo problema?

    
posta Patrick Roberts 09.07.2017 - 23:53
fonte

2 risposte

1

Supponendo una funzione che può essere chiamata come

function (arg1, arg2, arg3)

o

function (arg1, arg3)

Il mio approccio a è seguito

function(arg1, arg2, arg3){
  if(arg3 === undefined){
    let arg3 = arg2;
  }

  // continue logic
}
    
risposta data 30.06.2018 - 01:43
fonte
1

Utilizza la parola chiave arguments per ottenere tutti gli argomenti in un singolo oggetto.

Quindi definisci un singolo argomento obbligatorio e utilizza i parametri di riposo (preceduti da ... ) per gli argomenti facoltativi.

All'interno del tuo codice, puoi ignorare required , poiché sarà uguale a arguments[0] .

function ( required, ...optional )
{
    alert("A total of " + arguments.length + " arguments were passed.");
    alert("Of those, " + optional.length + " were optional arguments.");
    
risposta data 30.06.2018 - 02:10
fonte

Leggi altre domande sui tag