Aller au contenu

JavaScript

Un article de Wikipédia, l'encyclopédie libre.

JavaScript
Logo.
Image illustrative de l’article JavaScript

Date de première version Voir et modifier les données sur Wikidata
Paradigme Multi-paradigmes : script, orienté objet (orienté prototype), impératif, fonctionnel
Auteur Brendan Eich
Développeurs Netscape Communications Corporation, Mozilla Foundation
Dernière version 13 - ECMA-262 (Juin 2022)
Version en développement ECMAScript 2025 ()[2]Voir et modifier les données sur Wikidata
Typage dynamique, faible
Normes ECMA-262
ISO/CEI 16262
Dialectes JavaScript, JScript, ECMAScript
Influencé par AWK, Self, Scheme[3], Perl, C, C++, Java, Python
A influencé JScript, JScript .NET, Objective-J, TIScript
Implémentations SpiderMonkey, Rhino, KJS, JavaScriptCore, V8
Site web Mozilla
Extension de fichier jsVoir et modifier les données sur Wikidata

JavaScript est un langage de programmation de scripts principalement employé dans les pages web interactives et à ce titre est une partie essentielle des applications web. Avec les langages HTML et CSS, JavaScript est au cœur des langages utilisés par les développeurs web[4]. Une grande majorité des sites web l'utilisent[5], et la majorité des navigateurs web disposent d'un moteur JavaScript[6] pour l'interpréter.

JavaScript est aussi employé pour les serveurs Web[7] avec l'utilisation (par exemple) de Node.js[8] ou de Deno[9].

JavaScript a été créé en 1995 par Brendan Eich et intégré au navigateur web Netscape Navigator 2.0. L'implémentation concurrente de JavaScript par Microsoft dans Internet Explorer jusqu'à sa version 9 se nommait JScript, tandis que celle d'Adobe Systems se nommait ActionScript. JavaScript a été standardisé sous le nom d'ECMAScript en par Ecma International dans le standard ECMA-262. La version en vigueur de ce standard depuis juin 2022 est la 13e édition.

C'est un langage orienté objet à prototype : les bases du langage et ses principales interfaces sont fournies par des objets. Cependant, à la différence d'un langage orienté objets à classes, les objets de base ne sont pas des instances de classes. En outre, les fonctions sont des objets de première classe. Le langage supporte le paradigme objet, impératif et fonctionnel.

JavaScript est le langage possédant le plus large écosystème grâce à son gestionnaire de dépendances npm, avec plus de deux millions de paquets en [10].

Histoire[modifier | modifier le code]

Début[modifier | modifier le code]

Le langage a été créé en dix jours en mai 1995 pour le compte de la Netscape Communications Corporation par Brendan Eich, qui s'est inspiré de nombreux langages, notamment de Java mais en simplifiant la syntaxe pour les débutants[11]. Brendan Eich a initialement développé un langage de script côté serveur, appelé LiveScript, pour renforcer l'offre commerciale de serveur HTTP. Netscape travaille alors au développement d'une version orientée client de LiveScript.

Quelques jours avant sa sortie, Netscape change le nom de LiveScript pour JavaScript. Sun Microsystems et Netscape étaient partenaires, et la machine virtuelle Java de plus en plus populaire. Ce changement de nom servait les intérêts des deux sociétés. Le Netscape et Sun Microsystems annoncent[12] la sortie de JavaScript, décrit comme un complément à Java, dans un communiqué de presse commun. Cette initiative a contribué à créer auprès du public une certaine confusion entre les deux langages, proches syntaxiquement mais pas du tout dans leurs concepts fondamentaux, et qui perdure encore de nos jours.

En , Netscape met en œuvre le moteur JavaScript dans son navigateur web Netscape Navigator 2.0. Le succès de ce navigateur contribue à l'adoption rapide de JavaScript dans le développement web orienté client. Microsoft réagit alors en développant JScript, qu'il inclut ensuite dans Internet Explorer 3.0 en pour la sortie de son navigateur.

« JavaScript » devient une marque déposée par Sun Microsystems aux États-Unis en [13],[14].

Marque déposée[modifier | modifier le code]

"JavaScript" est une marque déposée d'Oracle Corporation aux États-Unis[15],[16]. À l'origine, la marque a été attribuée à Sun Microsystems le 6 mai 1997, puis transférée à Oracle lors de leur acquisition de Sun en 2009[17],[18],[19].

Standardisation[modifier | modifier le code]

Netscape soumet alors JavaScript à Ecma International pour standardisation.

Version 1 : Naissance du standard ECMA-262[modifier | modifier le code]

Les travaux débutent en et se terminent en , donnant naissance à la 1re édition du standard ECMA-262 qui spécifie le langage ECMAScript d'où le fait que le n° ou l'année de la version est souvent précédée par ECMAScript ou en abrégé ES. Le standard est ensuite soumis à l'ISO/CEI et publié en en tant que standard international ISO/CEI 16262.

Version 2 : Homogénéisation avec le standard ISO/CEI 16262[modifier | modifier le code]

