[英]Nested partial object defaults when destructuring in JS?
考慮以下代碼:
function foo({
item1 = 'a',
item2 = 'b',
item3 = {x: 1, y: 2}
} = {}) {
console.log(item1,item2,item3.x,item3.y)
}
如果您調用foo()
,您將獲得一個 object,其中 item1、item2 和 item3 的默認值。 您也可以調用foo({item1: 'm', item2: 'n'})
並且您的結果將包括{x: 1, y: 2}
的默認item3
。 但是,如果您致電:
foo({item1: 'm', item2: 'n', item3: {x: 99}})
你會在 function foo
的 scope 中得到undefined
的item3.y
。
所以:
在這種情況下,有沒有辦法為item3
的嵌套屬性獲取單獨的默認值?
這是不可能的。
在參數中,您嘗試提取 3 個變量: item1
object、 item2
object 和item3
object。
最重要的是,您還試圖改變item3
object 以防它不包含某個屬性。
但是所有解構可以做的就是從 object 中提取屬性到變量中——它不能改變任何現有的對象(沒有一些不應該使用的非常丑陋的古怪代碼)。
如果您可以將item3
的各個屬性提取到新變量中,則很有可能,但是:
function foo({ item1 = 'a', item2 = 'b', item3: { x = 1, y = 2 } = {} } = {}) { console.log(item1, item2, x, y) } foo({item1: 'm', item2: 'n'}) foo({item1: 'm', item2: 'n', item3: {x: 99}})
是的。 解決方案是破壞更多。 從:
function foo({
item1 = 'a',
item2 = 'b',
item3 = {x: 1, y: 2}
} = {}) {
console.log(item1,item2,item3.x,item3.y)
}
至
function foo({
item1 = 'a',
item2 = 'b',
item3: {x = 1, y = 2} = {},
} = {}) {
console.log(item1,item2,x,y)
}
遺憾的是,必須刪除item3
的存在,並且只能使用x
和y
。
另一種解決方案只能是item3 = Object.assign({x: 1, y: 2}, item3)
作為foo
正文的第一行。
有一種駭人聽聞的方法可以實現非常接近的目標。 您可以將不會出現的屬性聲明為原始 object ( item3ex
),然后使用原始屬性 ( item3
) 使用 object 擴展覆蓋默認值。
function foo({ item1 = 'a', item2 = 'b', item3, item3ex = { x: 1, y: 2, ...item3 } } = {}) { console.log(item1, item2, item3ex) } foo({item1: 'm', item2: 'n'}) foo({item1: 'm', item2: 'n', item3: {x: 99}})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.