Ответ 1
Лучшим подходом может быть передача объекта с именованными атрибутами, а затем поиск тех конкретных значений атрибутов. Таким образом, вам не нужно зависеть от количества аргументов.
Я хочу передать значение 'undefined' для функции с несколькими параметрами, но без указания параметра.
Что я имею в виду под "без указания параметра". Я имею в виду, что мы не должны просто опускать parm2
, как в этом примере:
function myFunction (parm1, parm2) {}
myFunction("abc");
Это действительно сделает parm2
undefined, но мне не разрешено делать это таким образом, потому что мне нужно будет указать другие параметры ПОСЛЕ пропущенного параметра.
Итак, в случае, когда я хочу сделать parm1
undefined, но также хочу иметь другие параметры после этого, чтобы сохранить значение, не будет работать с предыдущим методом.
Я пробовал с:
myFunction( ,"abc"); //don't seem to work
И
myFunction(undefined,"abc"); //neither work
Лучшим подходом может быть передача объекта с именованными атрибутами, а затем поиск тех конкретных значений атрибутов. Таким образом, вам не нужно зависеть от количества аргументов.
myFunction(undefined,"abc");
Этот способ должен работать, в чем проблема?
см. здесь
Вот undefined документация из mozilla, поддерживаемая всеми браузерами
Оператор void
кажется наиболее распространенным способом явно получить undefined
.
Вы бы использовали его в следующем примере:
myFunction(void 0, "abc");
Он также является надежным методом сравнения с undefined
, который защищен от undefined
, который случайно переопределяется в более старых средах JavaScript:
var x;
if (x === void 0) {
// this will execute
}
У меня просто появилась идея, и она работает:
var undf;
myFunction(undf, "abc");
Я уверен, что есть лучшие способы, однако я публикую это
Я думаю, что ближе всего вы дойдете до этого, передав null
в качестве параметра. Это не undefined
, но для большинства случаев оно достаточно близко.
Попробуйте использовать этот метод, если вы планируете добавлять неопределенное количество параметров:
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'});
Вы можете использовать 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 );
myFunction(undefined,"abc")
должен полностью работать, если только кто-то жестоко не изменил undefined
! Если вы хотите быть в безопасности, есть десятки способов получить значение undefined, которое позволяет избежать предположения, что вещь, называемая "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 включает это везде, где требуется значение undefined).
Если возможно, вы могли бы изменить функцию как myFunction (parm2, parm1)
т. попробуйте обеспечить, чтобы в параметре были использованы параметры undefined, это может не сработать, если ввести больше параметров.
Простой способ сделать это, когда приемлемо пройти undefined. Но лучше еще ниже: W3C
Пропущенные Javascript аргументы
function myFunction(x, y) {
if (y === undefined) {
y = 0;
}
}
Просто чтобы привести примеры того, что объяснял @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];
}
});
}
}