Maison > interface Web > js tutoriel > Décoder les parties étranges de JavaScript que tout développeur devrait connaître

Décoder les parties étranges de JavaScript que tout développeur devrait connaître

Barbara Streisand
Libérer: 2025-01-03 02:06:38
original
467 Les gens l'ont consulté

Decoding the Weird Parts of JavaScript Every Developer Should Know

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.


1. Coercition : le magicien secret de JavaScript

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'
Copier après la connexion
Copier après la connexion
  • Soustraction : JavaScript convertit « 5 » en nombre avant de soustraire.
  • Ajout : Lorsqu'une chaîne est impliquée, JavaScript concatène au lieu d'ajouter.

Pourquoi c'est important

  • Cette conversion implicite (type coercition) peut introduire des bugs si vous n'y faites pas attention.
  • Utilisez toujours des conversions explicites avec Number(), String() ou Boolean() pour éviter les surprises.

2. Le mystère de ceci

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
Copier après la connexion
Copier après la connexion

Pourquoi c'est important

  • celui-ci n'est pas fixé au moment de la déclaration ; cela dépend du site d'appel.
  • Les fonctions fléchées n'ont pas leur propre ceci, ce qui les rend parfaites pour préserver le contexte lexical.

3. La boucle d'événements : le JavaScript asynchrone démystifié

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');
Copier après la connexion
Copier après la connexion

Sortie

Start
End
Promise
Timeout
Copier après la connexion
Copier après la connexion
  • Le code synchrone s'exécute en premier.
  • Les promesses (microtâches) ont la priorité sur setTimeout (macrotâches).

Pourquoi c'est important

Comprendre la boucle d'événements est essentiel pour écrire du code asynchrone performant.


4. Clôture : la fonction qui se souvient

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
Copier après la connexion
Copier après la connexion

Pourquoi c'est important

Les fermetures vous permettent de créer des variables privées et de maintenir l'état lors des appels de fonction.


5. Prototypes : l'épine dorsale de JavaScript

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'
Copier après la connexion
Copier après la connexion

Pourquoi c'est important

Les prototypes vous permettent de partager efficacement des méthodes entre instances.


6. Contrôles d'égalité : == vs ===

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
Copier après la connexion
Copier après la connexion
  • == effectue une conversion de type, donc null est vaguement égal à undefined.
  • === vérifie l'égalité des types et des valeurs.

Pourquoi c'est important

Utilisez toujours === sauf si vous avez explicitement besoin d'une conversion de type.
Évitez de comparer directement des valeurs non primitives ({} !== {}).


7. Immuabilité et types de référence

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');
Copier après la connexion
Copier après la connexion

Pourquoi c'est important

  • Utilisez Object.assign() ou l'opérateur de propagation ({ ...original }) pour créer des copies superficielles.
  • Pour les copies complètes, pensez à des bibliothèques comme Lodash ou structuréClone.

8. NaN : pas aussi simple qu’il y paraît

NaN signifie « Pas un nombre », mais son comportement est tout sauf simple.

Exemple : Comparaison de NaN

Start
End
Promise
Timeout
Copier après la connexion
Copier après la connexion

Pourquoi c'est important

Utilisez Object.is lorsque vous avez besoin d'une équivalence stricte pour des cas particuliers comme NaN.


9. Levage : qu’est-ce qui est déclaré en premier ?

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
Copier après la connexion
Copier après la connexion
  • Les déclarations var sont levées mais initialisées comme non définies.
  • Les déclarations de fonctions sont entièrement levées.

Pourquoi c'est important

Utilisez let et const pour éviter toute confusion lors du levage de variables.


10. Paramètres par défaut étranges : paramètres par défaut

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
Copier après la connexion

Pourquoi c'est important

Les paramètres par défaut ne sont appliqués que si l'argument est indéfini et non nul.


Conclusion : acceptez l'étrangeté

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal