Maison > Article > interface Web > Un résumé des trucs et astuces pour éviter les pièges courants en JavaScript
1. Avez-vous essayé de trier les éléments du tableau ?
JavaScript utilise l'ordre alphanumérique par défaut. Par conséquent, le résultat de [1,2,5,10].sort() est [1, 10, 2, 5].
Si vous souhaitez trier correctement, vous devez faire ceci : [1,2,5,10].sort((a, b) => a - b)
2. new Date() est très simple à utiliser
new Date() peut recevoir :
- ne reçoit aucun paramètre : renvoie l'heure actuelle
- Reçoit un paramètre `x` : Renvoie la valeur du 1er janvier 1970 + `x` millisecondes.
- `new Date(1, 1, 1)` renvoie le 1er février 1901.
- Cependant...., `new Date(2016, 1, 1)` n'ajoute pas 2016 à 1900, mais représente uniquement 2016.
3. La fonction de remplacement ne remplace pas vraiment ?
let s = "bob" const replaced = s.replace('b', 'l') replaced === "lob" // 只会替换掉第一个b s === "bob" // 并且s的值不会变
Si vous souhaitez remplacer tous les b, utilisez des expressions régulières :
"bob".replace(/b/g, 'l') === 'lol'
4 Soyez prudent avec les opérations de comparaison
// 这些可以 'abc' === 'abc' // true 1 === 1 // true // 然而这些不行 [1,2,3] === [1,2,3] // false {a: 1} === {a: 1} // false {} === {} // false
car [ 1, 2,3] et [1,2,3] sont deux tableaux différents, ils ont simplement les mêmes éléments. Par conséquent, il ne peut pas être jugé simplement par `===`.
5. Le tableau n'est pas un type de base
typeof {} === 'object' // true typeof 'a' === 'string' // true typeof 1 === number // true // 但是.... typeof [] === 'object' // true
Si vous souhaitez déterminer si une variable `var` est un tableau, vous devez utiliser `Array.isArray(var)`
.
6. Clôture
Il s'agit d'une question d'entretien JavaScript classique :
const Greeters = [] for (var i = 0 ; i < 10 ; i++) { Greeters.push(function () { return console.log(i) }) } Greeters[0]() // 10 Greeters[1]() // 10 Greeters[2]() // 10
Bien que le résultat attendu soit 0,1,2,..., Mais en réalité, ce n’est pas le cas. Savez-vous comment déboguer ?
Il existe deux manières :
- Utilisez `let` au lieu de `var`.
- Utilisez la fonction `bind`.
Greeters.push(console.log.bind(null, i))
Bien sûr, il existe de nombreuses solutions. Ces deux-là sont mes préférés !
7. À propos de bind
Que produira le code suivant ?
class Foo { constructor (name) { this.name = name } greet () { console.log('hello, this is ', this.name) } someThingAsync () { return Promise.resolve() } asyncGreet () { this.someThingAsync() .then(this.greet) } } new Foo('dog').asyncGreet()
Si vous dites que le programme va planter et signaler une erreur : Cannot read property 'name' of undefined
.
Parce que le `geet` à la ligne 16 n'est pas exécuté dans le bon environnement. Bien sûr, il existe de nombreuses façons de résoudre ce BUG !
- Préférez utiliser la fonction `bind` pour résoudre le problème :
asyncGreet () { this.someThingAsync() .then(this.greet.bind(this)) }
Cela garantira que `greet` sera appelé depuis l'instance Foo, plutôt que depuis la fonction locale ` ceci.
- Si vous voulez que `greet` ne soit jamais lié à la mauvaise portée, vous pouvez utiliser `bind` à l'intérieur du constructeur.
class Foo { constructor (name) { this.name = name this.greet = this.greet.bind(this) } }
- Vous pouvez également utiliser les fonctions fléchées (=>) pour empêcher la modification de la portée.
asyncGreet () { this.someThingAsync() .then(() => { this.greet() }) }
8. Math.min() est plus grand que Math.max()
Math.min() < Math.max() // false
car Math.min()
renvoie Infinity et Math.max()
renvoie -Infinity.
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!