Des changements rédactionnels sont apportés au standard ECMA-262 pour le conformer au standard international ISO/CEI 16262, aboutissant à la 2e édition du standard ECMA-262 en .

Version 3 : Améliorations et constitution du langage[modifier | modifier le code]

La 3e édition du standard ECMA-262 introduit :

  • des expressions rationnelles plus puissantes ;
  • une amélioration de la manipulation des chaînes de caractères ;
  • de nouvelles instructions de contrôle ;
  • une gestion des exceptions avec les instructions try/catch ;
  • le formatage des nombres.

Elle est publiée par Ecma International en puis soumise à l'ISO/CEI qui publie le standard international ISO/CEI 16262:2002 en . Après la publication de la 3e édition s'ensuit une adoption massive par tous les navigateurs Web.

Version 4 : L'étape inachevée[modifier | modifier le code]

Un travail important est entrepris pour développer la 4e édition du standard ECMA-262, mais il ne sera pas achevé et cette édition ne verra jamais le jour. Cependant une partie du développement effectué sera intégrée à la 6e édition.

Version 5 : Désambiguïsation et nouvelles fonctionnalités[modifier | modifier le code]

La 5e édition du standard ECMA-262 clarifie les ambiguïtés de la 3e édition et introduit les accesseurs, l'introspection, le contrôle des attributs, des fonctions de manipulation de tableaux supplémentaires, le support du format JSON et un mode strict pour la vérification des erreurs. Elle est publiée par Ecma International en puis soumise à l'ISO/CEI qui apporte des corrections mineures et publie le standard international ISO/CEI 16262:2011 en . L'édition 5.1 du standard ECMA-262 reprenant à l'identique le texte du standard international ISO/CEI 16262:2011 est publiée à la même date.

Version 6 (ES6) - ECMAScript 2015 : Amélioration du support et des fonctionnalités[modifier | modifier le code]

Bien que le développement de la 6e édition du standard ECMA-262 ait commencé officiellement en 2009, peu avant la publication de la 5e édition, sa publication en est en réalité l'aboutissement de 15 ans de travail depuis la publication de la 3e édition en 1999. Le but de cette 6e édition est d'apporter un meilleur support pour les applications d'envergure, la création de bibliothèques et l'utilisation d'ECMAScript comme cible de compilation pour d'autres langages. Cette édition introduit notamment les modules, les classes, la portée lexicale au niveau des blocs, les itérateurs et les générateurs, les promesses pour la programmation asynchrone, les patrons de déstructuration, l'optimisation des appels terminaux, de nouvelles structures de données (tableaux associatifs, ensembles, tableaux binaires), le support de caractères Unicode supplémentaires dans les chaînes de caractères et les expressions rationnelles et la possibilité d'étendre les structures de données prédéfinies. À partir de cette version, l'intitulé officiel de la version est ECMAScript 2015 (année de parution)[20].

Version 7 - ECMAScript 2016 : une adaptation permanente aux outils du web[modifier | modifier le code]

La 7e édition du standard ECMA-262 est la première édition issue du nouveau processus de développement ouvert et du rythme de publication annuel adoptés par le comité Ecma TC39. Un document au format texte est créé à partir de la 6e édition et est mis en ligne sur GitHub comme base de développement pour cette nouvelle édition. Après la correction de milliers de bugs et d'erreurs rédactionnelles ainsi que l'introduction de l'opérateur d'exponentiation et d'une nouvelle méthode pour les prototypes de tableaux, la 7e édition est publiée en .

Version 8 (ES8) - ECMAScript 2017: Asynchronicité[modifier | modifier le code]

L'apport majeur concerne les fonctions asynchrones.

On retrouve également :

  • Le partage de mémoire entre différents fil d'exécution et workers (Shared memory and atomics)
  • Les fonctions Object.values() et Object.entries() qui permettent de faciliter la manipulation des objets.

L'édition actuelle du standard ECMA-262 est la 13e édition publiée en juin 2022[21].

Sécurité[modifier | modifier le code]

JavaScript et la structure DOM des pages HTML/XML ont quelques failles de sécurité. En effet, des scripts malveillants peuvent se cacher dans le code d'une page web et s'exécuter sur l'ordinateur cible de l'utilisateur du Web.

Les fournisseurs de navigateurs web tentent de réduire ce risque avec deux restrictions :

  • l'une est de faire exécuter ces scripts dans un espace à part des autres données (sandbox) dans lequel seules des actions relatives au web (mouvements de souris, affichage de pixel, communications) peuvent être exécutées, sans avoir accès au système de fichier principal ;
  • la deuxième est de n'exécuter les scripts que selon les contraintes de same-origin policy : dans cet esprit, un site Web ne doit pas avoir accès aux informations telles que les noms d'utilisateur et mot de passe ou cookies reçus des autres sites visités.

Les vulnérabilités de JavaScript sont bien souvent des brèches d'au moins l'un de ces deux principes.

Certains sous-ensembles du langage Javascript tels que JavaScript—ADsafe ou Secure ECMAScript (SES) fournissent de plus grands niveaux de sécurité, en particulier pour les scripts créés par des tierces parties (notamment les publicités)[22],[23]. Caja est un autre logiciel pour inclure et isoler de manière sécurisée du JavaScript et du HTML tierce partie.

