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.

Talon
la source
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') {}
juco
la source
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.

le système
la source
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
    }
}
JRomero
la source
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.

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

Cédric Talpaert
la source
Un ajustement mineur serait de supprimer la déclaration var car la andClosevariable est déjà affectée dans cette portée
Ben Sewards