2014-10-03 14 views
7

Ho programmato molto in Swift di recente. Oggi ho fatto un po 'di lavoro in JavaScipt quando mi è venuta la domanda:Concatenamento opzionale in JavaScript

C'è qualcosa di simile al concatenamento opzionale in JavaScript? Un modo per prevenire undefined is not an object senza alcuna variabile?

Esempio:

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

test().value(); 

mancherà la metà del tempo perché a volte test rendimenti indefinito.

L'unica soluzione che viene in mente è una funzione:

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

oc(test(), 'value'); 

Vorrei essere in grado di fare qualcosa di simile:

test()?.value() 

La parte dopo il punto interrogativo viene eseguito solo se test ha restituito un oggetto.

Ma questo non è molto elegante. C'è qualcosa di meglio? Una magica combinazione di operatori?

Modifica So che potrei riscrivere test per restituire qualcosa. Ma mi chiedo se c'è qualcosa come il concatenamento opzionale. Non sono interessato a una soluzione specifica al precedente esempio . Qualcosa che posso usare anche se non ho il controllo sulla funzione di ritorno indefinito.

+0

cosa si desidera value() per tornare quando test() restituisce undefined? –

+0

@ZaheerAhmed falso o indefinito. Non importa davvero. – idmean

+0

è possibile avvolgere la funzione esistente per restituire un valore predefinito in caso di non definito, senza riscrivere. puoi anche usare un ternario (x? y: z)() o un operatore predefinito (x || y)() al momento della chiamata. – dandavis

risposta

5

In plain JavaScript è necessario eseguire controlli di tipo o strutturare il codice in modo da sapere che un oggetto esisterà.

CoffeeScript, un linguaggio che viene compilato in JavaScript, fornisce un operatore esistenziale ?. per un concatenamento sicuro se si desidera prendere in considerazione una lingua preelaborata.

C'è un'altra discussione here sul motivo per cui non è possibile riprodurre questo comportamento in JS.

C'è anche una discussione on the ESDiscuss forums sull'aggiunta di un operatore esistenziale a una versione futura di JavaScript. Tuttavia, non sembra molto lontano, certamente non molto vicino all'uso pratico. Più di un'idea a questo punto.

+2

Ho accettato la tua risposta perché risponde veramente alla mia domanda a differenza delle altre risposte qui sotto e perché fornisce alcune informazioni interessanti. – idmean

0

Che dire restituire una funzione noop che non fa nulla quando la condizione non viene soddisfatta?

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

Questo era solo un esempio. Sto parlando di funzioni di cui non ho il controllo. – idmean

+0

gotcha. scusa. Hai bisogno di qualcosa come l'operatore '? .' in Groovy. Non c'è niente di simile in JS. – sebnukem

0

Si può sempre return this; se il test è un metodo oggetto.

Ma perché si desidera impedire tali errori creando funzioni fittizie?

+0

L'OP stava facendo una domanda generica sul concatenamento sicuro, non su come strutturare una funzione specifica per essere sicuri. –

3

È possibile utilizzare

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

o

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

Se mi chiedete questo è più simile a concatenamento opzionale di Swift.