2014-10-03 4 views
7

Я недавно программировал в Swift. Сегодня я сделал некоторую работу в JavaScipt, когда возник вопрос:Необязательная цепочка в JavaScript

Есть ли что-то похожее на факультативную цепочку в JavaScript? Способ предотвращения undefined is not an object без каких-либо переменных?

Пример:

function test(){ 
    if(new Date() % 2){ 
     return {value: function(){/*code*/}}; 
    } 
} 

test().value(); 

потерпит неудачу половину времени, потому что иногда test возвращается неопределенным.

Единственное решение, которое я могу думать, является функцией:

function oc(object, key){ 
    if(object){ 
     return object[key](); 
    } 
} 

oc(test(), 'value'); 

Я хотел бы быть в состоянии сделать что-то вроде:

test()?.value() 

часть после знака вопроса только выполняется, если test вернул объект.

Но это не очень простой элемент. Есть что-то лучше? Волшебное сочетание операторов?

Редактировать Я знаю, что могу переписать test, чтобы что-то вернуть. Но мне интересно, есть ли что-то вроде дополнительной цепочки. Меня не интересует конкретное решение вышеприведенного примера . То, что я также могу использовать, если не имеет никакого контроля над функцией, возвращающей неопределенный.

+0

Что вы хотите изменить значение(), когда test() возвращает undefined? –

+0

@ Замещено неверно или не определено. Это не имеет значения. – idmean

+0

вы можете обернуть существующую функцию, чтобы вернуть значение по умолчанию в случае неопределенного без перезаписи. вы также можете использовать тройной (x? y: z)() или оператор по умолчанию (x || y)() во время вызова. – dandavis

ответ

5

В простом JavaScript вы должны выполнить проверку типов или структурировать свой код, чтобы вы знали, что объект будет существовать.

CoffeeScript, язык, который скомпилирован до JavaScript, предоставляет экзистенциальный оператор ?. для безопасной цепочки, если вы хотите рассмотреть предварительно обработанный язык.

Существует другая дискуссия here о том, почему вы не можете воспроизвести это поведение в JS.

Существует также обсуждение on the ESDiscuss forums о добавлении экзистенциального оператора в будущую версию JavaScript. Это не очень далеко, хотя, конечно, нигде не приближается к практическому использованию. Больше идеи на данный момент.

+2

Я принял ваш ответ, потому что он действительно отвечает на мой вопрос, в отличие от других ответов ниже, и потому, что он содержит некоторую интересную информацию. – idmean

0

Как насчет возврата функции noop, которая ничего не делает, когда условие не выполняется?

function test(){ 
    if(new Date() % 2){ 
     return {value: function(){/*code*/}}; 
    } 
    return {value: function(){ /* just return a type consistent with the function above */ } 
} 
+0

Это был всего лишь пример. Я говорю о функциях, о которых я не контролирую. – idmean

+0

gotcha. Прости. Вам нужно что-то вроде оператора '? .' в Groovy. В JS нет такой вещи. – sebnukem

0

Вы всегда можете указать return this;, если тест является методом объекта.

Но почему вы хотите предотвратить такие ошибки, создавая макетные функции?

+0

ОП задавал общий вопрос о безопасной цепочке, а не как структурировать определенную функцию, чтобы быть в безопасности. –

3

Вы можете использовать

test() && test().value(); 

или

var testResult = test(); 
testResult && testResult.value(); 

Если вы спросите меня, что это наиболее похоже на опциональное сцепление Свифта.

Смежные вопросы