簡體   English   中英

在JS中解構時嵌套部分object默認值?

[英]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 中得到undefineditem3.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的存在,並且只能使用xy

另一種解決方案只能是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM