gpt4 book ai didi

javascript - 在 ES6 之前的 JavaScript 中,我们可以只使用 "if (a === undefined)"来处理默认参数值吗?

转载 作者:行者123 更新时间:2023-11-29 21:35:00 26 4
gpt4 key购买 nike

在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's website使用类似的东西:

var b = typeof b !== 'undefined' ?  b : 1;

a standard answer on SO用途:

function foo(a, b)
{
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}

为什么我们不使用简短的

if (y === undefined)
y = 7;

有什么细微差别吗?

(在全局范围内确实如此,如果从未声明过a,我们不能只说a === undefined(这会引发错误)。但是在函数内部,我们可以只使用 a === undefined 因为 a 已经在参数列表中列出了。Babel 和 Traceur 都没有列出默认参数但是在参数列表中。)

最佳答案

Can we just use if (a === undefined) to handle default parameter values in JavaScript before ES6?

是的,你可以这样做,完全没问题。

但你是对的,一个(或两个)细微差别:

  • f.lengthExpectedArgumentCount ,即第一个休息或初始化参数之前的参数数量。
  • function f( a=b, b=0 ) 中,变量 b 有一个临时死区,不能被 a 的初始化程序使用

像 Babel 这样的转译器试图尽可能地复制这些东西,这就是为什么他们使用 arguments 对象并在函数体中声明变量。顺便说一句,Babel 无法正确处理 function f(a=0, b)

关于javascript - 在 ES6 之前的 JavaScript 中,我们可以只使用 "if (a === undefined)"来处理默认参数值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com