Różnica jest jasne podczas próby przechodzącą coś do swoich funkcji:
m1({}) // [0, 0]
m1({z: 1}) // [0, 0]
m1({x: 1}) // [1, 0]
m2({}) // [undefined, undefined]
m2({z: 1}) // [undefined, undefined]
m2({x: 1}) // [1, undefined]
Twoja pierwsza składnia (m1({x = 0, y = 0} = {})
) ma trzy rzeczy:
- Po pierwsze, zapewnia on domyślną pierwszy argument funkcja, która jest pustym obiektem. Jeśli nie podano pierwszego argumentu (
m1()
), wówczas domyślny pusty obiekt jest używany (to znaczy staje się m1({})
)
- Po drugie, twój kod wyodrębnia z tego obiektu właściwości
x
i y
.
- Jeśli jest to
undefined
, otrzymuje on wartość domyślną 0
.
m2({x, y} = { x: 0, y: 0 })
robi coś zupełnie innego:
- Pierwszy Zapewnia domyślny pierwszy parametr do funkcji, która jest przedmiotem
{x: 0, y: 0}
. Jeśli nie zostanie przekazany żaden pierwszy argument, ten obiekt zostanie użyty. Jeśli przekazywany jest dowolny argument inny niż undefined
, ta wartość jest używana zamiast tego.
- Po drugie, kod wyodrębnia z tego obiektu właściwości
x
i y
. Jeśli są one undefined
, to dostaniesz.
Pierwsza opcja (parametr z wartością domyślną, która jest niszczona o więcej wartości domyślnych) jest prawie na pewno tym, czego potrzebujesz. Druga opcja oznacza, że twój kod nie ma rozsądnych/użytecznych wartości domyślnych dla właściwości, jeśli argumenty są przekazywane.
Myślę, że z javascript można to zrobić z innym podejściem. to byłoby coś w rodzaju funkcji m1 (x) {x || (x = 0); } – Husamuddin
@lsqleakey pytasz, jak utworzyć funkcję strzałki z domyślnymi vars w ES6? –