2016-12-04 6 views
0

Нужно ли передавать null в качестве аргумента для необязательных параметров?Нужно ли передавать null в качестве аргумента для необязательных параметров в функции/методы Javascript?

Для примера я включил код из документации Mongoose:

Model.find(conditions, [projection], [options], [callback]) 

// Example use 
// passing options and executing immediately 
MyModel.find({ name: /john/i }, null, { skip: 10 }, function (err, docs) {}); 

Я успешно используя этот метод и другие подобные методы без прохождения нуля в качестве второго аргумента, но я хотел бы, если это знать приведет меня в беду по дороге?

Я нашел некоторые связанные вопросы, но они, похоже, не являются специфическими для дополнительных параметров. Любое понимание очень ценится.

ответ

2

Это зависит от того, как написана функция.

Возьмем эту функцию, например:

function repeat(value, times) { 
 
    if (arguments.length === 0) { 
 
    value = "Hello!"; 
 
    times = 2; 
 
    } else if (arguments.length === 1) { 
 
    if (typeof value === "number") { 
 
     times = value; 
 
     value = "Hello!"; 
 
    } else { 
 
     times = 2; 
 
    } 
 
    } 
 
    var output = ""; 
 
    for (var i = 0; i < times; i++) { 
 
    output += value + " "; 
 
    } 
 
    return output; 
 
} 
 

 
console.log(repeat()); 
 
console.log(repeat("Yo!")); 
 
console.log(repeat(5)); 
 
console.log(repeat("Yo Yo!", 3));

Аргументы он ожидает достаточно различны (в этом случае, если один является строка и один ряд), что он может проверить, чтобы увидеть если «первый» аргумент опущен, даже если предоставляется «второй» аргумент.


Документация вы предоставили говорит:

Model.find(conditions, [projection], [options], [callback]) 

Каждый из трех последних аргументов показан как независимо друг от друга необязательно, что говорит о том, что вы можете пропустить какой-либо из них и до сих пор поставляют те которые следуют.

Сравнить с the MDN documentation for JSON.stringify:

JSON.stringify(value[, replacer[, space]]) 

Третий аргумент имеет [] вокруг него, чтобы указать, что не является обязательным, но это внутри[]вокруг второго аргумента. Это означает, что вы можете указать третий аргумент, только если предоставлен второй аргумент.

+0

Это именно то, что я искал. – Cheesus

+0

Добавляя к вашему ответу, в ES6 вы можете использовать деструктурирование, чтобы избежать вызова 'arguments' и сделать код немного чище. – GMaiolo

+0

Оказывается, что не пропускать null в качестве аргумента проектирования, вызвавшего мой сервер, потому что объект моих опций интерпретировался как проекция, поэтому я не уверен, что думать. – Cheesus

-1

Вы можете использовать конструктор запросов

Model 
      .find({ name: /john/i }) 
      .skip(10) 
      .exec(callback) 
+0

Я ценю обратную связь, и я знаю, что могу использовать конструктор запросов, но мой вопрос больше о должен ли я или нет указать нулевое значение, если я опуская один необязательный параметр, который предшествует другому необязательному параметру, который я использую. – Cheesus

0

Ответ Квентина правильный, я просто хочу добавить, что в ES6 вы можете избежать этого на destructuring parameters.

Я дам вам пример:

let str= "Something"; 
let num = 10; 

doSomething({ str, num }); 

function doSomething({ somethingElse, num, str }) { 
    /* the argument gets passed like 
    { 
     somethingElse: somethingElse, 
     num: num, 
     str: str 
    } 
    and if any value is missing then it is null, so you can check for 
    each property's existance easily 
    */ 
} 
+0

Я только недавно узнал о деструкции, но еще не заметил его практического использования. Спасибо за пример. – Cheesus

+0

На самом деле, использование, о котором вы просили, является его точным практическим использованием, это самый чистый способ избежать необходимости выполнять 'foo (null, null, null, null, null," finallySomeValue ")' (хотя я бы любовь к JS, чтобы иметь перегрузку, деструктурирование довольно приятно иметь). Вы должны дать ES6 попробовать, так как у него есть много из этих мелочей, которые пригодились время от времени. – GMaiolo