2017-01-22 12 views
0

Использование деструкции объектов параметров ES6 может потребовать наличия определенных свойств, а также предоставить default values. Dr. Axel Rauschmayer сказал в Six nifty ES6 tricks article, что значения параметров по умолчанию оцениваются только тогда, когда они фактически используются.Деструктурирование объекта параметров с обязательными значениями и пустым объектом

Следующий пример даст больше контекста о том, что я не понимаю:

function ajax({ 
    type = requireParameter("type"), 
    url = requireParameter("url"), 
    data = requireParameter("data"), 
    success = requireParameter("success"), 
    error = requireParameter("error"), 
    isAsync = requireParameter("isAsync") 
    } = {}) { 
    console.log(JSON.stringify({ 
     type, 
     url, 
     data, 
     success, 
     error, 
     isAsync 
    }, null, 2)); 
}; 

function requireParameter(name) { 
    throw new Error (`Missing parameter "${name}"`); 
} 

try { 
    ajax({ 
    type: "get", 
    url: "http://my.api.io", 
    data: {}, 
    success:() => {}, 
    error:() => {}, 
    isAsync: true 
    }); 
} catch (e) { 
    console.warn(e.message); 
} 

Имея {...} = {} или просто {...} на первой функции аргумента ajax будет иметь такое же поведение. Поэтому, когда я тестирую один из двух вариантов, я не могу заключить, что делает логика {...} = {}.

Вопрос, который я сделал здесь:

Зачем нам нужен объект, чтобы быть равным пустой объект на первый аргумент функции ajax?

+1

Параметр '{...} = {}' в параметрах функции просто устанавливает значение по умолчанию, если переданный аргумент не определен. – Phillip

+0

Да, но зачем мне это нужно? Поскольку наличие '{...} = {}' или просто '{...}' будет иметь тот же результат. –

+1

Итак, представьте, что вы это делаете: 'ajax (undefined)'. Вы не можете разрушить неопределенность, поэтому проверка всего типа бесполезна. Таким образом, вы устанавливаете значение по умолчанию для первого аргумента как пустой объект, который может быть разрушен :) – Phillip

ответ

1

В вашем конкретном примере вам не нужно деформировать разрушенный объект на пустой объект, так как ваше предполагаемое поведение - это выброс исключения, когда отсутствует параметр. Можно по умолчанию объект с его свойствами, как так, когда не предусмотрено никаких аргументов:

function ajax({ 
 
    type = requireParameter("type"), 
 
    url = requireParameter("url"), 
 
    data = requireParameter("data"), 
 
    success = requireParameter("success"), 
 
    error = requireParameter("error"), 
 
    isAsync = requireParameter("isAsync") 
 
} = { 
 
    type: "get", 
 
    url: "http://my.api.io", 
 
    data: {}, 
 
    success:() => {}, 
 
    error:() => {}, 
 
    isAsync: true 
 
    }) { 
 
    console.log(JSON.stringify({ 
 
     type, 
 
     url, 
 
     data, 
 
     success, 
 
     error, 
 
     isAsync 
 
    }, null, 2)); 
 
}; 
 

 
function requireParameter(name) { 
 
    throw new Error (`Missing parameter "${name}"`); 
 
} 
 

 
try { 
 
    ajax(/* Don't provide anything and use the default */); 
 
} catch (e) { 
 
    console.warn(e.message); 
 
}

+0

Но когда мне нужно или не нужно в этом случае? –

+1

Это зависит от того, как вы хотите использовать эту функцию. Вы хотите, чтобы это был необходимый аргумент? Если это так, не используйте значение по умолчанию для аргумента и используйте структуру 'requireParameter', которую у вас уже есть. В противном случае используйте разумные значения по умолчанию. –

+0

Это просто пример для понимания деструкции объекта параметра с требуемыми значениями mechanic. –