SlideShare une entreprise Scribd logo
1  sur  266
Télécharger pour lire hors ligne
JavaScript pour le
développeur Java
Christophe Jollivet
Christophe Jollivet
• Neurobiologiste
• Informaticien
• Homme de communauté
• @jollivetc
Sondages
Qui connait JavaScript ?
Autrement qu’un
copier-coller du web ?
Les autres, qui se dit
qu’il devrait apprendre
JavaScript ?
Pourquoi JavaScript ?
Atwood Law
• «Any application that can be written in
JavaScript, will eventually be written in
JavaScript»
• http://www.codinghorror.com/blog/
2007/07/the-principle-of-least-power.html
Histoire
Histoire
Histoire
Histoire
Histoire
Histoire
• Erreur en ligne XXX
• Erreur en ligne XXX
• Cela fait un moment que c’est le bazar mais
là je ne m’en sors plus
La révélation
La révélation
• Projets en HTML 5
• De vrais développeurs JavaScript
• Des ateliers
J’apprend JavaScript
«JavaScript is the only
language that people feel they
don’t need to learn to use it»
Doug Crockford
Java is to JavaScript
Java is to JavaScript
What ham is to hamster
http://blog.movereem.nl/images/javascript-the-good-parts-the-definitive-guide.jpg
http://jsbooks.revolunet.com/
Tour de JavaScript
Types
Types
• Number, String, Boolean, undefined
• Object, function
• Faiblement typé
Number
• 64 bits floating point
• IEEE-754 (aka Double)
• Ecriture littérale
• 1.024e+3 === 1024
• Méthodes (toExponential, toFixed,
toPrecision...)
valeurs approximatives
valeurs approximatives
(0.1 + 0.2) + 0.3 === 0.1 + (0.2 + 0.3)
valeurs approximatives
(0.1 + 0.2) + 0.3 === 0.1 + (0.2 + 0.3)
FALSE
valeurs approximatives
9007199254740992 === 9007199254740992 + 1
(0.1 + 0.2) + 0.3 === 0.1 + (0.2 + 0.3)
FALSE
valeurs approximatives
9007199254740992 === 9007199254740992 + 1
TRUE
(0.1 + 0.2) + 0.3 === 0.1 + (0.2 + 0.3)
FALSE
Objet
Objet
Objet
• Container de propriétés avec un nom et une
valeur
Objet
• Container de propriétés avec un nom et une
valeur
• nom de propriété est une string y compris ""
Objet
• Container de propriétés avec un nom et une
valeur
• nom de propriété est une string y compris ""
• propriété est n’importe quelle valeur sauf
undefined
Déclaration objet
Déclaration objet
Déclaration objet
Déclaration objet
Déclaration objet
Déclaration objet
Déclaration d’objet
Déclaration d’objet
Déclaration d’objet
Accès aux valeurs
Introspection
Objet et héritage
Création d’objet
Problème
surface surface
longueur
largeur
longueur
largeur
unRectangle anotherRectangle
Problème
surface surface
longueur
largeur
longueur
largeur
unRectangle anotherRectangle
Occupation mémoire
Héritage par prototype
• Un objet hérite directement d’un autre
objet, il n’y a pas de notion de classe
• On place les propriétés communes dans le
prototype pour la mémoire
Création d’objet
Solution
longueur
largeur
longueur
largeur
unRectangle anotherRectangle
surface
Prototype
Extension
• Ajout d’une méthode dans un prototype
• la méthode est alors disponible pour
toutes les instances existantes et à venir
Résolution de
propriété
• Se fait en remontant la chaîne de prototype
• il est possible de surcharger une propriété
for in
• itérateur sur les propriétés de l’objet
Les propriétés du prototype sont listées
hasOwnProperty
• TRUE si la propriété est à l’objet et pas au
prototype
Attention si foo a une propriété ‘hasOwnProperty’
Fonctions
Fonction
Conserve une référence sur son
contexte de création
Fonction
Conserve une référence sur son
contexte de création
Arguments
Arguments
Arguments
• Il n’y a pas d’erreur si le nombre d’arguments
et paramètres ne correspondent pas
Arguments
• Il n’y a pas d’erreur si le nombre d’arguments
et paramètres ne correspondent pas
• arguments contient la liste des arguments
Arguments
Arguments
varargs
apply
• Permet l’invocation d’une fonction en lui
passant un contexte et des paramètres
Apply
This
4 patterns
• méthode
• fonction
• new
• apply
this et méthode
• pattern : bar.foo()
• this référence l’objet contenant la méthode
• binding à l’invocation
this et fonction
• pattern : foo()
• this est l’objet global, même si la fonction
est déclarée dans une méthode
this et fonction
this et fonction
Pollution de l’espace global
this et fonction
this et fonction
this et fonction
this et new
• pattern : var bar = new Foo();
• création d’un objet avec lien au prototype
de la fonction et this pointe cet objet
this et new
this et new
this et new
this et apply
• pattern : foo.apply(bar, args);
• this est lié à bar
Apply
Coercition de type
Coercition de type
Coercition de type
• Forcer le type d’une variable
Coercition de type
• Forcer le type d’une variable
• == fait la coercition de type
Coercition de type
• Forcer le type d’une variable
• == fait la coercition de type
• === ne fait pas la coercition de type
Coercition de type
• '1' ==1 TRUE
• '1'===1 FALSE
Coercition de type
Coercition de type
• false == 'false' FALSE
Coercition de type
• false == 'false' FALSE
• false == '0' TRUE
Coercition de type
• false == 'false' FALSE
• false == '0' TRUE
• " trn " == 0 TRUE
Coercition de type
• false == 'false' FALSE
• false == '0' TRUE
• " trn " == 0 TRUE
• ",,," == new Array(4) TRUE
Coercition de type
• false == undefined FALSE
• false == null FALSE
• null == undefined TRUE
Coercition de type
Coercition de type
• if( foo === null || foo === undefined )
Coercition de type
• if( foo === null || foo === undefined )
• if( foo == null )
Coercition type
(bonus)
Coercition type
(bonus)
• foo=+foo
Coercition type
(bonus)
• foo=+foo
• foo = parseInt(foo,10)
Coercition type
(bonus)
• foo=+foo
• foo = parseInt(foo,10)
• foo = parseFloat(foo,10)
Coercition type
(bonus)
• foo=+foo
• foo = parseInt(foo,10)
• foo = parseFloat(foo,10)
‘10.2a’
Coercition type
(bonus)
• foo=+foo
• foo = parseInt(foo,10)
• foo = parseFloat(foo,10)
‘10.2a’
NaN
Coercition type
(bonus)
• foo=+foo
• foo = parseInt(foo,10)
• foo = parseFloat(foo,10)
‘10.2a’
NaN
10
Coercition type
(bonus)
• foo=+foo
• foo = parseInt(foo,10)
• foo = parseFloat(foo,10)
‘10.2a’
NaN
10
10.2
Coercition et
transitivité
Coercition et
transitivité
• 0 =='' TRUE
Coercition et
transitivité
• 0 =='' TRUE
• 0 =='0' TRUE
Coercition et
transitivité
• 0 =='' TRUE
• 0 =='0' TRUE
• ''=='0'
Coercition et
transitivité
• 0 =='' TRUE
• 0 =='0' TRUE
• ''=='0' FALSE
Piège
Truthy et Falsy
Truthy et Falsy
• false, "", 0, null, undefined, NaN, void sont
FALSY
Truthy et Falsy
• false, "", 0, null, undefined, NaN, void sont
FALSY
• Tous les autres sont TRUTHY
Truthy et Falsy
• false, "", 0, null, undefined, NaN, void sont
FALSY
• Tous les autres sont TRUTHY
• même "0" et "FALSE"
Truthy et Falsy
• false, "", 0, null, undefined, NaN, void sont
FALSY
• Tous les autres sont TRUTHY
• même "0" et "FALSE"
• if( array.length )
Truthy et Falsy
• false, "", 0, null, undefined, NaN, void sont
FALSY
• Tous les autres sont TRUTHY
• même "0" et "FALSE"
• if( array.length )
• if( string )
Valeur par défaut
Valeur par défaut
Attention si b vaut 0 car 0 est falsy
Appel sécurisé
Point virgule
Point virgule
• Séparation d’expression
Point virgule
• Séparation d’expression
• Pas toujours obligatoire
Point virgule
• Séparation d’expression
• Pas toujours obligatoire
• Pose problème dans la minification
Point virgule
• Séparation d’expression
• Pas toujours obligatoire
• Pose problème dans la minification
• Grand débat sur quand il est nécessaire
Point virgule
https://github.com/twitter/bootstrap/issues/3057
Point virgule
Point virgule
Scope
Scope
Scope
• Syntaxe à « la C » avec bloc
Scope
• Syntaxe à « la C » avec bloc
• Le scope est la fonction
Scope
• Syntaxe à « la C » avec bloc
• Le scope est la fonction
• Déclaration de variable avec «var»
Scope
• Syntaxe à « la C » avec bloc
• Le scope est la fonction
• Déclaration de variable avec «var»
• /! déclaration automatique
Déclaration
Déclaration
Hoisting
• Déplace les déclarations en tête du bloc
Hoisting
Hoisting
Closure
• Une fonction objet contient :
• une fonction (nom, paramètres, body)
• une référence à l’environnement où elle a
été créée (contexte)
Closure
Closure
•Pollution de Global
•Risque de collision de nom
•names est modifiable
Closure
Closure
•Lent car construction de names à chaque appel
Closure
Closure
Closure
Exception
throw
try catch finally
Séparation de code
namespace
• Séparation de code pour limiter les
collisions de nom
• Masquer le fonctionnement de votre
librairie
Namespace
•Tout n’est pas dans un bloc
•Tout est public
IIFE
• Immediatly Invoked Function Expression
• Fonction exécutée au chargement du script
et qui renvoie un objet avec les fonctions/
variables utiles.
IIFE
IIFE
IIFE
IIFE
Callback
Callback
• fonction donnée en paramètre pour des
opération asynchrone
callback
callback
callback
Promise
Callback
Pyramide of doom
Promise
• Objet avec une méthode then qui prend 3
paramètres
• success callback
• failure callback
• progress callback (pas obligatoire)
Promise
• 3 états possibles
• unfulfilled or pending
• fulfilled or resolved
• failed or rejected
Résumé
Résumé
• JavaScript s’apprend !
• Scope / Hoisting
• this (constructeur et callback)
• Héritage par prototype
Industrialisation ?
JS c’est lent
• Enormes progrès sur lesVM (V8, Rhino,
XMonkey)
• Enormes progrès sur lesVM (V8, Rhino,
XMonkey)
• compilateur JIT
• Enormes progrès sur lesVM (V8, Rhino,
XMonkey)
• compilateur JIT
• Cible du transpiling
• Enormes progrès sur lesVM (V8, Rhino,
XMonkey)
• compilateur JIT
• Cible du transpiling
• Coffeescript, Dart, GWT...
JS n’est pas maintenable
Framework
Framework
Client
Framework
Client
Vert.X
Serveur
Framework
Client
Vert.X
Serveur
Base de données
Framework
Client
Vert.X
Serveur
Base de données Desktop
• One language to rule them all
• One language to rule them all
• Write once run anywhere ?
JS est artisanal
Industrialisation
Tests
Industrialisation
Build
Tests
Industrialisation
Build
Audit
Tests
Structure
Modularisation
• AMD :Asynchronous Module Definition
• Chargement asynchrone en parallèle dans
son propre scope
• requirejs, Dojo, JQuery, Curl, Backdraft
Modularisation
Modularisation
Modularisation
Modularisation
Modularisation
Grunt
• Ant + Ivy du JavaScript
• 2 fichiers
• package.json -> dépendances et plugins
• grunt.js -> configuration
grunt.js
package.json
NPM
• Node Package Manager
• provisionneur de dépendances
Bower
• Provisionnement de dépendances pour la
webapp
Yeoman
• Scaffolding
• Intégration deYo, Grunt et Bower
• Générateur
Tests
Jasmine
Jasmine
Jasmine
Jasmine
Jasmine spies
Jasmine spies
Jasmine spies
Jasmine spies
Alternative
• Mocha.js
• Qunit
Bonus
• Rapport de tests dans différents formats
• Couverture de code
Chai.js
Sinon.js
• Mock, Spies.....
• Fake sur XMLHttpRequest
• Fake sur Timer
CasperJs
• Headless scriptable Webkit
• Screenshot
• Test recorder dans Chrome
CasperJs
Integration Continue
Job dédié
• commande shell
Plugin Maven
• Lancement des outils en ligne de
commande
Aggregation résultats
• Reporter au format XUnit
• Plugin Jenkins TAP
Framework
Frameworks
Frameworks
http://addyosmani.github.com/todomvc/
Frameworks
• Fonctionnalités diverses
• binding
• routing
• templating
• ......
Frameworks
• Backbone
• KnockoutJS
• AngularJS
• ember.js
• Meteor
• chfo
Qualité
use strict
• En haut du script ou dans une fonction
• Transforme en erreur certaines fautes
• déclaration implicite de variable
• syntaxe octale
• double propriété
JSLint / JSHint
• attention cela fait mal.
• utiliser dès le début avant les mauvaises
habitudes !
• en ligne ou en plugin
Sonar
• Plugin pour le JavaScript
• tests, coverage, métriques,
Tooling
IDE
IDE
• Difficile....
IDE
• Difficile....
• Il faut essayer
Console des
navigateurs
• Debugging
• Test en live
Questions ?
Creative Commons
Attribution —You must attribute the work in the
manner specified by the author or licensor (but not in
any way that suggests that they endorse you or your use
of the work).
Noncommercial —You may not use this work for
commercial purposes.
Share Alike — If you alter, transform, or build upon
this work, you may distribute the resulting work only
under the same or similar license to this one.