La Politique de sécurité du contenu est la principale méthode destinée à assurer que seul un script de confiance est exécuté sur une page Web. Meltdown est une vulnérabilité indépendante de Javascript, qui peut notamment être exploitée en Javascript.

Concepts de programmation[modifier | modifier le code]

Le propos de JavaScript est de manipuler de façon simple des objets, au sens informatique, fournis par une application hôte. Par exemple dans un navigateur web, un script écrit en javascript peut être utilisé pour apporter une touche interactive ou dynamique à un applicatif (page ou site web), qui sans cela serait une page statique figée. Le langage Javascript permet par exemple d'écrire des scripts pour afficher ou cacher un paragraphe, une image ou un popup, selon les interactions de l'utilisateur, ou d'informer le serveur du temps passé à lire une page.

Hello world[modifier | modifier le code]

Il est possible dans un script en langage Javascript, d'afficher le texte hello world sur la console de debug de l’application. Ceci peut être utilisé par des développeurs en phase de mise au point[24]. :

window.console.log('Hello world'); window.console.exp(hello world)
// ou
global.console.log('Hello world'); window.console.log(hello world)

Dans une application hôte d'un navigateur, console est une des méthodes de l'objet global window[25]. Dans d'autres applications hôtes comme Node.js, l'objet global est global[26]. Les méthodes de l'objet global étant accessibles sans préfixe, window et global sont facultatifs.

La syntaxe

console.log('Hello world');

aura donc exactement le même résultat en plus d'être compatible sur tous les environnements.

Utilisation[modifier | modifier le code]

Le code JavaScript a besoin d'un objet global pour y rattacher les déclarations (variables et fonctions) avant d'exécuter des instructions. La situation la plus connue est celle de l'objet window obtenu dans le contexte d'une page web. D'autres environnements sont possibles dont celui fourni par Adobe ou l'environnement Node.js (voir plus bas Autres utilisations).

Les principaux domaines d'application de JavaScript sont avant tout la programmation, les activités de programmation de base et tout ce qui est lié à l'informatique.

Dans une page web[modifier | modifier le code]

Du code JavaScript peut être intégré directement au sein des pages web, pour y être exécuté sur le poste client. C'est alors le navigateur web qui prend en charge l'exécution de ces programmes appelés scripts.

Généralement, JavaScript sert à contrôler les données saisies dans des formulaires HTML, ou à interagir avec le document HTML via l'interface Document Object Model, fournie par le navigateur (on parle alors parfois de HTML dynamique ou DHTML). Il est aussi utilisé pour réaliser des applications dynamiques, des transitions, des animations ou manipuler des données réactives, à des fins ergonomiques ou cosmétiques.

JavaScript n'est pas limité à la manipulation de documents HTML et peut aussi servir à manipuler des documents SVG, XUL et autres dialectes XML.

intégration[modifier | modifier le code]

Il existe plusieurs façons d’intégré JavaScript dans du code html:

dans des attributs d’évènements html: <button onclick="alert('clic !')">clic ici</button> Dans ce code html, le JavaScript alert('clic !')sera exécuter quand le bouton sera cliqué. dans des balise <script> <script>//ici on peut mettre du code JavaScript</script> dans des fichiers externes : <script src="chemin/ver/mon/fichier.js"></script>

Incompatibilité[modifier | modifier le code]

Netscape et Microsoft (avec JScript dans Internet Explorer jusqu'à la version 9) ont développé leur propre variante de ce langage qui chacune supporte presque intégralement la norme ECMAScript mais possède des fonctionnalités supplémentaires et incompatibles, rarement utilisées dans le cadre de la programmation de pages web. Pourtant les scripts JavaScript sont souvent la source de difficultés. Elles sont plus souvent dues à la prise en charge des différentes versions des modèles d'objets (DOM) fournis par les navigateurs, qu'à des problèmes de portabilité du langage (les différentes mises en œuvre respectant relativement bien la norme ECMAScript).

Pour vérifier dynamiquement si un objet (dans la version JavaScript utilisée lors de l'interprétation) possède bien une méthode, on utilise souvent une construction du type :

if (monObjet.methode && typeof monObjet.methode === 'function') {
  monObjet.methode();
}

On vérifie ainsi que monObjet a bien une mise en œuvre de methode que l'on peut alors utiliser. Le plus souvent, si un navigateur ne gère pas la methode de monObjet, il gère une méthode comparable methode2, et on peut alors adapter le code JavaScript au navigateur qui l'exécute :

if (typeof monObjet.methode === 'function') {
  monObjet.methode();
} else if (typeof monObjet.methode2 === 'function') {
  monObjet.methode2();
}

Une autre méthode consiste à vérifier, côté serveur, le navigateur utilisé par le client et d'envoyer le code correspondant. Cela n'est toutefois pas recommandable, car il est largement préférable de tester directement l'existence, le comportement d'une fonction, d'une propriété, etc. plutôt que de faire des présomptions basées sur la détection du navigateur.

Ajax[modifier | modifier le code]

Ajax (de l'anglais