簡體   English   中英

這種默認參數和解構的特殊情況如何運作?

[英]How does this particular scenario of default params and destructuring work?

我今天正在嘗試一些事情,並且遇到了我想要理解的行為。

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如何工作,而只是如何評估這個特定的場景。

誰可以給我解釋一下這個?

({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 這就是這里發生的事情。

它通常不等同於使用{}作為默認值,因為它將使用空對象的屬性(自己的屬性和原型鏈上的屬性),而不是數字的屬性。


1:這種“結構驗證”的最簡化形式是({} = something) 對於數組的解構,它是([] = something) ,這意味着something也必須是可迭代的 順便說一下,那些空的解構分配不會創建任何變量,它們只是進行結構檢查。

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,它正在創建3個變量,你使用+ b + c,默認值= 1

它采用原始值的原型並將其用作解構值。

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

銷毀適用於數組和對象。 從我在Object模式重組中發現的

在訪問屬性之前,對象模式強制將對象解析為對象

例如。

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

請查看此鏈接以獲取更多信息。

原因:在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

希望這有助於理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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