2017-02-07 67 views
5

W pełni rozumiem ECMAScript 6 stworzył wiele potencjalnych sposobów obsługi za pomocą takich funkcji, jak strzałki.Domyślne parametry JavaScript dla funkcji

Ponieważ nie jestem bardzo obeznany z nowymi materiałami, mówiąc o domyślnych parametrach dla funkcji. Jak interpretować różnice między następujący sposób funkcji definiujących:

Funkcja 1:

function m1({x = 0, y = 0} = {}) { 
    return [x, y]; 
} 

Funkcja 2:

function m2({x, y} = { x: 0, y: 0 }) { 
    return [x, y]; 
} 
+0

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

+0

@lsqleakey pytasz, jak utworzyć funkcję strzałki z domyślnymi vars w ES6? –

Odpowiedz

0

m1 dostarcza wartości domyślnych dla x i y, natomiast m2 jedynie destructures x i y z podanego obiektu i podaje tylko wartości domyślne, jeśli sam obiekt nie został dostarczony:

  • m1({}) powróci [0, 0]
  • m2({}) powróci [undefined, undefined]
  • Zarówno m1() i m2() powróci [0, 0]

  • m1({x: 10}) powróci [10, 0]
  • m2({x: 10}) powróci [10, undefined]

Tak więc, jeśli m2 odbiera obiekt będzie destructure dostępne wartości do zmiennych x i y. Jeśli którejś z nich brakuje, jest to undefined. Tylko w przypadku braku całego obiektu dostarczy on obiekt domyślny ({ x: 0, y: 0 }), z którego można pobrać wartości.

m1 podaje jednak wartości domyślne dla obu właściwości, nawet jeśli ich brakuje. A jeśli brakuje całego obiektu, nadal będzie on zawierał te wartości domyślne.

4

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.

+0

'm2()' wytworzy '[0,0]'. 'm2 ({})' byłoby '[niezdefiniowane, niezdefiniowane]' – CodingIntrigue

+0

@CodingIntrigue Dzięki: to oczywiście miałem na myśli. – lonesomeday

+0

Zakładam, że tak, wielkie wyjaśnienie, niezły podział – CodingIntrigue