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.

Garra
fuente
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') {}
juco
fuente
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.

el sistema
fuente
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
    }
}
JRomero
fuente
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.

Max Heiber
fuente
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:)

Cédric Talpaert
fuente
Un ajuste menor sería eliminar la declaración var ya que la andClosevariable ya está asignada en este ámbito
Ben Sewards