Javascript函数和默认参数,不适用于IE和Chrome


101

我创建了这样的函数:

function saveItem(andClose = false) {

}

在Firefox中工作正常

在IE中,它会在控制台上显示此错误: Expected ')'

在Chrome中,它会在控制台中显示此错误: Uncaught SyntaxError: Unexpected token =

两种浏览器都将错误源标记为函数创建行。


Android股票浏览器5.1.1在这里,同样的问题。
jc

Answers:


149

您无法执行此操作,但是可以执行以下操作:

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

通常将其简化为:

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

更新资料

上面的内容适用于ECMAScript <=5。ES6提出了Default参数。因此,上述内容可以改为:

function setName(name = 'Bob') {}

14
这对于IE11及以下版本非常有用,因为IE11及以下版本未实现ES6,并且破坏了默认参数。
Eran Goldin

2
谢谢!!不知道!IE很烂,但是开发人员除了支持“非”浏览器外别无选择。
Fr0zenFyr

4
name = name || 'Bob';不应使用,因为如果将name设置为falsey值,则将使用默认值代替name
Gerard Simpson

8
代替name = name || 'Bob'使用 name = (name === undefined) ? '' : name;
Brian

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 2013年

1
@Talon:最好的方法取决于您的情况。如果您知道该论据不会是虚假的,则可以这样做foo = foo || "the default"。或者你可以检查.length的的arguments对象。或者,您可以简单地为测试每个参数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
它将设置andClose为false,它是0 ...不太符合我的期望...
gdoron支持Monica 13'Mar

@gdoron看到以下内容:stackoverflow.com/questions/7615214/…这些是您需要了解的任何古怪语言。
JRomero

另一种方法是将第三行更改为,var andClose = andClose === undefined? false: andClose;这将使您可以传递0给函数而不用代替false
Max Heiber

2

您提供的代码无法在Chrome <版本49中运行:https : //kangax.github.io/compat-table/es6/#test-default_function_parameters

您使用了有效的ECMAScript 2015语法:

我认为,使用ES2015功能的最佳方法是将资产与BrowserifyWebPack捆绑在一起,并使用Babel将ES2015转编译为ES5。这样,您不必担心该ES2015浏览器兼容性表。第一次开始很痛苦,但是值得。


0

就您而言,您还有另一种选择可以确保您的变量是布尔值:

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

默认值为undefinedtrue == undefined= = false,所以默认值为false:)


一个较小的调整是删除var声明,因为andClose已在此范围内分配了该变量
Ben Sewards
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.