/*
 * Script permettant d'explorer certaines caractéristiques du langage
 * Ce script est conçu pour être exécuté sous node.js
 *
 * Louis Martin 2012-10-05
 */
 
console.log( "Début de l'exécution" );
 
// Pour utiliser les assertions
var assert = require( 'assert' );
 
// Une variable lorsqu'elle est définie à un contenu indéterminé
var a;
assert.strictEqual( a, undefined );
assert.strictEqual( typeof a, "undefined" );
 
// Une variable peut pointer vers un nombre
a  = 1;
assert.strictEqual( typeof a , "number" );
 
// Une variable peut pointer vers une chaine de caractères (une chaine vide est une chaine de caractères de longueur zéro)
a = "";
assert.strictEqual( a.length, 0 );
assert.strictEqual( typeof a , "string" );
 
// Une variable peut pointer vers un booléen
a = true;
assert.strictEqual( typeof a , "boolean" );
 
// Une variable peut pointer vers une fonction
a = function( x ) {
    return x * 2;
}
assert.strictEqual( a( 3 ), 6 );
assert.strictEqual( typeof a , "function" );
 
// Une variable peut pointer vers un objet
a = new Date();
assert.strictEqual( typeof a , "object" );
 
// Une variable peut pointer vers un tableau
a = [ 1, 2, 3 ];
assert.strictEqual( typeof a , "object" );
 
// Une variable peut être mise à null, indiquant qu'elle ne pointe sur rien (null est un objet)
a = null;
assert.strictEqual( typeof null , "object" );
 
// Caractéristiques de NaN
 
// Si une opération mathématique est effectuée avec un opérant ne pouvant être
// transformé en nombre, le résultat est NaN
a = 2 * "toto";
// NaN est du type "number"
assert.strictEqual( typeof a , "number" );
// NaN est différent de tous les nombres y compris de lui-même
assert.notEqual( NaN, NaN );
assert.notEqual( a, NaN );
// Pour vérifier si un nombre est égal à NaN, il faut utliser la fonction isNaN()
assert.strictEqual( isNaN( a ), true );
 
console.log( "Fin de l'exécution" );