Contenu connexe

Tendances

Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Julien Jakubowski
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
Fredy Fadel
 
Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6
Julien CROUZET
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
guest6e3bed
 

Tendances (15)

Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 
Javascript pour les Développeurs WEB
Javascript pour les Développeurs WEBJavascript pour les Développeurs WEB
Javascript pour les Développeurs WEB
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
Javascript les générateurs (generators)
Javascript   les générateurs (generators)Javascript   les générateurs (generators)
Javascript les générateurs (generators)
 
Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6
 
Présentation de ECMAScript 6
Présentation de ECMAScript 6Présentation de ECMAScript 6
Présentation de ECMAScript 6
 
Présentation JavaScript
Présentation JavaScriptPrésentation JavaScript
Présentation JavaScript
 
Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes
 
Formation VBA Excel
Formation VBA ExcelFormation VBA Excel
Formation VBA Excel
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Votre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prodVotre mission ? Découvrir Haskell et le mettre en prod
Votre mission ? Découvrir Haskell et le mettre en prod
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
Kevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NETKevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NET
 

Similaire à JavaScript pour le développeur Java

Similaire à JavaScript pour le développeur Java (11)

Formation JavaScript - Guide de démarrage rapide
Formation JavaScript - Guide de démarrage rapideFormation JavaScript - Guide de démarrage rapide
Formation JavaScript - Guide de démarrage rapide
 
coursphp-230411142526-784b67e9.pdf
coursphp-230411142526-784b67e9.pdfcoursphp-230411142526-784b67e9.pdf
coursphp-230411142526-784b67e9.pdf
 
COURS PHP.pptx
COURS PHP.pptxCOURS PHP.pptx
COURS PHP.pptx
 
Aiguisez votre c#
Aiguisez votre c#Aiguisez votre c#
Aiguisez votre c#
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
JavaScript prise en main et fondamentaux
JavaScript prise en main et fondamentauxJavaScript prise en main et fondamentaux
JavaScript prise en main et fondamentaux
 
Langage C#
Langage C#Langage C#
Langage C#
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
GetText / Rails - FR
GetText / Rails - FRGetText / Rails - FR
GetText / Rails - FR
 
GetText / Rails
GetText / RailsGetText / Rails
GetText / Rails
 
Bbd dans le flow nov.2012
Bbd dans le flow nov.2012Bbd dans le flow nov.2012
Bbd dans le flow nov.2012
 

JavaScript pour le développeur Java