1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| // Conversion implicite des string en number
var a = '5';
var b = '3';
console.log(a - b, typeof (a-b)); // 2, number. Les opérandes sont implicitement converties durant le calcul et donnent un résultat de type number
// Par contre, les opérandes ne sont pas modifiées
console.log(a, typeof a); // '5', string
console.log(b, typeof b); // '3', string
// Conversion implicite en boolean
// Grâce à ce principe, l'instruction if, par exemple, peut prendre n'importe quelle valeur.
var testedValues = [undefined, null, false, -0, +0, NaN, '', 1, -1, 'a', true, Infinity, {}, []], len = testedValues.length, i = 0;
for (; i<len ; i++) {
console.log(testedValues[i] + ' => implicitement convertie à ' + (testedValues[i] ? 'true' : 'false'));
}
/*
Tu l'auras compris, undefined, null, false, -0, +0, NaN, '' sont implicitement convertis en false, le reste à true
undefined => implicitement convertie à false
null => implicitement convertie à false
false => implicitement convertie à false
0 => implicitement convertie à false
0 => implicitement convertie à false
NaN => implicitement convertie à false
'' => implicitement convertie à false
1 => implicitement convertie à true
-1 => implicitement convertie à true
a => implicitement convertie à true
true => implicitement convertie à true
Infinity => implicitement convertie à true
[object Object] => implicitement convertie à true
[] => implicitement convertie à true
*/
// Conversion implicite en string
// l'opérateur + est particulier. Il a le rôle de concaténation de string et d'addition de number. Analyse de l'expression de gauche à droite. Rant qu'il rencontre des number : addition. Dès qu'une string apparaît : concaténation.
var x = '5';
console.log(x + 1); // 51
console.log(1 + x); // 15
console.log(1 + 3 + x); // 45
// Conversion implicite des Object en string ou en number
// Quand JavaScript attend un string ou un number (exemple lors d'une concaténation / addition), il va tenter de convertir l'objet dans le type souhaité.
// Si JavaScript attend un number, mais qu'il rencontre un Object : Il va checker s'il contient une méthode valueOf, si oui, retourne la valeur. Sinon, il check s'il contient une méthode toString, si oui, retourne la valeur. Sinon, NaN.
var a = { valueOf: function () { return 5 } };
3 * a; // 15, se sert de valueOf()
var a = { bipbip: function () { return 5 }, toString: function () { return 7 } };
3 * a; // 21, se sert de toString()
var a = { bipbip: function () { return 5 } };
3 * a; // NaN, pas de méthode valueOf ou toString
// Si JavaScript attend une string, même principe que ci-dessus
var a = { toString: function () { return 'toto' } };
'je suis ' + a; // "je suis toto", se sert de toString de l'objet a
var a = { bipbip: function () { return 'toto' } };
'je suis ' + a; // 'je suis [object Object]', toString est absent dans a, donc se sert de toString de a.prototype (soit la méthode toString native de Object). |
Partager