这种默认参数和解构的特殊情况如何运作?

时间:2018-05-03 12:07:27

标签: 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.

我的问题不是常规的destrcuturing和default params如何工作,而只是如何评估这个特定的场景。

有人可以向我解释一下吗?

5 个答案:

答案 0 :(得分:5)

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

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

因此,对于0,它会继续抓取a的{​​{1}},bc属性,即{{1} },0(0).a,所有这些都是(0).b,因此所有这些都默认为(0).c,它们是默认值。

undefined当然可以强制转换为1个对象。这就是为什么你可以0Number。这就是这里发生的事情。

它通常不等同于使用(0).toString()作为默认值,因为它会使用空对象的属性(属性和属性链上的属性),而不是数字的属性。

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

答案 1 :(得分:1)

var b = ({a=1,b=1,c=1})=>a+b+c
b() //throws error.

它希望将一些参数作为输入传入,而不是在不传递任何内容的情况下调用b()。

var b = ({a=1,b=1,c=1} = 0)=>a+b+c 
b() //return 3

这是有效的,因为你已经为它分配了一个初始值{a = 1,b = 1,c = 1} = 0,它是0,它正在创建你使用+ b + c的3个变量,默认值= 1

答案 2 :(得分:0)

销毁可以同时使用数组和对象。 从我在对象模式重组中发现的

  

对象模式之前强制解析对象的源   访问属性

例如。

const {length : len} = 'abc'; // len = 3
const {toString: s} = 123; // s = Number.prototype.toString

在你的情况下:

b([]) // return 3 as it arrays destructing
b({a=1,b=2,c=3} =0) // works because of object coercion

请查看link以获取更多信息。

答案 3 :(得分:0)

原因:在JavaScript中,编译器执行自动类型转换,因此0被视为“对象(0)”,因为函数b期望将对象作为输入。

更多详情: 函数b将输入作为对象,默认为a,b,c通过Object destructing。

所以b的调用者必须传递一个Object,如果没有传递,它会抛出一个错误。 当某些内容传递给b时,它会尝试从传递的Object中提取a,b,c值。如果传递某些内容,则会获取这些值,如果没有传递任何内容,则默认为定义

中给出的值

示例,如果您传递类似b({a : 10, b: 20})的内容,则默认c值为1并打印31

对于b({a : 10, d: 20}),b和c变为默认值并返回12

希望这有助于理解。

答案 4 :(得分:-1)

它采用原始值的原型并将其用作解构值。



var b = ({ a = 1, b = 1, c = 1, toFixed } = 0) => toFixed.bind(a + b + c)(2);

console.log(b());