我们可以只使用“if (a === undefined)”来处理 ES6 之前的 JavaScript 中的默认参数值吗
Can we just use "if (a === undefined)" to handle default parameter values in JavaScript before ES6?
在 ES6 中,我们可以使用
function f (x, y = 7, z = 42) {
return x + y + z
}
console.log(f(1));
Babel 和 Traceur 都以这种方式将其转换为类似的 ES5 代码:
"use strict";
function f(x) {
var y = arguments.length <= 1 || arguments[1] === undefined ? 7 : arguments[1];
var z = arguments.length <= 2 || arguments[2] === undefined ? 42 : arguments[2];
return x + y + z;
}
console.log(f(1));
我们不是真的可以处理它吗,就像 http://es6-features.org/#DefaultParameterValues 一样:
function f (x, y, z) {
if (y === undefined)
y = 7;
if (z === undefined)
z = 42;
return x + y + z;
}
console.log(f(1));
甚至Mozilla的网站也使用类似的东西:
var b = typeof b !== 'undefined' ? b : 1;
或关于 SO 用途的标准答案:
function foo(a, b)
{
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
我们为什么不使用简短的
if (y === undefined)
y = 7;
有什么细微的区别吗?
(在全局范围内确实如此,我们不能只说a === undefined
如果从未声明a
(它会引发错误)。但是在函数内部,我们可以只使用 a === undefined
,因为a
已经列在参数列表中。但是,Babel 和 Traceur 都没有在参数列表中列出默认参数。
我们可以只使用
if (a === undefined)
来处理 ES6 之前的 JavaScript 中的默认参数值吗?
是的,你可以这样做,这完全没问题。
但你是对的,有一个微妙的区别(或两个):
-
f.length
是 ExpectArgumentCount,即第一个休息或初始化之前的参数数。 function f( a=b, b=0 )
变量b
具有时间盲区,不得由a
的初始化器使用。
像 Babel 这样的转译器试图尽可能接近地复制这样的东西,这就是为什么它们使用 arguments
对象并在函数体中声明变量。顺便说一句,Babel 无法正确处理function f(a=0, b)
。
是的,你可以,这就是我一直这样做的方式(大约 15 年),它永远不会出错。通过将其添加到参数列表中,您始终可以将其作为声明的变量访问,而且我从未遇到过无法处理它的浏览器。
不过,我更喜欢使用typeof varname == 'undefined'
,因为我过去在一些晦涩的浏览器中遇到过一些=== undefined
问题。
我总是倾向于尽可能远离参数属性。
- 可以't让我的if语句处理js中的html表单输入
- keyup事件处理程序更改焦点不适用于快速键入
- ES6构造函数返回基类的实例
- 如何在下面的ES6循环中获得前面的文本
- 如何使用jquery处理php循环通过元素
- angular.js没有'无法在PhoneGap中处理视图标记
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- es6和谐箭头函数在express处理程序中
- 用 ES6 承诺以习惯方式处理先决条件
- 当函数绑定在构造函数中时,如何在 ES6 React 中向事件处理程序添加参数
- 如何处理 React 嵌套组件循环依赖?(使用 es6 类)
- 我们可以只使用“if (a === undefined)”来处理 ES6 之前的 JavaScript 中的默认参数值吗
- ES6/When.js-在递归承诺链中处理承诺解析
- 如何使用react es6处理多个控制输入
- Es6类和"this"使用事件处理程序
- ES6承诺错误处理
- ReactJS移除ES6中的绑定事件处理程序
- ES6生成器如何帮助处理非阻塞代码
- Angular 1.5 ES6输入文件更改处理程序
- JavaScript (ES6)中的原生承诺有默认的onfulfillment处理程序吗?