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

IT技术 javascript jquery
2021-03-17 18:53:48

我创建了一个这样的函数:

function saveItem(andClose = false) {

}

它在 Firefox 中运行良好

在 IE 中,它在控制台上给出了这个错误: Expected ')'

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

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

5个回答

您不能这样做,但您可以执行以下操作:

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

这通常缩写为:

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

更新

以上对于 ECMAScript <= 5 是正确的。 ES6 提出了Default parameters所以上面的内容可以改为:

function setName(name = 'Bob') {}
而不是name = name || 'Bob'使用 name = (name === undefined) ? '' : name;
2021-04-27 18:53:48
@juco 我不明白“你不能这样做” - Mozilla MDN 说我们可以?developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... 你只是说你不能在 IE 中做到这一点,还是你说 Mozilla 文档不准确?
2021-05-12 18:53:48
谢谢!!不知道!IE 很烂,但开发人员别无选择,只能支持“非”浏览器。
2021-05-16 18:53:48
这对于 IE11 及更低版本很有用,它不实现 ES6 并破坏默认参数。
2021-05-19 18:53:48
name = name || 'Bob'; 不应使用,因为如果 name 设置为 falsey 值,则将使用默认值而不是 name
2021-05-19 18:53:48

这不是有效的 ECMAScript 语法,但对于 Mozilla 添加到语言实现中的功能超集来说,这是有效的语法。

ECMAScript 6 中可能会出现默认参数分配语法

@Talon:最好的方法取决于你的情况。如果你知道这个论点不会是假的,你可以这样做foo = foo || "the default"或者你可以检查.length的的arguments对象。或者您可以简单地测试每个参数undefined每种都有不同的使用场合。
2021-04-29 18:53:48
好的,那么在 Javascript 函数中设置默认值的最佳方法是什么?
2021-05-01 18:53:48

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
    }
}
它将设置andClose为 false 它是 0 ......不是我期望它做的......
2021-04-30 18:53:48
另一种方法是将第三行更改为var andClose = andClose === undefined? false: andClose;That 将使您能够传递0给该函数,而不是将其替换为false.
2021-05-02 18:53:48
@gdoron 看到这个:stackoverflow.com/questions/7615214/...这些是你需要了解你使用的任何语言的怪癖。
2021-05-09 18:53:48

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

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

在我看来,使用 ES2015 特性的最好方法是将资产与BrowserifyWebPack捆绑在一起,并有一个步骤是使用Babel将 ES2015 转编译为 ES5。这样你就不必担心 ES2015 浏览器兼容性图表。第一次开始很痛苦,但值得。

在您的情况下,您有另一种选择来确保您的变量是布尔值:

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

默认值为undefined, 和true == undefined=> false,因此您的默认值为false:)

如果您真的想确定它是一个布尔值而不是字符串 'true',请将其更改为 andClose = true === andClose;
2021-04-21 18:53:48
一个小的调整是删除 var 声明,因为该andClose变量已在此范围内分配
2021-04-25 18:53:48