JavaScript関数とデフォルトパラメータ、IEとChromeでは機能しない


101

私はこのような関数を作成しました:

function saveItem(andClose = false) {

}

Firefoxで正常に動作します

IEでは、コンソールに次のエラーが表示されます。 Expected ')'

Chromeでは、コンソールに次のエラーが表示されます。 Uncaught SyntaxError: Unexpected token =

どちらのブラウザーも、エラーの原因を関数作成行としてマークします。


Android株式ブラウザ5.1.1はこちら、同じ問題。
jc 2018

回答:


149

これを行うことはできませんが、代わりに次のようなことを行うことができます。

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

これはしばしば以下のように短縮されます:

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

更新

上記はECMAScript <= 5に当てはまります。ES6はデフォルトパラメータを提案しています。だから上記は代わりに読むことができます:

function setName(name = 'Bob') {}

14
これは、ES6を実装せず、デフォルトのパラメーターで中断するIE11以下で役立ちます。
Eran Goldin 2016

2
ありがとう!! 知らなかった!IEは最悪ですが、開発者は「非」ブラウザをサポートする以外に選択肢はありません。
Fr0zenFyr 2017

4
name = name || 'Bob';名前が誤った値に設定されている場合、名前の代わりにデフォルトが使用されるため、使用しないでください
Gerard Simpson

8
代わりのname = name || 'Bob'使用 name = (name === undefined) ? '' : name;
ブライアン

1
@juco理解できません「これはできません」-Mozilla MDNは私たちにできると言っていますか?developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…IEで それができないと言っているだけですか、それともMozillaのドキュメントが不正確だと言っているのですか。
php-b-grader

13

これは有効なECMAScript構文ではありませんが、言語の実装に追加されたMozillaの機能のスーパーセットでは有効な構文です。

デフォルトのパラメーター割り当て構文は、ECMAScript 6で提供される可能性があります。


1
では、JavaScript関数でデフォルト値を設定する最良の方法は何でしょうか。
Talon

1
@Talon:最善の方法は、状況によって異なります。引数が誤っていないことがわかっている場合は、行うことができますfoo = foo || "the default"。または.lengthargumentsオブジェクトのを確認できます。または、単に各パラメータをテストすることもできますundefined。それぞれを使用するさまざまな機会があります。
システム

8

JavaScriptは「デフォルト」指定子を許可しません。

あなたが望むことをする簡単な方法は変更することです:

function saveItem(andClose = false) {

}

次へ:

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
andClosefalseに設定されます。0でした...期待するほどではありません...
gdoronはモニカ

@gdoronこれを見てください:stackoverflow.com/questions/7615214/…これらは、使用する言語について学ぶ必要のある癖です。
JRomero 2013

別の方法として、3行目を次のように変更します。これにより、関数var andClose = andClose === undefined? false: andClose;に渡し0、それをに置き換えないようにすることができますfalse
Max Heiber、2015

2

指定したコードはChrome <バージョン49では実行できません:https : //kangax.github.io/compat-table/es6/#test-default_function_parameters

有効なECMAScript 2015構文を使用しました:

私の意見では、ES2015の機能を使用する最善の方法は、アセットをBrowserifyまたはWebPackにバンドルすることであり、Babelを使用してES2015をES5にトランスコンパイルするステップがあります。そうすれば、ES2015ブラウザー互換性チャートについて心配する必要はありません。初めて始めるのは面倒ですが、それだけの価値があります。


0

あなたの場合、変数がブール値であることを確認するための別の方法があります:

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

デフォルト値はundefined、およびtrue == undefined=> falseなので、デフォルト値はfalse:) になります。


andClose変数がすでにこのスコープで割り当てられているため、1つのマイナーな調整はvar宣言を削除することです
Ben Sewards
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.