Desde ES6 / ES2015 , los parámetros predeterminados están en la especificación del idioma.
function read_file(file, delete_after = false) {
// Code
}
solo funciona
Referencia: Parámetros predeterminados - MDN
Los parámetros de función predeterminados permiten que los parámetros formales se inicialicen con valores predeterminados si no se pasa ningún valor o no se define.
También puede simular parámetros con nombre predeterminados mediante la desestructuración :
// 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
···
}
Pre ES2015 ,
Hay muchas formas, pero este es mi método preferido: le permite pasar lo que quiera, incluido falso o nulo. ( 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; }
y luego puede llamarlo comoa = defaultFor(a, 42);
undefined
objetos: p Aunque puede funcionar con algunos navegadores y puede ser más rápido,null
sigue siendo un objeto yundefined
es una referencia al tipo primitivo que intenta decir que hay Nada aquí, ni siquieranull
. Vea aquí, ambos casos en pocas palabras: JavaScript / Reference / Global_Objects / undefined .typeof
es redundante.function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }
Esto no arrojará errores de referencia y es conciso.a = a
yb = b
cuándo esos parámetros no están indefinidos. Además, ese operador ternario con una condición un poco complicada puede ser difícil de leer para futuros mantenedores. Preferiría la siguiente sintaxis:if (typeof a == 'undefined') a = 42
- sin asignación innecesaria y un poco más fácil de leer.typeof
? Parecería más simple simplemente hacera === undefined
. Además, de esa manera obtendría un error de referencia si escribe malundefined
o lo pone en una cadena.Esto se asigna al
delete_after
valor dedelete_after
si no es un valor falsey , de lo contrario, asigna la cadena"my default here"
. Para obtener más detalles, consulte la encuesta del lenguaje de Doug Crockford y consulte la sección Operadores .Este enfoque no funciona si se desea pasar de un Falsey- es decir, valor
false
,null
,undefined
,0
o""
. Si necesita que se pasen los valores de falsey , deberá usar el método en la respuesta de Tom Ritter .Cuando se trata con una serie de parámetros para una función, a menudo es útil permitir que el consumidor pase los argumentos de los parámetros en un objeto y luego combine estos valores con un objeto que contenga los valores predeterminados para la función
usar
fuente
delete_after
no obtiene el resultado booleano de la expresióndelete_after || "my default value"
?Me parece que algo tan simple como esto es mucho más conciso y legible personalmente.
fuente
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
. El uso del espacio de nombres global como se muestra en esta respuesta es considerado por muchos una mala práctica. También puede considerar rodar su propia utilidad para esta tarea común (p. Ej.util.default(arg, "defaul value")
) Si no desea utilizar el guión bajo, pero la mayoría de las veces termino usando el guión bajo cero, tarde o temprano, de ninguna manera tiene sentido reinventar la rueda.undefined
con algún otro valor, lo que hace que la prueba falle.undefined
. Por lo tanto, sigue siendo una buena idea usartypeof
y'undefined'
.En ECMAScript 6 podrás escribir exactamente lo que tienes:
Esto se establecerá
delete_after
enfalse
si no está presente oundefined
. Puede utilizar las funciones de ES6 como esta hoy con transpiladores como Babel .Vea el artículo de MDN para más información .
fuente
Valores de parámetros predeterminados
Con ES6, puede hacer quizás uno de los modismos más comunes en
JavaScript
relación con el establecimiento de un valor predeterminado para un parámetro de función. La forma en que lo hemos hecho durante años debería parecer bastante familiar:Este patrón es el más utilizado, pero es peligroso cuando pasamos valores como
¿Por qué? Debido a que
0 is falsy
, y por lo tantox || 11 results in 11
, no se pasa directamente en 0. Para solucionar este problema, algunas personas escribirán el cheque de manera más detallada de esta manera:ahora podemos examinar una buena sintaxis útil agregada
ES6
para optimizar la asignación de valores predeterminados a los argumentos faltantes:x = 11
en una declaración de función es más comox !== undefined ? x : 11
el idioma mucho más comúnx || 11
Expresiones de valor predeterminado
Function
los valores predeterminados pueden ser más que simples valores como 31; pueden ser cualquier expresión válida, incluso unafunction call
:Como puede ver, las expresiones de valor predeterminadas se evalúan de manera perezosa, lo que significa que solo se ejecutan si es necesario, es decir, cuando el argumento de un parámetro se omite o no está definido.
Una expresión de valor predeterminada puede ser incluso una llamada de expresión de función en línea, comúnmente conocida como expresión de función invocada inmediatamente
(IIFE)
:fuente
esa solución es trabajo para mí en js:
fuente
delete_after
es0
onull
? No funcionará correctamente para estos casos.delete_after = delete_after === undefined ? false : delete_after
?Simplemente use una comparación explícita con indefinido.
fuente
Recomiendo extrema precaución al usar valores de parámetros predeterminados en javascript. A menudo crea errores cuando se utiliza en combinación con funciones de orden superior como
forEach
,map
, yreduce
. Por ejemplo, considere esta línea de código:parseInt tiene una segunda
function parseInt(s, [
raíz de parámetros opcional=10])
pero asigna llamadasparseInt
con tres argumentos: ( elemento , índice y matriz ).Le sugiero que separe los parámetros requeridos de sus argumentos con valor opcional / predeterminado. Si su función toma 1,2, o 3 parámetros requeridos para los cuales ningún valor predeterminado tiene sentido, conviértalos en parámetros posicionales para la función, cualquier parámetro opcional debe seguir como atributos con nombre de un solo objeto. Si su función toma 4 o más, quizás tenga más sentido proporcionar todos los argumentos a través de los atributos de un único parámetro de objeto.
En su caso, le sugiero que escriba su función deleteFile de esta manera: ( editado por
instead
los comentarios de ...) ...La ejecución del fragmento anterior ilustra los peligros que acechan detrás de los valores de argumento predeterminados para los parámetros no utilizados.
fuente
typeof deleteAfter === 'bool'
y lanzar Exception de lo contrario. Además, en caso de utilizar métodos como map / foreach, etc., úselos con precaución y ajuste las llamadas funciones con función anónima.['1', '2', '3'].map((value) => {read_file(value);})
get
método de lodash para recuperar deleteAfter. Lanzar una excepción sitypeof 'deleteAfter' !== 'bool'
también puede ser una buena medida prudente. No me gusta diseñar métodos que requieran que la persona que llama "tenga cuidado". La precaución es responsabilidad de la función, no de la persona que llama. El comportamiento final debe seguir el principio de menor sorpresa.Como actualización ... con ECMAScript 6 FINALMENTE puede establecer valores predeterminados en las declaraciones de parámetros de función de esta manera:
Como se hace referencia en - http://es6-features.org/#DefaultParameterValues
fuente
Siendo un desarrollador de C ++ desde hace mucho tiempo (Novato en desarrollo web :)), cuando me encontré con esta situación, hice la asignación de parámetros en la definición de la función, como se menciona en la pregunta, de la siguiente manera.
Pero tenga en cuenta que no funciona de manera consistente en todos los navegadores. Para mí funcionó en Chrome en mi escritorio, pero no funcionó en Chrome en Android. Opción más segura, como muchos han mencionado anteriormente es:
La intención de esta respuesta no es repetir las mismas soluciones, lo que otros ya han mencionado, sino informar que la asignación de parámetros en la definición de la función puede funcionar en algunos navegadores, pero no confíe en ella.
fuente
function myfunc(a,b=10)
es la sintaxis de ES6, hay enlaces a tablas de compatibilidad en otras respuestas.Para cualquier persona interesada en que el código funcione en Microsoft Edge, no use los valores predeterminados en los parámetros de la función.
En ese ejemplo, Edge arrojará un error "Esperando ')'"
Para evitar este uso
A partir del 8 de agosto de 2016, esto sigue siendo un problema
fuente
Según la sintaxis
Puede definir el valor predeterminado de los parámetros formales. y también verifique el valor indefinido usando la función typeof .
fuente
fuente
Use esto si quiere usar la última
ECMA6
sintaxis:Se llama
default function parameters
. Permite que los parámetros formales se inicialicen con valores predeterminados si no se pasa ningún valor o no se define. NOTA : No funcionará con Internet Explorer o navegadores anteriores.Para obtener la máxima compatibilidad posible, use esto:
Ambas funciones tienen exactamente el mismo comportamiento, ya que cada uno de estos ejemplos se basa en el hecho de que la variable de parámetro será
undefined
si no se pasó ningún valor de parámetro al llamar a esa función.fuente
ES6: Como ya se mencionó en la mayoría de las respuestas, en ES6, simplemente puede inicializar un parámetro junto con un valor.
ES5: La mayoría de las respuestas dadas no son lo suficientemente buenas para mí porque hay ocasiones en las que es posible que tenga que pasar valores falsos como
0
,null
yundefined
a una función. Para determinar si un parámetro no está definido porque ese es el valor que pasé en lugar de indefinido porque no se ha definido en absoluto, hago esto:fuente
Aquí foo () es una función que tiene un parámetro llamado argValue. Si no pasamos nada en la llamada a la función aquí, se llamará a la función throwIfNoValue () y el resultado devuelto se asignará al único argumento argValue. Así es como se puede usar una llamada de función como parámetro predeterminado. Lo que hace que el código sea más simplificado y legible.
Este ejemplo ha sido tomado de aquí
fuente
Si está utilizando
ES6+
, puede establecer los parámetros predeterminados de la siguiente manera:Si necesita
ES5
sintaxis, puede hacerlo de la siguiente manera:En la sintaxis anterior
OR
se usa el operador. ElOR
operador siempre devuelve el primer valor si se puede convertirtrue
si no, devuelve el valor del lado derecho. Cuando se llama a la función sin argumento correspondiente, el motor JSbar
establece la variable de parámetro ( en nuestro ejemplo)undefined
.undefined
Luego se convierte en falso y, por lo tanto, elOR
operador devuelve el valor 0.fuente
Sí, el uso de parámetros predeterminados es totalmente compatible con ES6 :
o
pero antes en ES5 podías hacer esto fácilmente:
Lo que significa que si el valor está allí, use el valor, de lo contrario, use el segundo valor después de la
||
operación que hace lo mismo ...Nota: También hay una gran diferencia entre los que si se pasa un valor de ES6 uno incluso el valor sea Falsy, que será reemplazado con el nuevo valor, algo así como
null
o""
... pero ES5 uno sólo va a ser reemplazado si sólo el valor pasado es verdad, eso es porque la forma de||
trabajar ...fuente
Si por alguna razón usted no en la ES6 y se utiliza
lodash
aquí es una forma concisa a los parámetros por defecto de función a través de_.defaultTo
método:Que establecerá el valor predeterminado si el valor actual es NaN , nulo o indefinido
fuente
Sonidos de futuro
En el futuro, podrá "esparcir" un objeto a otro (¡actualmente a partir de 2019 NO es compatible con Edge !) - Demostración de cómo usar eso para buenas opciones predeterminadas independientemente del orden:
Referencia de MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
... mientras tanto, Edge sí admite Object.assign () (IE no, pero realmente espero que podamos dejar IE atrás :))
Del mismo modo podrías hacer
EDITAR: debido a los comentarios con respecto a las
const
opciones: el problema con el uso de opciones constantes en el resto de la función no es que no pueda hacer eso, es simplemente que no puede usar la variable constante en su propia declaración: tendría que para ajustar el nombre de entrada a algo comofuente
function(opt){ const opt = /*some merging*/; }
? Eso seguro no funcionará porque usaría laconst
variable antes de que fuera declarada - tendría que ajustar -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
Solo para mostrar mis habilidades también (risas), la función anterior se puede escribir incluso sin haber nombrado argumentos como a continuación:
ES5 y superior
ES6 y superior
fuente
El siguiente código puede funcionar en esta situación, incluido ECMAScript 6 (ES6), así como versiones anteriores.
como valor predeterminado en idiomas funciona cuando el valor del parámetro de la función se omite al llamar, en JavaScript se asigna a indefinido . Este enfoque no parece atractivo mediante programación, pero tiene compatibilidad con versiones anteriores .
fuente
Sí, esto se conoce como un parámetro predeterminado
Los parámetros de función predeterminados permiten que los parámetros formales se inicialicen con valores predeterminados si no se pasa ningún valor o no se define.
Sintaxis:
Descripción:
Parámetros de las funciones predeterminadas a indefinidas Sin embargo, en situaciones puede ser útil establecer un valor predeterminado diferente. Aquí es donde los parámetros predeterminados pueden ayudar.
En el pasado, la estrategia general para establecer valores predeterminados era probar los valores de los parámetros en el cuerpo de la función y asignar un valor si no están definidos. Si no se proporciona ningún valor en la llamada, su valor sería indefinido. Debería establecer una comprobación condicional para asegurarse de que el parámetro no esté indefinido
Con los parámetros predeterminados en ES2015, la verificación en el cuerpo de la función ya no es necesaria. Ahora puede simplemente poner un valor predeterminado en el encabezado de la función.
Ejemplo de las diferencias:
Diferentes ejemplos de sintaxis:
Relleno indefinido frente a otros valores falsos:
Incluso si el valor se establece explícitamente al llamar, el valor del argumento num es el predeterminado.
Evaluado en el momento de la llamada:
El argumento predeterminado se evalúa en el momento de la llamada, por lo que, a diferencia de otros lenguajes, se crea un nuevo objeto cada vez que se llama a la función.
Los parámetros predeterminados están disponibles para los parámetros predeterminados posteriores:
Los parámetros ya encontrados están disponibles para los parámetros predeterminados posteriores
Funciones definidas dentro del cuerpo de la función:
Introducido en Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Las funciones declaradas en el cuerpo de la función no se pueden referir dentro de los parámetros predeterminados y arrojan un Error de referencia (actualmente un Error de tipo en SpiderMonkey, vea el error 1022967). Los parámetros predeterminados siempre se ejecutan primero, las declaraciones de funciones dentro del cuerpo de la función se evalúan después.
Parámetros sin valores predeterminados después de los parámetros predeterminados:
Antes de Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2), el siguiente código resultó en un SyntaxError. Esto se ha solucionado en el error 777060 y funciona como se esperaba en versiones posteriores. Los parámetros aún se configuran de izquierda a derecha, sobrescribiendo los parámetros predeterminados incluso si hay parámetros posteriores sin valores predeterminados.
Parámetro desestructurado con asignación de valor predeterminado:
Puede usar la asignación de valor predeterminada con la notación de asignación de desestructuración
fuente
Un enfoque diferente para establecer parámetros predeterminados es utilizar un mapa de objetos de argumentos, en lugar de argumentos directamente. Por ejemplo,
De esta manera, es fácil extender los argumentos y no preocuparse por la falta de coincidencia de la longitud del argumento.
fuente
La respuesta es sí. De hecho, hay muchos idiomas que admiten parámetros predeterminados. Python es uno de ellos:
Aunque este es el código Python 3 debido a los paréntesis, los parámetros predeterminados en las funciones también funcionan en JS.
Por ejemplo, y en tu caso:
Pero a veces realmente no necesita parámetros predeterminados.
Simplemente puede definir la variable justo después del inicio de la función, así:
En mis dos ejemplos, devuelve lo mismo. Pero a veces pueden ser útiles, como en proyectos muy avanzados.
Entonces, en conclusión, los valores de parámetros predeterminados se pueden usar en JS. Pero es casi lo mismo que definir una variable justo después del inicio de la función. Sin embargo, a veces siguen siendo muy útiles. Como habrá notado, los valores predeterminados de los parámetros toman 1 línea de código menos que la forma estándar que define el parámetro justo después del inicio de la función.
EDITAR: ¡ Y esto es súper importante! Esto no funcionará en IE. Ver documentación . Entonces, con IE, debe usar el método "definir variable en la parte superior de la función". Los parámetros predeterminados no funcionarán en IE.
fuente
Sí, esto funcionará en Javascript. También puedes hacer eso:
fuente