Начиная с ES6 / ES2015 , параметры по умолчанию указаны в спецификации языка.
function read_file(file, delete_after = false) {
// Code
}
просто работает.
Ссылка: Параметры по умолчанию - MDN
Параметры функции по умолчанию позволяют формальным параметрам инициализироваться значениями по умолчанию, если не передано значение или неопределенное значение .
Вы также можете смоделировать именованные параметры по умолчанию с помощью деструктурирования :
// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
// Use the variables `start`, `end` and `step` here
···
}
До ES2015 ,
Есть много способов, но это мой предпочтительный метод - он позволяет вам передавать все, что вы захотите, включая false или null. ( typeof null == "object"
)
function foo(a, b) {
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }
и затем вы можете назвать это какa = defaultFor(a, 42);
undefined
объектов: p Даже если он может работать с некоторыми браузерами и может работать быстрее,null
он все еще является объектом иundefined
является ссылкой на примитивный тип, который пытается сказать, что существует здесь ничего нет, даже нетnull
. Смотрите здесь, оба случая в двух словах: JavaScript / Reference / Global_Objects / undefined .typeof
это избыточно.function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }
Это не приведет к ошибкам ссылки и является кратким.a = a
иb = b
когда эти параметры не являются неопределенными. Кроме того, этот троичный оператор с немного сложным условием может быть трудно читать для будущих сопровождающих. Я бы предпочел следующий синтаксис:if (typeof a == 'undefined') a = 42
- нет ненужных назначений, плюс немного легче для чтения.typeof
? Казалось бы, проще сделатьa === undefined
. Кроме того, в этом случае вы получите ошибку ссылки, если ошибетесь,undefined
а не поместите ее в строку.Это присваивает
delete_after
значение,delete_after
если оно не является значением Falsey, в противном случае оно присваивает строку"my default here"
. Для более подробной информации, ознакомьтесь с обзором языка Дуга Крокфорда и ознакомьтесь с разделом «Операторы» .Такой подход не работает , если вы хотите передать в falsey значение т
false
,null
,undefined
,0
или""
. Если вы хотите, чтобы значения Falsey были переданы, вам нужно будет использовать метод в ответе Тома Риттера .При работе с несколькими параметрами функции часто бывает полезно разрешить потребителю передавать аргументы параметра в объекте, а затем объединять эти значения с объектом, который содержит значения по умолчанию для функции.
использовать
источник
delete_after
не получается логический результат выраженияdelete_after || "my default value"
?Я нахожу что-то простое, как это, чтобы быть намного более кратким и читаемым лично.
источник
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
. Использование глобального пространства имен, как показано в этом ответе, многими считается плохой практикой. Вы также можете рассмотреть возможность использования собственной утилиты для этой общей задачи (напримерutil.default(arg, "defaul value")
), если вы не хотите использовать подчеркивание, но я в большинстве случаев заканчиваю тем, что рано или поздно использую подчеркивание, так или иначе, нет смысла заново изобретать колесо.undefined
другим значением, что привело к сбою теста.undefined
. Так что это все еще хорошая идея для использованияtypeof
и'undefined'
.В ECMAScript 6 вы действительно сможете написать именно то, что у вас есть:
Это позволит установить ,
delete_after
чтобы ,false
если он с нет илиundefined
. Подобные функции ES6 вы можете использовать сегодня с такими транспортерами, как Babel .См. Статью MDN для получения дополнительной информации .
источник
Значения параметров по умолчанию
С ES6 вы можете сделать, пожалуй, одну из наиболее распространенных идиом,
JavaScript
связанных с установкой значения по умолчанию для параметра функции. То, как мы делали это годами, должно выглядеть довольно знакомо:Этот шаблон наиболее часто используется, но он опасен, когда мы передаем такие значения, как
Почему? Потому что
0 is falsy
, и, следовательноx || 11 results in 11
, непосредственно не передано в 0. Чтобы исправить эту ошибку, некоторые люди вместо этого напишут проверку более подробно так:Теперь мы можем рассмотреть хороший полезный синтаксис, добавленный
ES6
с момента, чтобы упростить назначение значений по умолчанию отсутствующим аргументам:x = 11
в объявлении функции больше похожеx !== undefined ? x : 11
на гораздо более распространенную идиомуx || 11
Выражения значений по умолчанию
Function
значения по умолчанию могут быть не просто простыми значениями, такими как 31; они могут быть любым допустимым выражением, дажеfunction call
:Как вы можете видеть, выражения значений по умолчанию лениво оцениваются, то есть они запускаются только в том случае, когда они необходимы, то есть когда аргумент параметра опущен или не определен.
Выражением значения по умолчанию может быть даже вызов встроенного выражения функции, обычно называемый выражением немедленного вызова функции
(IIFE)
:источник
это решение работает для меня в JS:
источник
delete_after
есть0
илиnull
? Это не будет работать правильно для этих случаев.delete_after = delete_after === undefined ? false : delete_after
?Просто используйте явное сравнение с неопределенным.
источник
Я настоятельно рекомендую соблюдать крайнюю осторожность при использовании значений параметров по умолчанию в javascript. Это часто создает ошибки при использовании в сочетании с функций высшего порядка , таких как
forEach
,map
иreduce
. Например, рассмотрим эту строку кода:У parseInt есть необязательный второй параметр
function parseInt(s, [
radix,=10])
но вызовы mapparseInt
с тремя аргументами: ( element , index и array ).Я предлагаю вам отделить необходимые параметры от необязательных / значений по умолчанию. Если ваша функция принимает 1,2 или 3 обязательных параметра, для которых значение по умолчанию не имеет смысла, сделайте их позиционными параметрами для функции, любые необязательные параметры должны следовать как именованные атрибуты одного объекта. Если вашей функции требуется 4 или более, возможно, имеет смысл предоставить все аргументы через атрибуты одного параметра объекта.
В вашем случае я бы предложил написать функцию deleteFile следующим образом: ( отредактировано в соответствии
instead
с комментариями ) ...Запуск приведенного выше фрагмента иллюстрирует опасности, скрывающиеся за значениями аргументов по умолчанию для неиспользуемых параметров.
источник
typeof deleteAfter === 'bool'
и бросить исключение в противном случае. Плюс в случае использования таких методов, как map / foreach и т. Д., Просто используйте их с осторожностью и оберните вызываемые функции анонимной функцией.['1', '2', '3'].map((value) => {read_file(value);})
get
метод Лодаша для получения deleteAfter. Бросок исключения, еслиtypeof 'deleteAfter' !== 'bool'
это также может быть хорошей разумной мерой. Мне не нравится разрабатывать методы, которые требуют от вызывающего абонента "проявлять осторожность". Ответственность лежит на функции, а не на вызывающем абоненте. Конечное поведение должно следовать принципу наименьшего удивления.В качестве обновления ... с ECMAScript 6 вы можете НАКОНЕЦ установить значения по умолчанию в объявлениях параметров функции следующим образом:
На что ссылается - http://es6-features.org/#DefaultParameterValues
источник
Будучи долгое время разработчиком C ++ (новичок в веб-разработке :)), когда я впервые столкнулся с этой ситуацией, я сделал назначение параметров в определении функции, как это упоминается в вопросе, следующим образом.
Но учтите, что он не работает согласованно в разных браузерах. У меня это работало на Chrome на моем рабочем столе, но не работало на Chrome на Android. Более безопасный вариант, как многие упоминали выше, -
Намерение для этого ответа не состоит в том, чтобы повторить те же решения, которые уже упоминали другие, но чтобы сообщить, что присвоение параметров в определении функции может работать в некоторых браузерах, но не полагаться на это.
источник
function myfunc(a,b=10)
есть ли синтаксис ES6, в других ответах есть ссылки на таблицы совместимости.Всем, кто заинтересован в том, чтобы этот код работал в Microsoft Edge, не используйте значения по умолчанию в параметрах функций.
В этом примере Edge выдаст ошибку «Expecting ')'»
Чтобы обойти это использование
По состоянию на 08 августа 2016 года это все еще проблема
источник
Согласно синтаксису
Вы можете определить значение по умолчанию формальных параметров. а также проверьте неопределенное значение с помощью функции typeof .
источник
источник
Используйте это, если вы хотите использовать последний
ECMA6
синтаксис:Это называется
default function parameters
. Это позволяет формальным параметрам инициализироваться значениями по умолчанию, если не передано значение или неопределенное значение. ПРИМЕЧАНИЕ . Он не будет работать с Internet Explorer или более старыми браузерами.Для максимально возможной совместимости используйте это:
Обе функции имеют одинаковое поведение, так как каждый из этих примеров полагается на тот факт, что переменная параметра будет иметь место,
undefined
если при вызове этой функции значение параметра не было передано.источник
ES6: Как уже упоминалось в большинстве ответов, в ES6 вы можете просто инициализировать параметр вместе со значением.
ES5: Большинство из приведенных ответов не достаточно хороши для меня, потому что бывают случаи, когда мне приходится передавать ложные значения, такие как
0
,null
иundefined
функции. Чтобы определить, является ли параметр неопределенным, потому что это значение, которое я передал вместо неопределенного из-за того, что оно вообще не было определено, я делаю это:источник
Здесь foo () - это функция, у которой есть параметр с именем argValue. Если мы ничего не передадим в вызов функции здесь, то будет вызвана функция throwIfNoValue () и возвращенный результат будет присвоен единственному аргументу argValue. Таким образом, вызов функции может использоваться как параметр по умолчанию. Что делает код более простым и читабельным.
Этот пример был взят отсюда
источник
Если вы используете,
ES6+
вы можете установить параметры по умолчанию следующим образом:Если вам нужен
ES5
синтаксис, вы можете сделать это следующим образом:В приведенном выше синтаксисе используется
OR
оператор.OR
Оператор всегда возвращает первое значение , если это может быть преобразовано вtrue
случае не возвращает righthandside значения. Когда функция вызывается без соответствующего аргумента, переменная параметра (bar
в нашем примере) устанавливаетсяundefined
на движок JS.undefined
Затем преобразуется в false и, таким образом,OR
оператор возвращает значение 0.источник
Да, использование параметров по умолчанию полностью поддерживается в ES6 :
или
но до ES5 вы могли бы легко сделать это:
Это означает, что если значение есть, используйте значение, в противном случае, используйте второе значение после
||
операции, которая делает то же самое ...Примечание: также существует большая разница между этими значениями, если вы передадите значение в ES6 на единицу, даже если это будет ложное значение, которое будет заменено новым значением, например,
null
или""
... но ES5 будет заменено только одно, если только переданное значение это правда, потому что способ||
работает ...источник
Если по каким - то причинам вы не на ES6 и которые , используя
lodash
здесь является кратким способом по умолчанию параметров функции с помощью_.defaultTo
метода:Который установит значение по умолчанию, если текущее значение равно NaN , null или undefined
источник
Звуки будущего
В будущем вы сможете «распространять» один объект на другой (в настоящее время по состоянию на 2019 г. НЕ поддерживается Edge !) - демонстрация того, как использовать это для хороших параметров по умолчанию независимо от порядка:
Ссылка MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
... между тем, что Edge поддерживает, это Object.assign () (IE нет, но я очень надеюсь, что мы можем оставить IE позади :))
Точно так же вы могли бы сделать
РЕДАКТИРОВАТЬ: Из-за комментариев относительно
const
опций - проблема с использованием константных опций в остальной части функции на самом деле не в том, что вы не можете сделать это, просто в том, что вы не можете использовать постоянную переменную в ее собственном объявлении - вы должны иметь настроить ввод имени на что-то вродеисточник
function(opt){ const opt = /*some merging*/; }
? Это наверняка не сработает, потому что вы будете использоватьconst
переменную до того, как она была объявлена - вам нужно будет ее настроить -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
Просто чтобы продемонстрировать мои навыки тоже (смеется), вышеприведенная функция может быть написана даже без именованных аргументов, как показано ниже:
ES5 и выше
ES6 и выше
источник
Следующий код может работать в этой ситуации, включая ECMAScript 6 (ES6), а также более ранние версии.
так как значение по умолчанию в языках работает, когда значение параметра функции пропускается при вызове, в JavaScript оно присваивается неопределенному . Этот подход не выглядит привлекательным программно, но имеет обратную совместимость .
источник
Да, это упоминается как параметр по умолчанию
Параметры функции по умолчанию позволяют формальным параметрам инициализироваться значениями по умолчанию, если не передано значение или неопределенное значение.
Синтаксис:
Описание:
Параметры функций по умолчанию имеют значение undefined Однако в ситуациях может быть полезно установить другое значение по умолчанию. Здесь параметры по умолчанию могут помочь.
В прошлом общая стратегия установки значений по умолчанию заключалась в проверке значений параметров в теле функции и назначении значения, если они не определены. Если в вызове не указано значение, его значение будет неопределенным. Вы должны установить условную проверку, чтобы убедиться, что параметр не неопределен
С параметрами по умолчанию в ES2015 проверка в теле функции больше не требуется. Теперь вы можете просто поместить значение по умолчанию в заголовок функции.
Пример различий:
Различные примеры синтаксиса:
Заполнение не определено против других ложных значений:
Даже если значение установлено явно при вызове, значение аргумента num является значением по умолчанию.
Оценивается во время разговора:
Аргумент по умолчанию оценивается во время вызова, поэтому, в отличие от некоторых других языков, каждый раз при вызове функции создается новый объект.
Параметры по умолчанию доступны для последующих параметров по умолчанию:
Уже найденные параметры доступны для последующих параметров по умолчанию
Функции, определенные внутри тела функции:
Представлено в Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Функции, объявленные в теле функции, нельзя ссылать в параметрах по умолчанию и генерировать ReferenceError (в настоящее время TypeError в SpiderMonkey, см. Ошибку 1022967). Параметры по умолчанию всегда выполняются первыми, объявления функций внутри тела функции оцениваются позже.
Параметры без значений по умолчанию после параметров по умолчанию:
До Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2) следующий код приводил к ошибке SyntaxError. Это было исправлено в ошибке 777060 и работает, как и ожидалось, в более поздних версиях. Параметры по-прежнему устанавливаются слева направо, перезаписывая параметры по умолчанию, даже если есть более поздние параметры без значений по умолчанию.
Разрушенный параметр с присвоением значения по умолчанию:
Вы можете использовать присвоение значений по умолчанию с обозначением присвоения деструктурирования
источник
Еще один подход к установке параметров по умолчанию - использовать объектную карту аргументов, а не аргументы напрямую. Например,
Таким образом, аргументы можно легко расширять и не беспокоиться о несоответствии длины аргумента.
источник
Ответ - да. На самом деле, есть много языков, которые поддерживают параметры по умолчанию. Python является одним из них:
Хотя это код Python 3 из-за круглых скобок, параметры по умолчанию в функциях также работают в JS.
Например, и в вашем случае:
Но иногда вам не нужны параметры по умолчанию.
Вы можете просто определить переменную сразу после запуска функции, например так:
В обоих моих примерах возвращается одно и то же. Но иногда они действительно могут быть полезны, как в очень продвинутых проектах.
Итак, в заключение, значения параметров по умолчанию могут быть использованы в JS. Но это почти то же самое, что и определение переменной сразу после запуска функции. Однако иногда они все еще очень полезны. Как вы могли заметить, значения параметров по умолчанию занимают на 1 строку кода меньше стандартного способа, который определяет параметр сразу после запуска функции.
РЕДАКТИРОВАТЬ: И это супер важно! Это не будетработать в IE. Смотрите документацию . Так что с IE вы должны использовать метод «определить переменную в верхней части функции». Параметры по умолчанию не будут работать в IE.
источник
Да, это будет работать в Javascript. Вы также можете сделать это:
источник