Как передать значение undefined функции с несколькими параметрами?

Я хочу передать значение undefined для функции с несколькими параметрами, но не пропуская параметр.

Что я имею в виду под "без опускания параметра". Я имею в виду, что мы не должны просто опускать parm2, как в этом примере:

function myFunction (parm1, parm2) {}
myFunction("abc");

Это действительно сделает parm2 undefined, но мне не разрешено делать это таким образом, потому что мне нужно будет указать другие параметры ПОСЛЕ пропущенного параметра, поэтому предыдущий метод не будет работать в случае, если я хочу сделать parm1 undefined, НО также хочу чтобы после этого были другие параметры для хранения значения.

Я попытался решить проблему с помощью:

myFunction( ,"abc"); //doesn't seem to work

Обновление:

и myFunction(undefined, "abc"); «теперь это надежно работает.

Однако стоит отметить, что:

Установка переменной в undefined считается плохой практикой, вместо этого мы должны использовать null.


person ajax333221    schedule 25.01.2012    source источник


Ответы (12)


myFunction(undefined,"abc"); так должно работать, в чем проблема?

см. здесь

Вот неопределенная документация от mozilla, поддерживаемая все браузеры

person xdazz    schedule 25.01.2012
comment
Почему отсутствие возможности записи undefined имеет значение? Это не влияет на передачу его в функцию. - person Ted Bigham; 05.09.2015
comment
@TedBigham, что он не доступен для записи, означает, что он не может быть установлен на значение где-то ранее в коде, что означает (на основе спецификации), что его всегда следует считать неопределенным - person Brian Leishman; 19.04.2016
comment
@BrianLeishman Я согласен, что вы не можете присвоить значение ключевому слову undefined, но это не должно влиять на передачу его в качестве аргумента функции. - person Ted Bigham; 20.04.2016
comment
@TedBigham Я думаю, дело в том, что вы можете использовать его безопасно. Как, например, я мог бы передать kfdjhsdfgsdf функции, потому что она, вероятно, не была определена, но есть вероятность, что она имеет значение и может иметь непредвиденные результаты, если используется с понятием, что она не определена, тогда как undefined не может быть установлен и не должно иметь непредвиденных результатов - person Brian Leishman; 20.04.2016
comment
Установка переменной в undefined считается плохой практикой. Вы должны передать значение null. Дополнительная информация на В чем разница между null и undefined в JavaScript? - person Carlos Morales; 30.09.2016

void operator кажется наиболее распространенным способ явно получить undefined.

В своем примере вы бы использовали это так:

myFunction(void 0, "abc");

Это также надежный метод сравнения с undefined, который защищен от случайного переопределения undefined в старых средах JavaScript:

var x;
if (x === void 0) {
    // this will execute
}
person bkbooth    schedule 04.05.2015

Лучшим подходом может быть передача Object с именованными атрибутами, а затем поиск этих конкретных значений атрибутов. Таким образом, вам не нужно зависеть от количества аргументов.
Пример: Object.dummy

person dbrin    schedule 25.01.2012
comment
+1 за предложение переписать рассматриваемую функцию. - person davidchambers; 25.01.2012
comment
Это неплохое предложение, но было бы немного высокомерно предполагать, что это всегда лучший подход, и на самом деле это не дает ответа на вопрос. - person Flimzy; 06.06.2014
comment
Никто не сказал, что всегда лучше. Я не понимаю, что вы считаете высокомерным в ответе, это просто еще один способ передать параметры, позволяющий избежать проблемы позиционных параметров. - person dbrin; 06.06.2014
comment
К традиционным аргументам функций лучше привыкнуть. - person Tomáš Zato - Reinstate Monica; 23.10.2014
comment
Было бы отличным ответом с небольшим примером того, как это сделать. - person alphapilgrim; 22.12.2015
comment
Это на самом деле гениально, почему я никогда не думал об этом. Моя благодарность @dbrin - person Backer; 20.10.2016
comment
Даже если это хорошее предложение, вы не сможете изменить какую-либо стороннюю функцию, в которой вам нужно передавать параметры в необработанном виде. Думаю, решение @bkbooth следует отметить как правильный ответ. - person Kostanos; 10.01.2017
comment
Наихудшая идея для удобочитаемости - использовать Object.dummy как undefined. - person poletaew; 06.11.2018
comment
@poletaew: Он не хочет использовать Object.dummy как undefined. Он имел в виду использовать необязательный стиль параметров, обернув объект. - person Ayyappa; 29.08.2019

У меня просто возникла идея, и она, кажется, работает:

var undf;

myFunction(undf, "abc");

Я уверен, что есть способы получше, но я публикую это

person ajax333221    schedule 25.01.2012

Вам необходимо обработать вызов функции с неопределенной переменной в самом коде функции одним из следующих способов: -

 function myFunction (parm1, parm2) {

         if (parm1 !== undefined) {
             // execute code if 1st param is undefined
        }

         if (parm2 !== undefined) {
             // execute code if 2 param is undefined
        }

        // execute other part of code

    }

