gpt4 book ai didi

javascript - 在 ES6 中作为参数传入 NULL 时不使用默认参数

转载 作者:IT王子 更新时间:2023-10-29 03:04:38 26 4
gpt4 key购买 nike

传入 null 是否有已知原因?作为 ES6 中的参数在提供时不使用默认参数?

function sayHello(name = "World") {
console.log("Hello, " + name + "!");
}

sayHello("Jim"); // Hello, Jim!
sayHello(undefined); // Hello, World!
sayHello(null); // Hello, null!

最佳答案

这不是那么明显

我已经阅读了一些关于原因的评论 undefinednull 完全不同这就是为什么它解释了默认参数的当前行为。

有人可能会争辩说,明确传递 undefined 不应该触发默认值替换,因为当我有一个函数时:

const f = (x = 'default') => console.log(x);

我想打印 "default"当我运行它时:
f();

但我希望它打印 "undefined"当我明确地将它运行为:
f(undefined);

因为否则我为什么要使用 f(undefined)首先?显然,我在这里的意图是提供一些论据,而不是将其排除在外。

相反的例子

现在,考虑这个函数:
const g = (...a) => console.log(JSON.stringify(a));

当我将其用作:
g();

我得到: []
但是当我将它用作:
g(undefined);

我得到: [null]
这清楚地表明:
  • 路过undefined不一样 因为根本没有传递参数
  • 有时 null 可以 默认值而不是 undefined

  • TC39 决定

    在 TC39 的 2012 年 7 月 24 日 session 记录中可以看到有关默认参数当前行为的一些背景:
  • https://github.com/rwaldron/tc39-notes/blob/master/es6/2012-07/july-24.md

  • 顺便说一句,它表明显式传递 undefined没有在初稿中触发默认值,并讨论了是否应该这样做。因此,正如您所看到的,当前的行为对 TC39 成员来说并不像现在对在这里发表评论的人来说那么明显。

    其他语言

    话虽如此,决定什么应该和什么不应该触发默认值替换在一天结束时完全是任意的。即使有一个单独的 undefinednull如果你仔细想想,可能会觉得很奇怪。有些语言只有 undefined (如 Perl 中的 undef),有些只有 null (如 Java),一些语言使用 false 的等价物或者一个空列表或数组(比如 Scheme,你可以有一个空列表或 #f(假),但没有等效的 null,它不同于空列表和假值)和一些语言甚至没有 null 的等价物, falseundefined (就像 C 使用整数而不是 truefalse 和一个 NULL 指针,它实际上是一个指向地址 0 的普通指针 - 即使被任何测试空指针的代码映射,该地址也无法访问)。

    你可以做什么

    现在,我可以理解您需要用默认值替换 null .不幸的是,这不是默认行为,但您可以创建一个简单的函数来帮助您:
    const N = f => (...a) => f(...a.map(v => (v === null ? undefined : v)));

    现在每次你想用默认值代替 null您可以像这样使用它。例如。如果您从上述示例之一中获得此功能:
    const f = (x = 'default') => console.log(x);

    它将打印 "default"f()f(undefined)但不适用于 f(null) .但是当您使用 N 时上面定义的函数定义了 f像这样的功能:
    const f = N((x = 'default') => console.log(x));

    现在 f()f(undefined)还有 f(null)版画 "default" .

    如果你想要一些不同的行为,例如替换空字符串的默认值 - 对于有时可以设置为空字符串而不是不存在的环境变量很有用,您可以使用:
    const N = f => (...a) => f(...a.map(v => (v === '' ? undefined : v)));

    如果您希望替换所有虚假值,您可以像这样使用它:
    const N = f => (...a) => f(...a.map(v => (v || undefined)));

    如果您想替换空对象,您可以使用:
    const N = f => (...a) => f(...a.map(v => (Object.keys(v).length ? v : undefined)));

    等等...

    结论

    关键是它是你的代码,你知道你的函数的 API 应该是什么以及默认值应该如何工作。幸运的是,JavaScript 足够强大,可以让您通过一些高阶函数魔法轻松实现您需要的东西(即使这不是默认值的默认行为,可以这么说)。

    关于javascript - 在 ES6 中作为参数传入 NULL 时不使用默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725034/

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