我今天正在尝试一些事情并遇到了我想要理解的行为。
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如何工作,而只是如何评估这个特定的场景。
有人可以向我解释一下吗?
答案 0 :(得分:5)
({a = 1, b = 1, c = 1} = something) => {}
只是意味着something
必须是一个对象或者可以转换为一个对象,即它不能是null
或undefined
。 1
因此,对于0
,它会继续抓取a
的{{1}},b
和c
属性,即{{1} },0
,(0).a
,所有这些都是(0).b
,因此所有这些都默认为(0).c
,它们是默认值。
undefined
当然可以强制转换为1
个对象。这就是为什么你可以0
或Number
。这就是这里发生的事情。
它通常不等同于使用(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());