2017-02-07 19 views
5

Я могу полностью понять, что ECMAScript 6 создал много возможностей для работы с такими функциями, как функции стрелок.Параметры JavaScript по умолчанию для функции

Поскольку я не очень хорошо знаком с новым материалом, когда речь идет о параметрах по умолчанию для функции. Как интерпретировать различия между следующим образом определяющих функций:

Функция 1:

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

Функция 2:

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

Я думаю, что с помощью javascript вы можете сделать это с помощью другого подхода. было бы что-то вроде функции m1 (x) {x || (Х = 0); } – Husamuddin

+0

@lsqleakey вы спрашиваете, как создать функцию со стрелками по умолчанию в ES6? –

ответ

0

m1 предоставляет значения по умолчанию для x и y, а m2 просто destructures x и y из предоставленного объекта и предоставляет только значения по умолчанию, если сам объект не указан:

  • m1({}) вернется [0, 0]
  • m2({}) вернется [undefined, undefined]
  • Оба m1() и m2() вернутся [0, 0]

  • m1({x: 10}) вернется [10, 0]
  • m2({x: 10}) вернется [10, undefined]

Таким образом, если m2 получает объект, он будет destructure доступных значений переменных x и y. Если какой-либо из них отсутствует, это undefined. Только если весь объект отсутствует, он предоставит объект по умолчанию ({ x: 0, y: 0 }), из которого можно получить значения.

m1, однако, предоставляет значения по умолчанию для обоих свойств, даже если они отсутствуют. И если весь объект отсутствует, он по-прежнему будет предоставлять эти значения по умолчанию.

4

Разница ясна, когда вы попробуйте передать что-то ваши функции:

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] 

Ваш первый синтаксис (m1({x = 0, y = 0} = {})) делает три вещи:

  • Во-первых, он обеспечивает первый аргумент по умолчанию в функция, которая является пустым объектом. Если первый аргумент не задан (m1()), то используется пустой объект по умолчанию (т. Е. Он становится m1({}))
  • Во-вторых, ваш код извлекает свойства x и y этого объекта.
  • Если значение равно undefined, ему присваивается значение по умолчанию 0.

m2({x, y} = { x: 0, y: 0 }) делает что-то совсем другое:

  • Сначала он обеспечивает по умолчанию первый параметр функции, которая является объектом {x: 0, y: 0}. Если первый аргумент не передан, этот объект используется. Если передан какой-либо аргумент, отличный от undefined, это значение используется вместо этого.
  • Во-вторых, код извлекает объекты x и y с этого объекта. Если они undefined, это то, что вы получите.

Первый вариант (параметр со значением по умолчанию, деструктурированный с более стандартными значениями) почти наверняка то, что вы хотите. Второй вариант означает, что ваш код не имеет разумных/полезных значений по умолчанию для свойства, если аргументы переданы.

+0

'm2()' будет производить '[0,0]'. 'm2 ({})' будет '[undefined, undefined]' – CodingIntrigue

+0

@CodingIntrigue Спасибо: это, конечно, то, что я имел в виду. – lonesomeday

+0

Предположительно, отличное объяснение, хороший пробой – CodingIntrigue