2016-09-09 2 views
1

У меня есть этот код:Как использовать свойство дополнительного объекта аргумента

function getName(type, options) { 

    if (type == 'dog') { 
     var name = 'Rover'; 
    } 
    else { 
     var name = options.name || 'Buddy' 
    } 

    return name; 
} 
alert(getName('cat')); 

Я ожидал, что переменную name будет присвоен «Buddy», но вместо этого я получил эту ошибку:

Cannot read property 'name' of undefined

Есть ли простой способ справиться с этим? Я надеюсь на однострочный фрагмент кода. Я думал об использовании этого, но это, кажется, долго и излишне сложным:

var name = (options !== undefined && options.name) ? options.name : 'Buddy'; 

ответ

5

Вы можете упростить проверку на options && options.name || 'Buddy', потому что каждый объект truthy.

1

Используя необязательные параметры в es6, вы можете просто по умолчанию использовать пустой объект, чтобы не иметь дело с undefined.

function(type, options = {}) { 
    return type === 'dog' ? 'Rover' : options.name || 'Buddy'; 
} 
0

Вы можете определить значение по умолчанию для свойства аргумента с помощью деконструкции (см Setting a function parameter's default value). Добавление = {} делает весь аргумент опционным, позволяя getName('cat') против getName('cat', {}).

Обратите внимание, что вы не получаете весь объект, переданный как аргумент - только свойства, которые вы определили: getName('bat', {somekey: 'I will not be passed to the function!'}).

function getName(type, {name = 'Buddy'} = {}) { 
 
    if (type == 'dog') { 
 
    name = 'Rover'; 
 
    } 
 
    return name; 
 
} 
 
alert(` 
 
cat: ${getName('cat')}, 
 
cat with name: ${getName('cat', {name: 'Puss'})}, 
 
dog: ${getName('dog')}, 
 
dog with name: ${getName('dog', {name: 'Spot'})}`);