[英]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
必須是一個對象或者可以轉換為一個對象,即它不能為null
或undefined
。 1
因此,在的情況下0
時,它前進到抓住a
, b
和c
的性能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.