JavaScript, le langage que nous aimons (ou aimons détester), est rempli de comportements et de bizarreries uniques qui le rendent à la fois puissant et déroutant. Bien que ces « parties étranges » puissent dérouter les débutants, les maîtriser est essentiel pour devenir un développeur compétent. Plongeons dans quelques bizarreries JavaScript fascinantes que tout développeur devrait connaître.
JavaScript essaie d'être utile en convertissant les valeurs entre types, mais cette « utilité » peut conduire à des résultats surprenants.
Exemple : Mathématiques inattendues
console.log('5' - 3); // 2 console.log('5' + 3); // '53'
Le comportement de ceci en JavaScript est souvent déroutant car il change en fonction de comment une fonction est appelée.
Exemple : Différents contextes
function showThis() { console.log(this); } showThis(); // Window or undefined in strict mode const obj = { method: showThis }; obj.method(); // obj const boundFunc = showThis.bind(obj); boundFunc(); // obj
JavaScript est monothread mais peut gérer des tâches asynchrones via la boucle d'événements.
Exemple : Qu'est-ce qui s'exécute en premier ?
console.log('Start'); setTimeout(() => console.log('Timeout'), 0); Promise.resolve().then(() => console.log('Promise')); console.log('End');
Sortie
Start End Promise Timeout
Comprendre la boucle d'événements est essentiel pour écrire du code asynchrone performant.
Une fermeture se produit lorsqu'une fonction "se souvient" de sa portée lexicale même après le retour de la fonction externe.
Exemple : Variables privées
function counter() { let count = 0; return function () { count++; console.log(count); }; } const increment = counter(); increment(); // 1 increment(); // 2
Les fermetures vous permettent de créer des variables privées et de maintenir l'état lors des appels de fonction.
JavaScript utilise l'héritage basé sur des prototypes, ce qui signifie que les objets peuvent hériter des propriétés et des méthodes d'autres objets.
Exemple : méthodes personnalisées
console.log('5' - 3); // 2 console.log('5' + 3); // '53'
Les prototypes vous permettent de partager efficacement des méthodes entre instances.
JavaScript fournit à la fois une égalité lâche (==) et une égalité stricte (===), et elles se comportent différemment.
Exemple : Le cas étrange de Null et Indéfini
function showThis() { console.log(this); } showThis(); // Window or undefined in strict mode const obj = { method: showThis }; obj.method(); // obj const boundFunc = showThis.bind(obj); boundFunc(); // obj
Utilisez toujours === sauf si vous avez explicitement besoin d'une conversion de type.
Évitez de comparer directement des valeurs non primitives ({} !== {}).
JavaScript traite les objets et les tableaux comme des types de référence, ce qui signifie que les modifications apportées à une référence affectent l'original.
Exemple : Copier les pièges
console.log('Start'); setTimeout(() => console.log('Timeout'), 0); Promise.resolve().then(() => console.log('Promise')); console.log('End');
NaN signifie « Pas un nombre », mais son comportement est tout sauf simple.
Exemple : Comparaison de NaN
Start End Promise Timeout
Utilisez Object.is lorsque vous avez besoin d'une équivalence stricte pour des cas particuliers comme NaN.
Le levage déplace les déclarations de variables et de fonctions vers le haut de leur portée.
Exemple : Variables de levage
function counter() { let count = 0; return function () { count++; console.log(count); }; } const increment = counter(); increment(); // 1 increment(); // 2
Utilisez let et const pour éviter toute confusion lors du levage de variables.
Les paramètres par défaut rendent les fonctions plus flexibles mais peuvent se comporter étrangement lorsqu'ils sont combinés avec undéfini.
Exemple : valeurs par défaut et arguments
function Person(name) { this.name = name; } Person.prototype.greet = function () { console.log(`Hello, my name is ${this.name}`); }; const alice = new Person('Alice'); alice.greet(); // Hello, my name is Alice
Les paramètres par défaut ne sont appliqués que si l'argument est indéfini et non nul.
Les bizarreries de JavaScript le rendent à la fois frustrant et amusant. Comprendre ces comportements fera non seulement de vous un meilleur développeur, mais vous aidera également à apprécier la flexibilité et les choix de conception du langage.
Lesquelles de ces bizarreries avez-vous rencontrées et comment les avez-vous résolues ? Partagez vos réflexions dans les commentaires ci-dessous !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!