2017-05-27 2 views
0

opérateur + = production de résultat inattendu javascript

function range(start, end, st) { 
 
    var arr = []; 
 
    var counter = start; 
 
    while (counter <= end) { 
 
    arr.push(counter); 
 
    counter += st || counter + 1; 
 

 
    } 
 
    return arr; 
 
} 
 

 
console.log(range(1, 10));

ce produit résultat inattendu

cependant ceci:

counter = counter + st || counter + 1; 

produit le résultat attendu toute idée pourquoi?

+0

peut être utile si vous avez montré ce qu'il vous donne par rapport à ce que vous attendez –

+1

Parce que _operator precedence_. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence – CBroe

+0

@CrayonViolent supposé ajouter 1 pour contrer si 'st' n'a pas été fourni car il sera indéfini – yokimoto

Répondre

1

Je ne sais pas ce que vous attendez le code à faire, mais counter += st || counter + 1 est équivalent à

counter += (st || (counter + 1)); 

qui équivaut à

if(st) { 
    counter = counter + st; 
} 
else { 
    counter = counter + counter + 1; 
} 

D'autre part counter = counter + st || counter + 1 est équivalent à

counter = (counter + st) || (counter + 1); 

ce qui équivaut à

if(counter + st) { 
    counter = counter + st; 
} 
else { 
    counter = counter + 1; 
} 

Donc, ils font des choses très différentes. Je suppose que la préséance de l'opérateur vous rejette.

1

La différence est que

counter += st || counter + 1; 

la même signification que

counter = counter + (st || counter + 1); 

que counter = counter + st || counter + 1 signifie counter = (counter + st) || (counter + 1).


Dans votre exemple de code st est undefined, de sorte que la boucle réalise effectivement

counter += counter + 1; 

chaque fois, ce qui équivaut à

counter = counter * 2 + 1; 

Par conséquent, les grandes bennes.


D'autre part, dans

counter = counter + st || counter + 1; 

st étant undefined signifie counter + st est NaN, qui compte comme faux, donc cela va effectivement

counter = counter + 1; 

qui équivaut à

counter += 1; 

Cependant, cela ne fonctionne que par accident.Si vous appelez votre fonction avec des arguments différents, tels que:

function range(start, end, st) { 
 
    var arr = []; 
 
    var counter = start; 
 
    while (counter <= end) { 
 
    arr.push(counter); 
 
    counter = counter + st || counter + 1; 
 
    } 
 
    return arr; 
 
} 
 

 
console.log(range(-2, 2, 2));

Le résultat est [ -2, -1, 1 ] au lieu du [ -2, 0, 2 ] prévu.


Vous pouvez corriger votre code en faisant

counter += st || 1; 

à la place.

0

Il fait exactement ce qui est codé, counter = counter + st || counter + 1; fait ce que vous voulez, dans votre exemple de code que vous avez utilisé counter += st || counter + 1;. Si vous voulez la forme plus courte dans votre code, vous devez utiliser counter += st || 1; comme cela s'assure que vous n'ajoutez pas counter à lui-même.

J'espère que je pourrais le faire savoir! À votre santé!