2011-12-02 15 views
32

Czy możesz wskazać mi dobry sposób na pominięcie opcjonalnych parametrów w JavaScript.Pomijanie opcjonalnych parametrów funkcji w JavaScript

Na przykład, chcę wyrzucić wszystkie parametry opt_ tutaj:

goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content, {'Cache-Control': 'no-cache'}, opt_timeoutInterval) 

Odpowiedz

69

Rozwiązanie:

goog.net.XhrIo.send(url, undefined, undefined, undefined, {'Cache-Control': 'no-cache'}) 

Należy użyć undefined zamiast opcjonalny parametr, który chcesz pominąć, bo to 100% symuluje wartość domyślną dla opcjonalnych parametrów w JavaScripcie.

Mały przykład:

myfunc(param); 

//is equivalent to 

myfunc(param, undefined, undefined, undefined); 

zalecenie silne: używać JSON, jeśli masz dużo parametrów, i można mieć parametry opcjonalne w środku listy parametrów. Zobacz, jak to się robi w jQuery.

+1

+1. Nie wiem, co to dokładnie robi (tak samo jak 'undefined'?), Ale z pewnością wygląda najlepiej dla" pomijania opcjonalnych parametrów ". – Thilo

+0

Zauważyłem, że nigdy nie możesz być pewien, co przekazać zamiast "pominięty" parametr. Niezdefiniowany? Zero? 0? Pusta struna? Pusty obiekt? Szyk? ** Jeśli zachowanie pominięcia parametru nie zostało zapisane lub nie ma domyślnego parametru, masz duże problemy **. Nie możesz spać dobrze, jeśli zaktualizujesz bibliotekę zewnętrzną. Tylko bóg, a może twórca biblioteki, może wiedzieć, co się stanie, jeśli przekażesz coś nieoczekiwanego zamiast wymaganego parametru. Ogólnie, jeśli to zachowanie nie jest udokumentowane, błędy są na ciebie – Dan

+0

To nadal działa w 2017 roku na najnowszej wersji Google Chrome, więc pracuję nad zmianą. – Anonymous

6

Wystarczy przejść null jako wartość parametru.

Dodano: można również pominąć wszystkie konsekwentnych opcjonalne parametry po ostatnim, który chcesz przekazać prawdziwą wartość (w tym przypadku można pominąć opt_timeoutInterval parametr w ogóle)

+2

Czy jesteś pewien, że w środku nie ma sprawdzenia '=== undefined'? – Dan

+0

@Dan, sformułowałeś swoje pytanie jako ogólne pytanie JavaScript z tym kodem jako przykładem. Jeśli potrzebujesz konkretnej pomocy dotyczącej działania 'goog.net.XhrIo.send()', proszę ponownie sformułować pytanie. – nnnnnn

+0

Dziękuję bardzo @nnnnnn, ale to naprawdę * ogólne * JavaScript pytanie, a odpowiedź powinna działać w * każdym * przypadku. Jeśli nie ma ogólnego rozwiązania, opublikuj je w swojej odpowiedzi. – Dan

1

Co masz na myśli przez pominąć? Możesz przekazać null i możesz całkowicie pominąć końcowe parametry (w tym przypadku opt_timeoutInterval), ale musisz upewnić się, że parametr Cache-Control staje się piąty.

goog.net.XhrIo.send(url, null, null, null, {'Cache-Control': 'no-cache'}); 

Jeśli nie potrzebujemy Cache-Control:

goog.net.XhrIo.send(url); 

innych parametrów API przyjąć jako hash aby opcjonalne parametry łatwiej (i wiele parametrów nazwanych stąd samodokumentujące), ale gdzie pozycyjna parametry są oczekiwane, musisz iść z tym.

+0

Pomijam mam na myśli to, że jest puste.Może tutaj mamy zły projekt interfejsu. Masz całkowitą rację co do parametru końcowego. Wiem też: 1) funkcja zadziała bez drugiego, trzeciego i czwartego parametru. 2) wartością domyślną dla trzeciego parametru jest "GET". Tak wiele słów tutaj ... Myślę, że to jest zły projekt funkcji, więc zatrzymajmy się – Dan

+0

JSON powinien być tutaj użyty jako sposób przekazywania parametrów – Dan

21

Krótka odpowiedź

Najbezpieczniejszym zakład jest undefined, i powinien pracować prawie wszędzie. Ostatecznie jednak nie możesz oszukać wywoływanej funkcji w myśleniu, że naprawdę pominąłeś parametr.

Jeśli znajdziesz się skłonność do korzystania null tylko dlatego, że jest krótszy, należy rozważyć deklarując zmienną o nazwie _ jako miły skrót dla undefined:

(function() { // First line of every script file 
    "use strict"; 
    var _ = undefined; // For shorthand 
    // ... 
    aFunction(a, _, c); 
    // ... 
})(); // Last line of every script 

Szczegóły

pierwsze, wiesz, że:

  • typeof undefined ocenia na "undefined"
  • typeof null ocenia się "object"

Więc załóżmy, że funkcja przyjmuje argument, że oczekuje się od typu "number". Jeśli podasz wartość null, nadasz jej wartość "object". Semantyka jest wyłączona.

Jak deweloperzy nadal pisać coraz bardziej solidne kodu JavaScript, istnieje coraz większa szansa, że ​​funkcje wywołać jawnie sprawdzić wartość parametru dla undefined w przeciwieństwie do klasycznej if (aParam) {...}. Będziesz na niepewnym gruncie, jeśli będziesz nadal używać null zamiennie z undefined tylko dlatego, że oboje wymuszają na false.

Należy pamiętać jednak, że w rzeczywistości jest to możliwe dla funkcji, aby stwierdzić, czy parametr został właściwie pominięte (versus jest ustawiony na undefined):

f(undefined); // Second param omitted 
function f(a, b) { 
    // Both a and b will evaluate to undefined when used in an expression 
    console.log(a); // undefined 
    console.log(b); // undefined 
    // But... 
    console.log("0" in arguments); // true 
    console.log("1" in arguments); // false 
} 

Przypisy

  1. Podczas gdy undefined również nie jest typu "number", zadaniem jest być typem, który nie jest typem. Dlatego jest to wartość przyjęta przez niezainicjowane zmienne i domyślna wartość zwracana dla funkcji.
Powiązane problemy