2017-07-06 5 views
5

En JavaScript, comment est la déclaration suivante à interpréter:priorité des opérateurs:! et attendre

cond1 && !await f() 

Voici un extrait de la ligne

if(cond1 && !await f()){ 
    do_stuff(); 
} 

dans une application de production. chrome semble être très bien avec elle, mais sur ios cela provoque une erreur de lecture

unexpected identifier 'f'. Expected ')' to end an if condition. 

Il semble que ios tourne !await f() en (!await)(f()) au lieu de !(await f()).

Maintenant à ma question: Selon ECMA-262 quelle est l'interprétation correcte de la ligne ci-dessus?

p.s .: Nous avons fixé le code pour ios en changeant à

var f_result = await f(); 
if(cond1 && !f_result){ 
    do_stuff(); 
} 
+0

Il semble que votre moteur ios JS ne supporte tout simplement pas async/wait. Quelle version d'application (navigateur) utilisez-vous spécifiquement? – Bergi

+0

@Bergi bien, nos appareils de production ios heureusement faire async/attendre disent le contraire. Ils étouffent seulement sur cette déclaration exacte. – niklasfi

+0

@Bergi à propos de la version: ce serait le courant. 10.3. http://caniuse.com/#search=await – niklasfi

Répondre

2

Cela n'a rien à voir avec la priorité des opérateurs. Étant donné que les deux sont des opérateurs de préfixe unaire, il n'y a qu'une seule façon cette expression peut être interprétée - tous delete, void, typeof, +, -, ~, ! et await sont analysés avec le même objectif de production et peut être arbitrairement imbriquées. Et oui, c'est une syntaxe valide dans ES2017.