javascript - 这种默认参数和解构的特殊场景是如何工作的?

标签 javascript destructuring default-parameters

我今天尝试了一些事情,遇到了一个我想了解的行为。

var b = ({a = 1, b = 1, c = 1}) => a + b + c;

b(); // throws error.

但是如果这样定义

var b = ({a = 1, b = 1, c = 1} = 0) => a + b + c;

b() // returns 3
b([]) // returns 3

这不应该是一个错误吗?零不知何故成为了这里的一个对象吗?它在某种程度上等同于以下内容吗?

var b = ({a = 1, b = 1, c = 1} = {}) => a + b + c; // this is possible I guess.

我的问题不是常规解构和默认参数如何工作,而是如何评估这个特定场景。

有人能给我解释一下吗?

最佳答案

({a = 1, b = 1, c = 1} = something) => {}

只是意味着 something 必须是一个对象或可以转换为一个对象,即它不能是 nullundefined。<支持1

因此,对于 0,它会继续获取 abc 属性0,即 (0).a(0).b(0).c,所有这些都是 undefined,因此它们都默认为 1,即它们提供的默认值。

0 当然可以强制转换为 Number 对象。这就是为什么您可以执行 (0).toString(){toString} = 0 的原因。这正是这里发生的事情。

它通常不等同于将 {} 用作默认值,因为这将使用空对象的属性(包括自身属性和原型(prototype)链上的属性),而不是数字的属性。


1:这种“结构验证”的最简化形式是({} = something)。对于数组的解构,它是 ([] = something) 这意味着 something 也必须是 iterable .顺便说一句,那些空的解构赋值不会创建任何变量,它们只是进行结构检查。

关于javascript - 这种默认参数和解构的特殊场景是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50154734/

相关文章:

javascript - 如何保护代码免于解构 Javascript 中的空值?

variable-assignment - *为什么*列表分配会变平其左侧?

stored-procedures - 如何在存储过程中设置默认日期时间参数?

javascript - 为什么 background-image 在 CSS 中比内联 background-color 具有更高的优先级?

javascript - HTML 表单未提交

typescript - 函数定义参数中的大括号是什么?

javascript - 如何为 JavaScript 中通过对象文字模拟的命名函数参数设置默认值?

c++ - 如何使用std::vector <unique_ptr <T >>作为默认参数

javascript - Materialize:通过 js/jquery 激活可折叠标题

javascript - 如何在 Node 中调试基于 promise 的代码?