Fonctions Javascript et paramètres par défaut, ne fonctionnent pas dans IE et Chrome


101

J'ai créé une fonction comme celle-ci:

function saveItem(andClose = false) {

}

Cela fonctionne bien dans Firefox

Dans IE, il donne cette erreur sur la console: Expected ')'

Dans Chrome, il donne cette erreur dans la console: Uncaught SyntaxError: Unexpected token =

Les deux navigateurs marquent la source de l'erreur comme ligne de création de fonction.


Navigateur de stock Android 5.1.1 ici, même problème.
jc

Réponses:


152

Vous ne pouvez pas faire cela, mais vous pouvez à la place faire quelque chose comme:

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

Ceci est souvent abrégé en quelque chose comme:

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

Mettre à jour

Ce qui précède est vrai pour ECMAScript <= 5. ES6 a proposé des paramètres par défaut . Donc, ce qui précède pourrait plutôt lire:

function setName(name = 'Bob') {}

14
Ceci est utile pour IE11 et moins, qui n'implémente pas ES6 et rompt les paramètres par défaut.
Eran Goldin

2
Merci!! Je ne savais pas ça! IE est nul mais les développeurs n'ont pas d'autre choix que de prendre en charge un navigateur "non".
Fr0zenFyr

4
name = name || 'Bob';ne doit pas être utilisé car si le nom est défini sur une valeur falsey, la valeur par défaut sera utilisée à la place du nom
Gerard Simpson

10
Au lieu d' name = name || 'Bob'utilisation name = (name === undefined) ? '' : name;
Brian

1
@juco Je ne comprends pas "Vous ne pouvez pas faire ça" - Mozilla MDN dit que nous pouvons? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Êtes-vous juste en train de dire que vous ne pouvez pas le faire dans IE ou dites-vous que les documents de Mozilla sont inexacts?
php-b-grader

13

Ce n'est pas une syntaxe ECMAScript valide, mais c'est une syntaxe valide pour le sur-ensemble de fonctionnalités de Mozilla qu'ils ajoutent à leur implémentation du langage.

La syntaxe d'affectation des paramètres par défaut est probablement disponible dans ECMAScript 6.


1
Ok, alors quelle est la meilleure façon de définir les valeurs par défaut dans les fonctions Javascript?
Talon

1
@Talon: Le meilleur moyen dépend de votre situation. Si vous savez que l'argument ne sera pas faux, vous pouvez le faire foo = foo || "the default". Ou vous pouvez vérifier le .lengthde l' argumentsobjet. Ou vous pouvez simplement tester chaque paramètre pour undefined. Il existe différentes occasions d'utiliser chacun d'eux.
le système

8

Javascript n'autorise pas un spécificateur "par défaut".

Un moyen rapide de faire ce que vous voudriez est de changer:

function saveItem(andClose = false) {

}

à ce qui suit:

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
il sera défini andClosesur false c'était 0 ... pas tout à fait ce à quoi je m'attendais ...
gdoron soutient Monica

@gdoron voyez ceci: stackoverflow.com/questions/7615214/… ce sont les bizarreries dont vous avez besoin pour apprendre toutes les langues que vous utilisez.
JRomero

une alternative est de changer la troisième ligne en var andClose = andClose === undefined? false: andClose;Cela vous permettra de passer 0à la fonction et de ne pas la remplacer par false.
Max Heiber

2

Le code que vous avez fourni ne fonctionnera pas dans Chrome <version 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

Vous avez utilisé une syntaxe ECMAScript 2015 valide:

À mon avis, la meilleure façon d'utiliser les fonctionnalités d' ES2015 est de regrouper les actifs avec Browserify ou WebPack , avec une étape d'utilisation de Babel pour trans-compiler ES2015 vers ES5. De cette façon, vous n'avez pas à vous soucier de ce tableau de compatibilité du navigateur ES2015. C'est pénible de commencer la première fois, mais ça vaut le coup.


0

Dans votre cas, vous avez une autre alternative pour être sûr que votre variable est un booléen:

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

La valeur par défaut est undefined, et true == undefined=> false, donc votre valeur par défaut sera false:)


Un ajustement mineur serait de supprimer la déclaration var car la andClosevariable est déjà affectée dans cette portée
Ben Sewards
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.