Funciones de Javascript y parámetros predeterminados, no funcionan en IE y Chrome


101

Creé una función como esta:

function saveItem(andClose = false) {

}

Funciona bien en Firefox

En IE da este error en la consola: Expected ')'

En Chrome da este error en la consola: Uncaught SyntaxError: Unexpected token =

Ambos navegadores marcan la fuente del error como la línea de creación de la función.


Navegador de valores de Android 5.1.1 aquí, mismo problema.
jc

Respuestas:


150

No puede hacer esto, pero puede hacer algo como:

function saveItem(andClose) {
   if(andClose === undefined) {
      andClose = false;
   }
}

Esto a menudo se abrevia a algo como:

function setName(name) {
  name = name || 'Bob';
}

Actualizar

Lo anterior es cierto para ECMAScript <= 5. ES6 ha propuesto parámetros predeterminados . Entonces, lo anterior podría leerse:

function setName(name = 'Bob') {}

14
Esto es útil para IE11 y menores, que no implementa ES6 y rompe los parámetros predeterminados.
Eran Goldin

2
¡¡Gracias!! ¡No lo sabía! IE apesta, pero los desarrolladores no tienen otra opción que admitir un "no" navegador.
Viernes

4
name = name || 'Bob';no debe usarse porque si el nombre se establece en un valor falso, se usará el valor predeterminado en lugar del nombre
Gerard Simpson

8
En lugar de name = name || 'Bob'usar name = (name === undefined) ? '' : name;
Brian

1
@juco No entiendo "No puedes hacer esto" - ¿Mozilla MDN dice que podemos? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ¿Está diciendo simplemente que no puede hacerlo en IE o está diciendo que los documentos de Mozilla son inexactos?
php-b-grader

13

Esa no es una sintaxis válida de ECMAScript, pero es una sintaxis válida para el superconjunto de características de Mozilla que agregan a su implementación del lenguaje.

Es probable que la sintaxis de asignación de parámetros predeterminada venga en ECMAScript 6.


1
Bien, entonces, ¿cuál es la mejor manera de establecer valores predeterminados en las funciones de Javascript?
Talon

1
@Talon: La mejor manera depende de su situación. Si sabe que el argumento no será falso, puede hacerlo foo = foo || "the default". O puede verificar el .lengthdel argumentsobjeto. O simplemente puede probar cada parámetro undefined. Hay diferentes ocasiones para usar cada uno.
el sistema

8

Javascript no permite un especificador "predeterminado".

Una forma rápida de hacer lo que le gustaría es cambiar:

function saveItem(andClose = false) {

}

a lo siguiente:

function saveItem(andClose) {
    // this line will check if the argument is undefined, null, or false
    // if so set it to false, otherwise set it to it's original value
    var andClose = andClose || false;

    // now you can safely use andClose
    if (andClose) {
        // do something
    }
}

1
se establecerá andCloseen falso, fue 0 ... no es exactamente lo que esperaría que hiciera ...
gdoron está apoyando a Monica

@gdoron vea esto: stackoverflow.com/questions/7615214/… estas son las peculiaridades que necesita aprender sobre cualquier idioma que use.
JRomero

una alternativa es cambiar la tercera línea a var andClose = andClose === undefined? false: andClose;Eso le permitirá pasar 0a la función y no reemplazarla por false.
Max Heiber

2

El código que proporcionó no se ejecutará en Chrome <versión 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

Usó una sintaxis válida de ECMAScript 2015:

En mi opinión, la mejor manera de utilizar ES2015 características es agrupar los activos con Browserify o WebPack , con un paso para el uso de Babel a ES2015 trans-compilación para ES5. De esa manera, no tiene que preocuparse por la tabla de compatibilidad del navegador ES2015. Es un dolor empezar por primera vez, pero merece la pena.


0

En su caso, tiene otra alternativa para asegurarse de que su variable sea booleana:

function saveItem(andClose) {
  var andClose = true == andClose;
  // ...
}

El valor predeterminado es undefined, y true == undefined=> false, por lo que su valor predeterminado será false:)


Un ajuste menor sería eliminar la declaración var ya que la andClosevariable ya está asignada en este ámbito
Ben Sewards
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.