11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Je cherche à faire une petite web app JS pour réviser le chiffrage d'accords Jazz.
Je bloque actuellement sur une incompréhension quant au typage dynamique.

Dans mon code je dois additionner plusieurs variables à priori entière, or, je récupère systématiquement NaN. Suspectant que JS transtypait en String, j'ai essayé de forcer le type en Entier (via parseInt()) mais sans succès.

Je dois certainement rater quelquechose, mais là je sêche !

Voilà ma sortie Firebug :

->showChord('Eb7');
base_position : 12
keys[chord.substr(0,1)] : 4
alteration : -1
NaN




function showChord(chord) {
	//Eb7
	var keys = {C:0, D:2, E:4, F:5, G:7, A:9, B:11};
	var alteration = 0;
	var base_position = 12;
	var fondamental = 0;
	
	//find if there is any alteration
	if (chord.substr(1,1) == 'b') {
		alteration -= 1;
	} else if (chord.substr(1,1) == '#') {
		alteration += 1;
	}
	
	//determine where to put the chord for better visibility	
	//if 9th or 13th 
	//console.log(keys["E"]);
	
	console.log("base_position : "+base_position);
	console.log("keys[chord.substr(0,1)] : "+keys[chord.substr(0,1)]);
	console.log("alteration : "+alteration);
	
	//console.log("Number.isNaN(base_position) : " + Number.isNaN(base_position));
	//console.log("Number.isNaN(keys[chord.substr(0,1)]) : "+Number.isNaN(keys[chord.substr(0,1)]));
	//console.log("Number.isNaN(alteration)) : "+Number.isNaN(alteration));
	//console.log("Number.isNaN(parseInt(parseInt(base_position,10) + parseInt(keys[chord.substr(1,1)],10),10)) : " +
	//			Number.isNaN
	//				(parseInt( 
	//					parseInt(base_position,10) + 
	//					parseInt(keys[chord.substr(1,1)],10)
	//					,10)
	//				)
	//			);
	//console.log("Number.isNaN(keys[chord.substr(1,1)] + alteration) : " + Number.isNaN(keys[chord.substr(1,1)] + alteration));
	
	//console.log( "fondamental + base_position : "+ fondamental + base_position );
	//console.log( "base_position + parseInt(keys[chord.substr(1,1)],10) : "+base_position + parseInt(keys[chord.substr(1,1)],10) );
	//console.log( "keys[chord.substr(1,1)] + alteration : "+keys[chord.substr(1,1)] + alteration );
	
	fondamental += base_position + keys[chord.substr(1,1)] + alteration;
	//console.log("keys[chord.substr(1,1)] + alteration : "+keys[chord.substr(1,1)] + alteration);
	//console.log("parseInt(keys[chord.substr(1,1)],10) : "+parseInt(keys[chord.substr(1,1)],10));
	//console.log("parseInt(alteration,10) : "+parseInt(alteration,10));
	console.log(fondamental);
	
	//drawNote(fondamental);
}

Modifié par morieff (05 Oct 2015 - 15:32)
Renvoie NaN Smiley decu
(avec ou sans base).

fondamental = fondamental + base_position + parseInt(keys[chord.substr(1,1)],10) + parseInt(alteration,10);

renvoie Nan également.

Ce que je ne comprends pas c'est que je déclares mes variables comme entières me semble-t-il.

var alteration = 0;
var base_position = 12;
var fondamental = 0; 


Donc selon l'évaluation de
fondamental = fondamental + base_position + parseInt(keys[chord.substr(1,1)],10) + parseInt(alteration,10);


Il devrait capter que je joue avec des entiers ?

Print des tests :
Number.isNaN(base_position) : false
Number.isNaN(keys[chord.substr(0,1)]) : false
Number.isNaN(alteration)) : false

Même résultat avec du spam de parseInt() :
fondamental = parseInt(fondamental,10) + parseInt(base_position,10) + parseInt(keys[chord.substr(1,1)],10) + parseInt(alteration,10);

renvoie NaN
Modifié par morieff (05 Oct 2015 - 15:26)
keys[chord.substr(1,1)

c'est = "null" non ? parce que je vois pas keys[B]
Modifié par JENCAL (05 Oct 2015 - 15:26)
Oh purée. En effet, une vieille erreur de copier-coller.
J'allais taper dans une propriété nulle de mon objet.
Je récupérais donc "undefined".

Merci !