Теперь вы можете вызвать указанную выше функцию следующими способами: -

myFunction(undefined,"abc"); // with 1st param value not known

myFunction("cde",undefined); // with 2nd param value not known

myFunction("cde","abc");  // with both param value known
person Nipun Madan    schedule 24.04.2018

Я думаю, что ближе всего к этому вы сможете передать null в качестве параметра. Это не undefined, но для большинства случаев достаточно близко.

person Niet the Dark Absol    schedule 25.01.2012
comment
typeof null == "object", что вводит в заблуждение. - person Tomáš Zato - Reinstate Monica; 23.10.2014
comment
@ TomášZato null === null, что совершенно не вводит в заблуждение - person Braden Best; 17.06.2017
comment
@BradenBest Я думаю, что Томаш Зато сказал, что теперь необходимо выполнить еще одну условную проверку, а не просто полагаться на typeof. Лично меня это раздражает. - person Dejay Clayton; 08.03.2018

Попробуйте использовать этот метод, если вы планируете добавлять неопределенное количество параметров:

function myFunc(params) {
    // Define default values
    var name = 'John';
    var age = '40';
    // You can loop through them
    for (var p in params) {
        alert(p + ':' + params[p]);
    }
    // And read them in like this
    if (typeof params.name != 'undefined') {
        name = params.name;
    }
    if (typeof params.age != 'undefined') {
        age = params.age;
    }
    alert(name + ' ' + age);
}

alert('test1');
myFunc({name:'Bob', age:'30'});
alert('test2');
myFunc({name:'Bob'});
person Aram Kocharyan    schedule 25.01.2012

Если возможно, не могли бы вы изменить функцию как myFunction (parm2, parm1)

т.е. постарайтесь, чтобы возможные неопределенные параметры были последними в функции, это может не сработать, если будут введены другие параметры.

person Tomy Varghese    schedule 04.07.2014

Вы можете использовать apply и массив параметров для передачи "undefined" в качестве одного из параметров. Например, вы хотели передать parm1 как «undefined»:

function myFunction (parm1, parm2) {

    if(typeof (parm1) === "undefined"){
        alert("parm1 is undefined")
    }

    if(typeof (parm2) === "undefined"){
        alert("parm2 is undefined")
    }

}

var myParameters = [undefined, "abc"];

myFunction.apply(valueForThis, myParameters );
person Edward Olamisan    schedule 19.08.2015

myFunction(undefined,"abc") должно работать, если только кто-то жестокий не пересмотрел undefined! Если вы хотите быть в безопасности, есть десятки способов получить неопределенное значение, которые позволяют избежать предположения, что вещь под названием «undefined» на самом деле имеет специальное неопределенное значение:

void 0
var undef; undef
[][0]
{}.foo
// `undef` is guaranteed to have the undefined value within this closure
(function(undef){ undef }())
// this expression evaluates as undefined
(function(){}())

void 0 является наиболее широко используемым (скомпилированный CoffeeScript включает его везде, где требуется неопределенное значение).

person davidchambers    schedule 25.01.2012
comment
Это полезно знать, хотя мы будем поддерживать старые движки JavaScript в течение некоторого времени. - person davidchambers; 04.02.2012
comment
Поздний комментарий, но для других, читающих это: запрет на запись не имеет абсолютно ничего общего с возможностью передать undefined непосредственно функции. Хотя undefined определенно недоступен для записи, это не имеет отношения к этому вопросу. - person michael; 08.04.2016

Легкий способ сделать это, когда это приемлемо, - передать undefined. Но еще лучше, как указано в W3C

Аргументы без Javascript

function myFunction(x, y) {
if (y === undefined) {
      y = 0;
    } 
}
person alphapilgrim    schedule 21.12.2015

Просто чтобы привести примеры того, что объясняет @dbrin, и @alphapilgrim, возможно, захотел бы проверить.

simpleFunction({params1:12, params2:"abc"}); //use expected arguments
simpleFunction({params2:"abc"}); //use only one
simpleFunction({params2:"abc", params1:12, iDoNotExist:"I will not be included"}); //use expected arguments in any order
simpleFunction(); //ignore arguments and uses defaults
simpleFunction(2123); //ignores non object arguments 

function simpleFunction(someParams){
  var myParams = {
    params1:null,
    params2:"cde" //default value for second parameter
  };
  simpleExtend(myParams, someParams);
  
  console.log(myParams);

}


//to include in your utilities
function simpleExtend(currentParams, newParams){
  
  if(typeof currentParams !== "undefined" && typeof newParams !== "undefined"){
    Object.keys(newParams).forEach(function(key){
   
      if(typeof currentParams[key] !== "undefined"){
        currentParams[key] = newParams[key];    
      }

    });
 
  
  }
  
 

}

person MFAL    schedule 24.11.2016